How to use Docker?

Dockerの使い方ガイド

概要

Docker (ドッカー)

  • コンテナ仮想化技術を利用したオープンプラットフォーム
  • アプリケーションの開発、デプロイ、実行を効率化出来る
メリット
  • 仮想環境であるため、隔離されており、実機に影響を及ぼしにくい
  • VMよりも軽量
  • 起動や動作が速い
  • 開発環境の共有や移行が容易

Dockerのインストール

Windows


Download

Linux

ターミナル
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce containerd.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin
sudo systemctl enable docker
sudo systemctl restart docker
sudo docker run hello-world # 確認
sudo usermod -aG docker $USER
newgrp docker

Dockerで利用するファイル

ファイル 内容
compose.yml
docker-compose.yml
複数コンテナの一括定義・連携
Dockerfile
  • ベースイメージの指定
  • ポート指定 (情報提供のみで、実際のポートマッピングはdocker-compose.ymlで行う)
  • 必要なソフトウェアのインストール
  • 起動時に実行するコマンド等を指定

基本コマンド

コマンド 説明
docker compose up --build -d
Dockerfileに基づいてサービス用のDockerイメージを更新し、
バックグラウンドで全てのサービスを起動
docker compose up -d
バックグラウンドで全てのサービスを起動
docker compose up
全てのサービスをフォアグラウンドで起動し、ログを表示
docker compose build
Dockerfileに基づいてサービス用のDockerイメージをビルド
docker compose exec [サービス名] [コマンド]
既に実行中のコンテナ内で、新しいコマンドを実行する
docker compose run [サービス名] [コマンド]
一度限りのコマンドを実行
docker compose down
完全にコンテナを終了させる
docker compose stop
コンテナをサスペンドする
docker compose logs [サービス名]
ログの確認
-n [行数] : 最後の[行数]表示
-f : 追従
docker compose logs -n 10 -f [サービス名]
最後の10行表示した後、ログを追従する
docker compose logs -f [サービス名] | grep --line-buffered "[検索する言葉]"
ログを追従しながらリアルタイムで[検索する言葉]を含む行を表示する
docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" [compose.yml内に書かれた container_name の値]
コンテナのIPアドレスを確認
docker system prune -a
不要になったイメージを削除

サンプル

.env
# compose.yml内で利用する環境変数の設定
COMPOSE_PROJECT_NAME=project1           # プロジェクト名(全て小文字)
CONTAINER_NAME=Docker_Linux

Dockerfile_DIR=.
Dockerfile=Dockerfile

VOLUME=./linux_data

TIME_ZONE=Asia/Tokyo
LANG=ja_JP.UTF8

NETWORK_NAME=ethd
IP_SUBNET_ADDR=192.168.10.0
IP_PREFIX=24
IP_GATEWAY_ADDR=192.168.10.1

PORT=3000

USER_NAME=PEN
PASSWORD=password

ENTRY_DIR=Programs
ENTRY_POINT=start.sh

WS=WS

compose.yml
# ==========================================
# compose.yml
#
# | 項目 | 内容 | 備考 |
# | --- | --- | --- |
# | name | プロジェクト名 | 全て小文字 |
# | services | 作成したいサービスを列挙 | YAMLはスペース2つ |
# | linux / db | 作成するサービスの名前 | docker composeで管理する際に必要 |
#
# ==========================================

# name: project1

