Docker + Docker Compose 完全リファレンス — 60+ コマンドを 8 カテゴリで

コンテナ案件では Docker は前提知識。AWS 案件でも ECR / ECS / EKS / Lambda コンテナイメージ等で必須です。 開発時の Compose 操作と、本番の image ビルド / push を中心に整理します。

目次

  1. image ビルドと管理
  2. コンテナ起動・操作
  3. ログ・状態確認
  4. ネットワーク
  5. ボリューム
  6. ECR push / pull
  7. docker compose
  8. クリーンアップ・トラブル対応
  9. レシピ集
  10. 用語集

1. image ビルドと管理

docker build -t myapp:latest .
docker build -t myapp:1.0 -f Dockerfile.prod .
docker build --no-cache -t myapp .
docker build --build-arg VERSION=1.2.3 -t myapp:1.2.3 .
docker build --target builder -t myapp:builder .             # multi-stage の特定 stage
docker build --platform linux/amd64,linux/arm64 -t myapp .   # マルチアーキ(buildx)

# image 一覧
docker images
docker images -a                                              # 中間 image 含む
docker images --filter 'dangling=true'                        # tag なし image

# tag / push
docker tag myapp:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:1.0
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:1.0

# pull
docker pull nginx:1.27-alpine
docker pull amazon/aws-cli

# image 削除
docker rmi myapp:latest
docker rmi $(docker images -q --filter dangling=true)         # 中間 image 一括

# image 詳細
docker inspect nginx:1.27-alpine
docker history nginx:1.27-alpine                              # レイヤごとのコマンド・サイズ

2. コンテナ起動・操作

# 起動
docker run nginx                                              # foreground
docker run -d nginx                                            # detached
docker run -d --name web -p 8080:80 nginx                      # ポートマッピング
docker run -d -e KEY=value -e DB_URL=... myapp                 # 環境変数
docker run --env-file .env -d myapp                            # ファイルから
docker run -d -v $(pwd):/app -w /app node:22 npm test          # ボリューム + 作業ディレクトリ
docker run --rm -it ubuntu bash                                # 1 回限り(終了で削除)+ 対話
docker run --network host nginx                                # ホストネットワーク
docker run --restart unless-stopped -d nginx                   # 再起動ポリシー
docker run --memory 512m --cpus 1.0 myapp                      # リソース制限
docker run --user 1000:1000 myapp                              # 非 root で実行
docker run --read-only --tmpfs /tmp myapp                      # ルート FS 読み取り専用 + 書き込み /tmp 限定

# プロセス管理
docker ps                                                       # 起動中
docker ps -a                                                    # 全コンテナ
docker ps --filter 'status=exited'
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

docker start web / docker stop web / docker restart web
docker pause web / docker unpause web
docker kill web                                                 # SIGKILL
docker rm web                                                   # 削除(停止後)
docker rm -f web                                                # 強制削除

# 中で操作
docker exec -it web bash
docker exec web ls /etc/nginx
docker exec -u root web apt-get update

# ファイル コピー
docker cp ./local.txt web:/app/
docker cp web:/var/log/nginx/access.log ./

3. ログ・状態確認

docker logs web
docker logs -f web                                              # tail -f
docker logs --tail 100 web
docker logs --since 10m web
docker logs --until 5m web

# CPU / メモリ使用量
docker stats                                                     # リアルタイム全コンテナ
docker stats web                                                 # 1 つだけ
docker stats --no-stream                                         # 1 回スナップショット

# プロセス
docker top web
docker inspect web                                               # 設定全部 (JSON)
docker inspect web --format '{{.NetworkSettings.IPAddress}}'
docker inspect web --format '{{json .State.Health}}' | jq

# イベント追跡
docker events
docker events --filter 'event=die'

4. ネットワーク

docker network ls
docker network create mynet
docker network create --subnet 172.20.0.0/16 mynet
docker network inspect mynet
docker network connect mynet web                                 # 既存コンテナを別 NW に
docker network disconnect mynet web
docker network rm mynet
docker network prune                                              # 未使用削除

# 起動時に NW 指定
docker run -d --network mynet --name app1 myapp
docker run -d --network mynet --name app2 myapp
# app1 → http://app2:8080 で名前解決できる(Compose 同様)

5. ボリューム

docker volume ls
docker volume create mydata
docker volume inspect mydata
docker volume rm mydata
docker volume prune

# 名前付きボリューム
docker run -d -v mydata:/var/lib/postgresql/data postgres:16

# bind mount(ホストパスを直接マウント)
docker run -d -v $(pwd)/data:/data myapp
docker run -d --mount type=bind,source=$(pwd),target=/app myapp

# tmpfs(メモリ FS)
docker run -d --tmpfs /tmp myapp

6. ECR push / pull

# ECR ログイン(CLI v2)
aws ecr get-login-password --region ap-northeast-1 \
  | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

# Repository 作成(CLI 側)
aws ecr create-repository --repository-name myapp \
  --image-scanning-configuration scanOnPush=true

# tag + push
docker tag myapp:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:1.0
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:1.0

# pull
docker pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:1.0

# image 一覧 (ECR)
aws ecr list-images --repository-name myapp
aws ecr describe-images --repository-name myapp \
  --query 'sort_by(imageDetails, &imagePushedAt)[-5:].[imageTags[0],imageSizeInBytes,imagePushedAt]' \
  --output table

# 古い image を削除(lifecycle policy 推奨)
aws ecr put-lifecycle-policy --repository-name myapp \
  --lifecycle-policy-text file://lifecycle.json

7. docker compose

