1 分で読了 #docker #devops #container
このページの目次

Docker 操作マニュアル

Docker は Linux コンテナランタイムです。主要な概念: image(読み取り専用テンプレート)、container(イメージの実行インスタンス)、volume(永続化ストレージ)、network(コンテナ間通信)、compose(マルチコンテナオーケストレーション)。

コンテナ

# コンテナの一覧表示
docker ps                               # 実行中のコンテナ
docker ps -a                            # すべて(停止済みを含む)
docker ps -a --format '{{.ID}} {{.Names}} {{.Status}}'  # カスタム列
docker ps -q                            # ID のみ出力(スクリプト用)

# 実行
docker run -d --name myapp \
  -p 8080:80 \                          # ホスト:8080 → コンテナ:80
  -v /data:/app/data \                  # ホストディレクトリ → コンテナディレクトリ
  -v app_data:/app/storage \            # 名前付きボリューム → コンテナディレクトリ
  -e DATABASE_URL=postgres://... \      # 環境変数
  --restart unless-stopped \            # 自動再起動ポリシー
  --network mynet \                     # 指定ネットワークに参加
  --memory 512m \                       # メモリ制限
  image:tag

# 再起動ポリシー:
#   no:              自動再起動しない(デフォルト)
#   on-failure[:N]:  終了コードが 0 以外の場合に再起動(オプション: 最大 N 回)
#   unless-stopped:   手動で stop しない限り常に再起動(dockerd 再起動後も有効)
#   always:           いかなる場合でも再起動

# ライフサイクル
docker stop myapp                       # SIGTERM → 10秒待機 → SIGKILL
docker stop -t 30 myapp                 # 30秒待機
docker kill myapp                       # 即座に SIGKILL
docker restart myapp
docker rm myapp                         # 停止したコンテナを削除
docker rm -f myapp                      # 強制削除(実行中でも可)
docker container prune                  # 停止したすべてのコンテナを削除
docker container prune --filter "until=24h"  # 24時間前のもののみ削除

# デバッグ
docker logs myapp --tail 100 -f         # ログ(stdout/stderr)
docker logs myapp --since 5m            # 過去5分間
docker inspect myapp | jq '.[0].State'  # 完全なステータス(PID, ExitCode, Mounts など)
docker inspect myapp | jq '.[0].NetworkSettings.IPAddress'
docker exec -it myapp sh                # コンテナのシェルに入る
docker exec myapp cat /etc/resolv.conf  # 単一コマンドの実行
docker top myapp                        # コンテナ内のプロセス(ホスト視点)
docker stats --no-stream                # CPU/メモリのスナップショット
docker cp myapp:/app/config.yml ./      # コンテナからファイルをコピー

# 現在のコンテナの状態を新しいイメージとしてコミット(デバッグ用、標準的なデプロイ方法ではありません)
docker commit myapp myapp:debug

イメージ

docker images                            # ローカルイメージ
docker images --format '{{.Repository}}:{{.Tag}} {{.Size}}'
docker pull alpine:3.20
docker tag alpine:3.20 myrepo/alpine:latest

docker rmi alpine:3.20                   # 削除(コンテナが参照していないこと必須)
docker image prune                       # ダングリングイメージ(<none> タグ)を削除
docker image prune -a                    # 使用されていないすべてのイメージを削除
docker image prune -a --filter "until=7d"  # 過去7日間のものを除いて削除

# マシン間での転送(レジストリを経由しない)
docker save alpine:3.20 -o alpine.tar    # tar 形式でエクスポート
docker load -i alpine.tar                # インポート
# 用途: Docker Hub から pull できない環境向け。pull 可能なマシンで save → scp → load

# イメージレイヤーの確認
docker history alpine:3.20
docker image inspect alpine:3.20 | jq '.[0].RootFS.Layers'

Docker Compose

docker compose up -d                     # 起動(バックグラウンド)
docker compose up -d --build            # ビルドしてから起動
docker compose down                      # 停止してコンテナ/ネットワークを削除
docker compose down -v                   # ボリュームも同時に削除(データ消失!)
docker compose restart                   # すべてのコンテナを再起動
docker compose restart nginx             # 単一サービスを再起動
docker compose logs -f --tail=50
docker compose ps
docker compose exec app sh              # サービスコンテナに入る
docker compose pull                      # 最新イメージをプル

ネットワーク

docker network ls
docker network inspect bridge            # デフォルトの bridge ネットワーク

# カスタム bridge ネットワーク(推奨: コンテナ名で相互アクセス可能)
docker network create --driver bridge mynet
# → 組み込みDNS: コンテナ名が自動的にIPに解決される
# デフォルトの bridge ではこの機能はなく、IP でのみ相互アクセス可能

docker network connect mynet myapp       # 実行中にネットワークに参加
docker network disconnect mynet myapp

ボリューム

docker volume ls
docker volume inspect app_data           # Mountpoint = ホスト上の実際のパス
docker volume prune                      # 使用されていないボリュームを削除(データ消失!)

クリーンアップ

# 使用されていないリソースを一括でクリーンアップ(注意して実行!)
docker system prune -a --volumes
# -a: 使用されていないイメージも含む
# --volumes: 使用されていないボリュームも含む

# ディスク使用量の確認
docker system df
docker system df -v                      # 各オブジェクトのサイズ

トラブルシューティング

# コンテナが繰り返し再起動する
docker logs myapp --tail=50              # 終了前のログを確認
docker inspect myapp | jq '.[0].State'    # ExitCode と Error を確認

# コンテナ内から DNS が解決できない
docker exec myapp cat /etc/resolv.conf
# → dockerd の起動引数 --dns を確認
# → ホストの /etc/docker/daemon.json を確認: { "dns": ["8.8.8.8"] }

# ポート競合
ss -tlnp | grep <port>

# docker.sock の権限
sudo usermod -aG docker $USER           # sudo なしで docker を使用可能(再ログインが必要)