コンテナ

実行、ライフサイクル、リソース制限

コンテナとは

コンテナはイメージから作成された実行インスタンスです。 イメージの読み取り専用レイヤーの上に、書き込み可能なレイヤーを追加して実行されます。

コンテナライフサイクル

Created
Running
Paused
or
Stopped
Removed
Created

作成済み、未起動

Running

実行中

Paused

一時停止中(SIGSTOP)

Exited/Stopped

停止済み

コンテナ操作

1# 実行
2docker run nginx # フォアグラウンド
3docker run -d nginx # バックグラウンド(デタッチ)
4docker run -it ubuntu bash # インタラクティブ
5docker run --rm nginx # 終了時に自動削除
6docker run --name web nginx # 名前を指定
7
8# 一覧
9docker ps # 実行中のみ
10docker ps -a # 全コンテナ
11
12# 停止・開始
13docker stop web # graceful stop(SIGTERM → SIGKILL)
14docker start web
15docker restart web
16docker kill web # 即時停止(SIGKILL)
17
18# 削除
19docker rm web
20docker rm -f web # 強制削除
21docker container prune # 停止中のコンテナ全削除
22
23# コンテナ内操作
24docker exec -it web bash # コンテナ内でコマンド実行
25docker attach web # メインプロセスにアタッチ
26
27# ログ
28docker logs web
29docker logs -f web # フォロー
30docker logs --tail 100 web # 最新100行
31
32# 詳細情報
33docker inspect web
34docker stats # リアルタイムリソース使用量
35docker top web # コンテナ内プロセス

ポート・ボリューム

1# ポートマッピング
2docker run -p 8080:80 nginx # ホスト8080 → コンテナ80
3docker run -p 80 nginx # ランダムポート → コンテナ80
4docker run -P nginx # EXPOSEされた全ポートをランダムマッピング
5
6# ボリュームマウント
7docker run -v /host/path:/container/path nginx # バインドマウント
8docker run -v myvolume:/data nginx # 名前付きボリューム
9docker run --mount type=bind,src=/host,dst=/container nginx
10
11# 読み取り専用
12docker run -v /host:/container:ro nginx
13
14# ボリューム管理
15docker volume create myvolume
16docker volume ls
17docker volume inspect myvolume
18docker volume rm myvolume

リソース制限

cgroupsを使用してCPU、メモリ、I/Oを制限。 本番環境では必ず設定することを推奨。

1# メモリ制限
2docker run -m 512m nginx # 512MB制限
3docker run --memory 1g nginx # 1GB制限
4docker run --memory-swap 2g nginx # スワップ含む上限
5
6# CPU制限
7docker run --cpus 1.5 nginx # 1.5コア分
8docker run --cpu-shares 512 nginx # 相対的な重み(デフォルト1024)
9docker run --cpuset-cpus 0,1 nginx # 使用するCPUコア指定
10
11# 組み合わせ
12docker run -d \
13 --name app \
14 -m 512m \
15 --cpus 1 \
16 -p 8080:80 \
17 myapp:latest

環境変数

1# 環境変数を指定
2docker run -e NODE_ENV=production nginx
3docker run -e "DATABASE_URL=postgres://..." nginx
4
5# ファイルから読み込み
6docker run --env-file .env nginx
7
8# .env ファイル例
9# NODE_ENV=production
10# DATABASE_URL=postgres://...
11# SECRET_KEY=xxx

再起動ポリシー

--restart no

再起動しない(デフォルト)

--restart always

常に再起動。Docker起動時も自動起動

--restart unless-stopped

手動停止以外は再起動

--restart on-failure:5

異常終了時のみ、最大5回まで

SRE/インフラ観点

本番環境でのベストプラクティス

  • • 必ずリソース制限を設定
  • --restart unless-stopped を使用
  • • ヘルスチェックを設定(HEALTHCHECK命令)
  • • ログはstdout/stderrに出力

トラブルシューティング

  • docker logs でログ確認
  • docker inspect で設定確認
  • docker exec でコンテナ内調査
  • docker stats でリソース使用確認