# 起動
docker compose up                                                # foreground
docker compose up -d                                              # detached
docker compose up -d --build                                      # 再ビルドして起動
docker compose up -d --force-recreate                             # コンテナ作り直し
docker compose up -d --scale web=3                                # スケール

# 停止 / 削除
docker compose down                                               # コンテナ + NW 削除
docker compose down -v                                            # ボリュームも削除
docker compose down --rmi all                                     # image も削除

# 操作
docker compose ps
docker compose logs -f
docker compose logs -f web                                        # 特定サービスのみ
docker compose exec web bash
docker compose run --rm web npm test                              # 1 回限り
docker compose stop web / start web / restart web

# ビルド
docker compose build
docker compose build --no-cache web

# 設定確認・検証
docker compose config                                             # 統合した最終 YAML
docker compose config --services
docker compose images

# 環境ファイル指定
docker compose --env-file .env.prod up -d
docker compose -f compose.yaml -f compose.override.yaml up -d

compose.yaml サンプル

services:
  web:
    build: ./web
    image: myapp:dev
    ports: ["8080:80"]
    environment:
      - DB_URL=postgresql://db:5432/app
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped
  db:
    image: postgres:16
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - dbdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 5s
      retries: 10

volumes:
  dbdata:

8. クリーンアップ・トラブル対応

# 不要リソース削除
docker system prune                                              # 停止コンテナ + 中間 image + 未使用 NW
docker system prune -a                                           # 全未使用 image も
docker system prune -a --volumes                                 # ボリュームも(破壊的)
docker system df                                                 # 使用容量

# image 個別削除
docker image prune                                                # dangling のみ
docker image prune -a                                             # 未使用全部

# コンテナ全削除
docker rm $(docker ps -aq)
docker rm -f $(docker ps -aq)

# トラブル時
docker logs --tail 200 web
docker inspect web --format '{{json .State}}' | jq
docker exec web ps aux
docker run --rm -it busybox sh                                    # 別の軽量コンテナで NW 確認
docker run --rm --network container:web busybox netstat -tlnp     # 同 NW 名前空間で確認

# DNS 確認
docker exec web getent hosts db
docker exec web nslookup db

レシピ集

レシピ 1 — Dockerfile マルチステージビルド

# Dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

# image サイズが激減(builder 層を捨てる)

レシピ 2 — ホストの Docker socket 経由で Docker を操作

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock docker:cli ps
# 注: socket をマウント = root 権限相当。信頼できないコンテナでは絶対禁止

レシピ 3 — 中の状態を全部覗く

docker exec -it web bash
# 入った後:
ps aux            # プロセス
ss -tlnp          # listen ポート
env               # 環境変数
df -h /           # ディスク使用

レシピ 4 — 巨大 image をスリム化

# dive ツールでレイヤ分析
dive myapp:latest

# あるいは docker history
docker history myapp:latest

# 改善: alpine ベース、multi-stage、.dockerignore で不要ファイル除外

レシピ 5 — Compose で DB を初期化して立ち上げ

services:
  db:
    image: postgres:16
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports: ["5432:5432"]

コマンド早見表

# build / push
docker build -t name:tag .
docker tag name:tag REGISTRY/name:tag
docker push REGISTRY/name:tag

# 起動
docker run -d --name N -p 8080:80 -v $(pwd):/app --restart unless-stopped IMAGE

# 確認
docker ps / docker logs -f N / docker stats / docker inspect N
docker exec -it N bash

# Compose
docker compose up -d --build
docker compose logs -f
docker compose down -v

# クリーン
docker system prune -a --volumes
docker system df

用語集

image / コンテナ
image = 不変のテンプレート(layered FS)。コンテナ = image から起動した実行インスタンス。
Dockerfile
image をビルドする手順を記述したテキスト。FROM / RUN / COPY / CMD 等の命令を順次レイヤ化。
multi-stage build
FROM ... AS builder でビルド用と最小ランタイム用を分離。最終 image を劇的にスリム化できる。
.dockerignore
build context から除外するパターン。node_modules, .git を除外しないと巨大 image になる。
レイヤキャッシュ
Dockerfile の各命令ごとにキャッシュされる。COPY → RUN の順番工夫でビルド時間が大きく変わる。
buildx
Docker の拡張ビルダ。マルチアーキ build、cache export/import、QEMU エミュレーション等が可能。
volume / bind mount / tmpfs
volume = Docker 管理の永続ストレージ。bind = ホストパス直接マウント。tmpfs = メモリ FS(消える)。
docker network bridge / host / none
bridge = デフォルト隔離 NW、host = ホストの NW を直接利用、none = NW なし。Compose は内部 bridge を自動作成。
healthcheck
image / Compose で定義する自動ヘルスチェック。Compose の depends_on: condition: service_healthy で順序制御に使える。
restart policy
no / on-failure / always / unless-stopped。本番は unless-stopped が無難。
ECR
AWS のコンテナ registry。aws ecr get-login-password で docker login。lifecycle policy で古い tag を自動削除。
Compose v1 vs v2
v1: docker-compose(Python 製、EOL)。v2: docker compose(Go 製、Docker CLI プラグイン)。新規は v2 一択。
compose.yaml override
複数 compose ファイルを -f で重ね、後勝ちでマージできる。compose.override.yaml はデフォルトで自動マージ。
docker system prune
不要リソース(停止コンテナ、dangling image、未使用 NW)の一括削除。--volumes 指定は破壊的なので注意。
Docker socket
/var/run/docker.sock。コンテナ内にマウントすると Docker を制御可能 = root 権限相当。セキュリティ要注意。