services:
  linux:
    # ==========================================
    # linuxサービスの設定項目
    #
    # | 項目 | 内容 | 備考 |
    # | --- | --- | --- |
    # | container_name | コンテナ名 | 外部から見た時の名前 |
    # | hostname | ホスト名 | - |
    # | build | Dockerfileの設定 | - |
    # | image | 使用するコンテナイメージ | Dockerfileが無い場合指定 |
    # | volumes | マウントするフォルダ設定(データを永続化) | ホストディレクトリ: コンテナ内ディレクトリ |
    # | restart | コンテナの起動設定 | no unless-stopped always ... |
    # | environment | コンテナ内の環境変数を設定 | Python の `os.environ.get` 等でも取得可能 |
    # | ports | 外部からアクセス可能なポートを設定 | ホストマシンのポート番号:コンテナのポート番号 |
    # | depends_on | サービス間の依存関係を定義 | - |
    # | command | サービスが起動したときに実行するコマンド | - |
    # 
    # IPアドレスの確認 : docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" [${container_name}の値]
    #
    # ==========================================
    env_file: .env
    
    container_name: ${CONTAINER_NAME}

    hostname: ${CONTAINER_NAME}

    build: 
      # ==========================================
      # Dockerfileの設定項目
      #
      # | 項目 | 内容 |
      # | --- | --- |
      # | context/dockerfile | Dockerfileへの相対パス |
      # | args | Dockerfile内の環境変数を設定 |
      #
      # ==========================================

      context: ${Dockerfile_DIR}
      dockerfile: ${Dockerfile}
      args:
        WS:           ${WS}
        USER_NAME:    ${USER_NAME}
        PASSWORD:     ${PASSWORD}
        ENTRY_DIR:    ${ENTRY_DIR}
        ENTRY_POINT:  ${ENTRY_POINT}
        LANG:         ${LANG}
    
    # image: ubuntu:25.10

    volumes:
      - ${VOLUME}:/home/${USER_NAME}/${WS}

    restart: no

    environment:
      - TZ=${TIME_ZONE}
      - LANG=${LANG}
    
    ports:
      - "${PORT}:3000"
    
    # depends_on:
      # ==========================================
      # サービス間 依存関係の設定項目
      #
      # | 項目 | 内容 | 備考 |
      # | --- | --- | --- |
      # | db | 依存サービス名 | dbサービス参照 |
      #
      # ==========================================
      # - db                                # 先にdbサービスが動いていることを確認する

    command:
      - /home/${USER_NAME}/${ENTRY_DIR}/${ENTRY_POINT}
    
    networks:
      - docker_eth

networks:
  default:
    external: true
    name: bridge

  docker_eth:
    name: ${NETWORK_NAME}
    driver: bridge
    ipam:
      driver: default
      config:                               # 物理ネットワークに直接接続したい場合は実環境に合わせる
        - subnet: ${IP_SUBNET_ADDR}/${IP_PREFIX}
          gateway: ${IP_GATEWAY_ADDR}

Dockerfile
# FROM [イメージ] [タグ]
# Docker Hub (https://hub.docker.com/) 参照
FROM ubuntu:25.10

# 環境変数を docker-compose.yml から受け取る
ARG WS
ARG USER_NAME
ARG PASSWORD
ARG ENTRY_DIR
ARG ENTRY_POINT
ARG LANG

# 環境変数を設定
# 1000以上推奨
ENV USER_ID=1001
ENV GROUP_ID=1001

# RUN 命令はなるべく1つにまとめる
# コマンドが長くなる場合は \ で改行すること
RUN apt update && \
    apt upgrade -y && \
    apt install -y \
    sudo nano iproute2 iputils-ping language-pack-ja && \
    useradd -m -s /bin/bash -u ${USER_ID} ${USER_NAME} && \
    usermod -aG sudo ${USER_NAME} && \
    echo "root:${PASSWORD}" | chpasswd && \
    echo "${USER_NAME}:${PASSWORD}" | chpasswd && \
    mkdir -p /home/${USER_NAME}/${ENTRY_DIR} && \
    update-locale LANG=${LANG}

COPY ${ENTRY_POINT} /home/${USER_NAME}/${ENTRY_DIR}/${ENTRY_POINT}
RUN chmod +x /home/${USER_NAME}/${ENTRY_DIR}/${ENTRY_POINT}

USER ${USER_NAME}
WORKDIR /home/${USER_NAME}/${WS}

# 起動したら実行するコマンド
# 環境変数は使えないので注意
# ENTRYPOINT ["/Programs/start.sh"] 

# 起動したら実行するコマンド
# CMD ["/bin/bash", "-c", "while true; do sleep 1000; done"]
# 無限ループでbashを起動し続ける

start.sh
#!/usr/bin/env bash
while true; do
    sleep 1000 
done