nob@lit-forge

Docker / docker-compose 早見表

Docker の基本コマンド(build / run / exec / logs / cp)、docker-compose のサブコマンド、イメージ・コンテナ・ネットワーク・ボリュームの管理、Dockerfile のディレクティブ、docker-compose.yml の基本構文をひとまとめ。

#Docker#docker-compose#コンテナ#DevOps

イメージ

docker pull nginx:alpine              # イメージ取得
docker images                         # 一覧
docker image ls --filter dangling=true # タグ無し(ゴミ)のみ
docker rmi <image>                    # 削除
docker image prune -a                 # 未使用イメージを全削除
docker build -t myapp:1.0 .           # Dockerfile からビルド
docker build --no-cache -t myapp .    # キャッシュ無しで再ビルド
docker tag myapp:1.0 reg/myapp:1.0    # タグ付与
docker push reg/myapp:1.0             # レジストリへ push
docker history <image>                # レイヤ履歴
docker inspect <image>                # 詳細 JSON

コンテナの起動・停止

docker run -it --rm ubuntu bash       # 対話起動、終了時に削除
docker run -d --name web -p 80:80 nginx  # デーモン起動 + ポート公開
docker run --restart=unless-stopped ...  # 自動再起動ポリシー
docker ps                             # 起動中コンテナ
docker ps -a                          # 停止済み含む全て
docker start/stop/restart <name>      # 開始 / 停止 / 再起動
docker rm <name>                      # 停止済みを削除
docker rm -f <name>                   # 起動中を強制削除
docker container prune                # 停止済みを一括削除

実行中コンテナの操作

docker exec -it web bash              # シェルに入る
docker exec web env                   # 環境変数の確認
docker logs -f --tail 100 web         # ログ追従(末尾 100 行から)
docker logs --since 10m web           # 直近 10 分のログ
docker stats                          # CPU / メモリのリアルタイム使用量
docker top web                        # 中のプロセス一覧
docker cp web:/etc/nginx/nginx.conf . # コンテナ → ホストへコピー
docker cp file.txt web:/tmp/          # ホスト → コンテナへコピー

ネットワーク・ボリューム

docker network ls                     # ネットワーク一覧
docker network create mynet           # カスタム bridge
docker run --network mynet ...        # 参加
docker network inspect mynet          # 詳細(IP / DNS 等)

docker volume ls                      # ボリューム一覧
docker volume create data             # 作成
docker run -v data:/data ...          # マウント(named volume)
docker run -v $(pwd):/app ...         # ホストディレクトリをマウント
docker volume inspect data            # ホスト側の path を確認
docker volume prune                   # 未使用を削除

Dockerfile 主要ディレクティブ

# syntax=docker/dockerfile:1
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN --mount=type=cache,target=/root/.npm npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
HEALTHCHECK --interval=30s CMD wget -q --spider http://localhost/ || exit 1
CMD ["nginx", "-g", "daemon off;"]
  • FROM: ベースイメージ(マルチステージは AS <name>)
  • WORKDIR: 作業ディレクトリ(絶対パス推奨)
  • COPY / ADD: ファイル配置(ADD は URL / 展開付きだが基本は COPY)
  • RUN: ビルド時のシェル実行(レイヤが増える)
  • CMD: デフォルト実行コマンド(上書き可)
  • ENTRYPOINT: 固定エントリポイント(CMD と組み合わせる)
  • ARG: ビルド時引数 / ENV: 実行時環境変数
  • EXPOSE: ドキュメント的に公開ポートを宣言
  • HEALTHCHECK: ヘルスチェック
  • USER: 実行ユーザー(root 以外推奨)

docker compose

docker compose up -d                  # バックグラウンド起動
docker compose up --build             # 再ビルドして起動
docker compose ps                     # サービス一覧
docker compose logs -f web            # サービスのログ追従
docker compose exec web sh            # サービスへ exec
docker compose restart web            # サービス再起動
docker compose down                   # 停止 + 削除
docker compose down -v                # ボリュームも削除
docker compose pull                   # イメージ更新
docker compose config                 # マージ済み YAML を確認

docker-compose.yml(抜粋):

services:
  web:
    build: .
    image: myapp:dev
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
    volumes:
      - ./src:/app/src
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 10

volumes:
  db_data:

トラブル時によく打つ

docker system df                      # ディスク使用量サマリ
docker system prune -a --volumes      # 未使用を一括削除(慎重に)
docker events                         # リアルタイムイベント
docker info                           # デーモン情報
docker version                        # クライアント + サーバーのバージョン
docker context ls                     # 接続先コンテキスト
docker buildx ls                      # マルチアーキビルダー一覧

よくあるハマり

  • Permission denied on /var/run/docker.sock: ユーザーを docker グループに追加(sudo usermod -aG docker $USER)。再ログインが必要
  • Apple Silicon で amd64 のイメージを動かしたい: docker run --platform linux/amd64 ...
  • ビルドが遅い: BuildKit キャッシュマウント(RUN --mount=type=cache,...)、レイヤ順序の最適化、.dockerignorenode_modules.git を除外
  • log の巨大化: /etc/docker/daemon.jsonlog-opts.max-sizemax-file を設定
  • コンテナ内で localhost が繋がらない: ホスト側を指したいなら host.docker.internal(Mac/Windows)、Linux は --add-host=host.docker.internal:host-gateway