Dockerコマンドリファレンス - よく使うコマンドとDockerfileの書き方

Dockerの実務でよく使うコマンドをまとめたリファレンス。コンテナ・イメージ管理からDockerfile、Docker Composeまで掲載している。

基本概念

用語説明
イメージコンテナの設計図(読み取り専用)
コンテナイメージから作成された実行中のプロセス
Dockerfileイメージをビルドするための手順書
レジストリイメージの保管場所(Docker Hub、ECRなど)
ボリュームコンテナ外に永続化するデータ領域
ネットワークコンテナ間の通信設定

イメージ操作

# イメージの取得
docker pull nginx                    # 最新版
docker pull nginx:1.25               # バージョン指定
docker pull nginx:1.25-alpine        # Alpine Linuxベース(軽量)

# イメージ一覧
docker images
docker image ls

# イメージのビルド
docker build -t myapp:latest .       # カレントディレクトリのDockerfileでビルド
docker build -t myapp:1.0 -f Dockerfile.prod .  # Dockerfileを指定

# イメージの削除
docker rmi myapp:latest
docker image rm nginx:1.25
docker image prune                   # 未使用イメージを一括削除
docker image prune -a                # タグのないイメージも含めて削除

# イメージの詳細
docker inspect myapp:latest

# イメージをレジストリにプッシュ
docker tag myapp:latest user/myapp:latest
docker push user/myapp:latest

コンテナ操作

# コンテナの起動
docker run nginx                             # フォアグラウンドで起動
docker run -d nginx                          # バックグラウンドで起動
docker run -d --name my-nginx nginx          # 名前を付けて起動
docker run -d -p 8080:80 nginx               # ポートマッピング(ホスト:コンテナ)
docker run -d -p 8080:80 -p 443:443 nginx    # 複数ポート
docker run --rm nginx echo "hello"           # 実行後にコンテナを自動削除

# 環境変数
docker run -d -e NODE_ENV=production myapp
docker run -d --env-file .env myapp

# ボリュームマウント
docker run -d -v /host/path:/container/path nginx          # バインドマウント
docker run -d -v myvolume:/data nginx                      # 名前付きボリューム
docker run -d -v $(pwd):/app node:20 node server.js        # カレントディレクトリをマウント

# コンテナ一覧
docker ps                            # 起動中のコンテナ
docker ps -a                         # 全コンテナ(停止中含む)

# コンテナの停止・削除
docker stop my-nginx                 # グレースフルに停止(SIGTERM)
docker kill my-nginx                 # 強制停止(SIGKILL)
docker rm my-nginx                   # コンテナを削除(停止後)
docker rm -f my-nginx                # 強制停止して削除

# 一括削除
docker container prune               # 停止中コンテナを全削除

# コンテナへの接続
docker exec -it my-nginx bash        # bashで接続
docker exec -it my-nginx sh          # shで接続(Alpineなど)
docker exec my-nginx ls /etc/nginx   # コマンド実行のみ

# ログ確認
docker logs my-nginx
docker logs -f my-nginx              # フォロー(リアルタイム)
docker logs --tail 100 my-nginx      # 最新100行
docker logs --since 10m my-nginx     # 直近10分

# コンテナの詳細情報
docker inspect my-nginx
docker stats                         # リソース使用状況(リアルタイム)
docker stats --no-stream             # 一度だけ表示

ボリューム操作

docker volume create myvolume        # ボリューム作成
docker volume ls                     # ボリューム一覧
docker volume inspect myvolume       # 詳細情報
docker volume rm myvolume            # 削除
docker volume prune                  # 未使用ボリュームを一括削除

ネットワーク操作

docker network create mynetwork      # ネットワーク作成
docker network ls                    # ネットワーク一覧
docker network inspect mynetwork     # 詳細情報
docker network rm mynetwork          # 削除

# コンテナをネットワークに接続
docker run -d --network mynetwork --name app myapp
docker network connect mynetwork my-nginx  # 起動中コンテナを接続
docker network disconnect mynetwork my-nginx

同じネットワーク内のコンテナはコンテナ名でアクセスできる(例: http://app:3000)。

Dockerfile の書き方

基本構文

# ベースイメージ
FROM node:20-alpine

# 作業ディレクトリ
WORKDIR /app

# ファイルのコピー(キャッシュ効率化のため依存関係を先にコピー)
COPY package*.json ./

# パッケージのインストール
RUN npm ci --only=production

# アプリケーションコードをコピー
COPY . .

# 環境変数(デフォルト値)
ENV NODE_ENV=production PORT=3000

# ポートの公開(ドキュメント目的。実際のポートマッピングはdocker runで行う)
EXPOSE 3000

# 非rootユーザーで実行
USER node

# 起動コマンド
CMD ["node", "server.js"]

よく使う命令

命令説明
FROMベースイメージを指定
WORKDIR作業ディレクトリを設定(存在しなければ作成)
COPYホストからコンテナにファイルをコピー
ADDCOPYに加えてtarの展開・URL取得が可能(基本はCOPYを使う)
RUNイメージビルド時にコマンドを実行(レイヤーを作成)
CMDコンテナ起動時のデフォルトコマンド(上書き可能)
ENTRYPOINTコンテナ起動時の固定コマンド(上書き不可)
ENV環境変数を設定
ARGビルド時の引数(--build-arg で渡す)
EXPOSE使用ポートのドキュメント
VOLUMEマウントポイントの指定
USER実行ユーザーを変更
LABELメタデータを付与

マルチステージビルド

ビルド用と実行用のイメージを分けることで、最終イメージを軽量にする。

# ビルドステージ
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 実行ステージ(ビルド成果物のみコピー)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
USER node
CMD ["node", "dist/server.js"]

.dockerignore

ビルドコンテキストから除外するファイルを指定する。.gitignore と同様の構文。

node_modules
.git
.env
*.log
dist
coverage
.DS_Store

Docker Compose

複数コンテナの構成を compose.yaml(または docker-compose.yml)で管理する。

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://postgres:password@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./logs:/app/logs

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Docker Compose コマンド

docker compose up                    # 起動(フォアグラウンド)
docker compose up -d                 # バックグラウンドで起動
docker compose up --build            # イメージをビルドしてから起動
docker compose down                  # 停止・コンテナ削除
docker compose down -v               # ボリュームも削除
docker compose ps                    # サービス一覧
docker compose logs                  # 全サービスのログ
docker compose logs -f app           # 特定サービスのログをフォロー
docker compose exec app bash         # サービスのコンテナに接続
docker compose run --rm app npm test # 一時コンテナでコマンド実行
docker compose restart app           # サービスを再起動

よく使うパターン

開発環境でホットリロード

services:
  app:
    build:
      context: .
      target: development     # マルチステージのdevステージ
    volumes:
      - .:/app                # ソースコードをマウント
      - /app/node_modules     # node_modules はコンテナ側を使う
    command: npm run dev

環境変数ファイルの分離

services:
  app:
    env_file:
      - .env                  # 共通設定
      - .env.local            # ローカル上書き

リソース制限

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

全てクリーンアップ

# 停止中コンテナ・未使用イメージ・ネットワーク・キャッシュを削除
docker system prune

# ボリュームも含めて全削除(データが失われるため注意)
docker system prune -a --volumes

参考リンク