STEP 8:コンテナのライフサイクル管理

🐳 STEP 8: コンテナのライフサイクル管理

create、start、exec、inspect – コンテナを完全に制御する

📋 このステップで学ぶこと

  • コンテナのライフサイクル(状態遷移)を理解する
  • docker create と docker start の使い分け
  • docker exec でコンテナ内でコマンドを実行する
  • docker pause / unpause で一時停止・再開する
  • docker inspect で詳細情報を取得する
  • docker rename / cp / diff などの補助コマンド
  • コンテナの状態を確認する様々な方法

🔄 1. コンテナのライフサイクル

1-1. ライフサイクルの全体像

コンテナにはライフサイクル(一生)があり、様々な状態を経て最終的に削除されます。
この流れを理解することで、コンテナを適切に管理できるようになります。

【コンテナのライフサイクル図】 docker create │ ▼ ┌─────────────────────────────────────────────────────────┐ │ Created │ │ (作成済み) │ └─────────────────────────────────────────────────────────┘ │ │ docker start ▼ ┌─────────────────────────────────────────────────────────┐ │ Running │ │ (実行中) │ │ │ │ docker pause ──▶ Paused ──▶ docker unpause │ │ (一時停止) │ └─────────────────────────────────────────────────────────┘ │ │ │ docker stop アプリ終了 │ docker kill (自然終了) ▼ │ ┌─────────────────────────────────────────────────────────┐ │ Stopped / Exited │ │ (停止 / 終了済み) │ └─────────────────────────────────────────────────────────┘ │ │ │ docker start │ │ (再起動可能) │ └──────────────────────────────┘ │ │ docker rm ▼ ┌─────────────────────────────────────────────────────────┐ │ Deleted │ │ (削除済み) │ └─────────────────────────────────────────────────────────┘

1-2. 各状態の説明

状態 説明 docker ps での表示
Created コンテナは作成されたが、まだ起動していない。設定は完了している。 Created
Running コンテナが実行中。アプリケーションが動作している。 Up X minutes
Paused 一時停止中。プロセスは凍結されメモリに残るが、CPUは使用しない。 Up X minutes (Paused)
Exited 停止状態。プロセスは終了しているが、コンテナは残っている。 Exited (0) X minutes ago
Dead 異常終了。削除に失敗した状態(稀)。 Dead

1-3. docker run = create + start

これまで使ってきたdocker runは、実は内部で2つの操作を行っています。

【docker run の内部動作】 docker run -d –name web -p 8080:80 nginx │ ├──▶ docker create –name web -p 8080:80 nginx(コンテナ作成) │ └──▶ docker start web(コンテナ起動) → docker run は、create と start を一度に実行する便利コマンド
💡 create と start を分ける理由
  • 設定だけ先に行いたい:起動タイミングを後で制御
  • 複数コンテナの一斉起動:先に全部作成してから同時にstart
  • スクリプトでの柔軟な制御:条件分岐で起動を制御
  • テスト・検証:作成した設定を確認してから起動

1-4. 状態を確認するコマンド

# 実行中のコンテナのみ表示 docker ps # 全てのコンテナを表示(停止中も含む) docker ps -a # 特定のコンテナの状態を確認 docker inspect –format='{{.State.Status}}’ コンテナ名
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx “/docker-entrypoint.…” 10 minutes ago Up 10 minutes 80/tcp web1 b2c3d4e5f6a7 nginx “/docker-entrypoint.…” 15 minutes ago Exited (0) 5 minutes ago web2 c3d4e5f6a7b8 nginx “/docker-entrypoint.…” 20 minutes ago Created web3
✅ STATUS列の読み方
  • Up 10 minutes :10分前から実行中
  • Exited (0) 5 minutes ago :5分前に正常終了(終了コード0)
  • Exited (1) 5 minutes ago :5分前に異常終了(終了コード1)
  • Created :作成済み、未起動
  • Up 10 minutes (Paused) :一時停止中

🔨 2. docker create – コンテナの作成

2-1. docker createの基本

docker createは、コンテナを作成するだけで、起動はしないコマンドです。

docker create –name my-web -p 8080:80 nginx
📝 コマンドの意味
  • docker create :コンテナを作成(起動しない)
  • --name my-web :コンテナ名を「my-web」に設定
  • -p 8080:80 :ポートマッピングを設定
  • nginx :使用するイメージ
a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef12345678

出力されるのはコンテナIDです。この時点ではまだ起動していません。

2-2. 作成されたコンテナの確認

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx “/docker-entrypoint.…” 10 seconds ago Created my-web
✅ 確認ポイント

STATUS列が「Created」になっています。
PORTS列は空です(起動していないため、まだポートは開いていない)。

2-3. docker createのオプション

docker createdocker runとほぼ同じオプションが使えます。

オプション 説明
--name コンテナ名を指定
-p ポートマッピングを設定
-e 環境変数を設定
-v ボリュームをマウント
--network 接続するネットワークを指定
--restart 再起動ポリシーを設定

2-4. 実践例:複数コンテナの準備と一斉起動

# 3つのWebサーバーを作成(まだ起動しない) docker create –name web1 -p 8001:80 nginx docker create –name web2 -p 8002:80 nginx docker create –name web3 -p 8003:80 nginx # 状態確認(全てCreated) docker ps -a –filter “name=web”
CONTAINER ID IMAGE STATUS NAMES a1b2c3d4e5f6 nginx Created web1 b2c3d4e5f6a7 nginx Created web2 c3d4e5f6a7b8 nginx Created web3
# 一斉に起動 docker start web1 web2 web3 # 状態確認(全てRunning) docker ps
CONTAINER ID IMAGE STATUS PORTS NAMES a1b2c3d4e5f6 nginx Up 5 seconds 0.0.0.0:8001->80/tcp web1 b2c3d4e5f6a7 nginx Up 5 seconds 0.0.0.0:8002->80/tcp web2 c3d4e5f6a7b8 nginx Up 5 seconds 0.0.0.0:8003->80/tcp web3

▶️ 3. docker start – コンテナの起動

3-1. docker startの基本

docker startは、停止中または作成済みのコンテナを起動するコマンドです。

docker start my-web
📝 コマンドの意味
  • docker start :コンテナを起動するコマンド
  • my-web :起動するコンテナ名(またはコンテナID)

3-2. docker startのオプション

オプション 説明
-a アタッチモード:コンテナの標準出力をターミナルに表示しながら起動。Ctrl+Cで停止。
-i インタラクティブ:標準入力を有効にする。対話的なコンテナで使用。
-ai アタッチ+インタラクティブ。bashなどを起動する場合に使用。

3-3. 使用例

# 通常の起動(バックグラウンド) docker start my-web # ログを表示しながら起動 docker start -a my-web # 複数コンテナを一度に起動 docker start web1 web2 web3

3-4. docker run と docker start の違い

項目 docker run docker start
動作 新しいコンテナを作成して起動 既存のコンテナを起動
対象 イメージ名を指定 コンテナ名/IDを指定
設定 オプションで設定 以前の設定を維持
コンテナ数 実行のたびに増える 増えない
💡 docker startの特徴

docker startは、docker runまたはdocker create時の設定を全て維持します。
ポート、環境変数、ボリュームマウントなど、最初に設定した内容がそのまま使われます。
設定を変更したい場合は、コンテナを削除して新しく作成する必要があります。

⏸️ 4. docker pause / unpause – 一時停止と再開

4-1. docker pauseの基本

docker pauseは、コンテナを一時停止するコマンドです。
プロセスは凍結され、メモリには残りますが、CPUは使用しません。

docker pause my-web
📝 コマンドの意味
  • docker pause :コンテナを一時停止
  • my-web :一時停止するコンテナ名
# 状態確認 docker ps
CONTAINER ID IMAGE STATUS PORTS NAMES a1b2c3d4e5f6 nginx Up 5 minutes (Paused) 0.0.0.0:8080->80/tcp my-web

4-2. docker unpauseの基本

docker unpauseは、一時停止したコンテナを再開するコマンドです。

docker unpause my-web
📝 コマンドの意味
  • docker unpause :一時停止を解除して再開
  • my-web :再開するコンテナ名

4-3. pause vs stop の違い

項目 docker pause docker stop
プロセス 凍結(一時停止) 終了(シャットダウン)
メモリ 維持される 解放される
再開方法 docker unpause(即座に再開) docker start(プロセス再起動)
再開速度 非常に速い プロセス起動時間が必要
用途 一時的なリソース解放、デバッグ 長期停止、メンテナンス
✅ pauseの使用場面
  • 一時的なCPU解放:他のタスクにリソースを譲る
  • デバッグ:プロセスの状態を凍結して調査
  • スナップショット取得:一貫性のある状態でバックアップ

🔧 5. docker exec – コンテナ内でコマンド実行

5-1. docker execの基本

docker execは、実行中のコンテナ内でコマンドを実行するコマンドです。
トラブルシューティングやデバッグで頻繁に使用します。

docker exec my-web ls /usr/share/nginx/html
📝 コマンドの意味
  • docker exec :コンテナ内でコマンドを実行
  • my-web :対象のコンテナ名
  • ls /usr/share/nginx/html :実行するコマンド
50x.html index.html

5-2. docker execのオプション

オプション 説明
-i Interactive:標準入力を開いたままにする。対話的なコマンドで必要。
-t TTY:疑似端末を割り当てる。ターミナル表示を整える。
-it 上記2つの組み合わせ。シェルに入る時の定番。
-d Detach:バックグラウンドで実行。
-e 環境変数を設定して実行。
-w 作業ディレクトリを指定。
-u 実行ユーザーを指定(例:-u root

5-3. よく使うパターン

1️⃣ シェルに入る(最も重要)
# Bashシェルに入る(Debian/Ubuntuベース) docker exec -it my-web bash # プロンプトが変わる root@a1b2c3d4e5f6:/# # コンテナ内で自由にコマンド実行 root@a1b2c3d4e5f6:/# ls root@a1b2c3d4e5f6:/# cat /etc/nginx/nginx.conf root@a1b2c3d4e5f6:/# exit # 終了
⚠️ Alpineイメージの場合

Alpineベースのイメージにはbashがありません。
代わりにshを使います。

# Alpineイメージの場合 docker exec -it my-alpine-container sh
2️⃣ ワンライナーコマンド
# ファイルの内容を確認 docker exec my-web cat /etc/nginx/nginx.conf # プロセス一覧を確認 docker exec my-web ps aux # ディスク使用量を確認 docker exec my-web df -h # ネットワーク情報を確認 docker exec my-web ip addr # 環境変数を確認 docker exec my-web env
3️⃣ PostgreSQLデータベース操作
# PostgreSQLに対話的に接続 docker exec -it my-postgres psql -U postgres # SQLを直接実行 docker exec my-postgres psql -U postgres -c “SELECT version();” # データベース一覧 docker exec my-postgres psql -U postgres -c “\l” # テーブル一覧 docker exec my-postgres psql -U postgres -d mydb -c “\dt”
4️⃣ ファイルの作成・編集
# ファイルを作成 docker exec my-web sh -c “echo ‘Hello Docker!’ > /usr/share/nginx/html/test.html” # 複数コマンドを実行 docker exec my-web sh -c “apt-get update && apt-get install -y vim”

5-4. docker exec の注意点

⚠️ 注意事項
  • 実行中のコンテナのみ:停止中のコンテナには使えない
  • 変更は一時的:コンテナを削除すると変更も消える
  • 本番では最小限に:手動変更は管理が難しくなる

🔍 6. docker inspect – 詳細情報の取得

6-1. docker inspectの基本

docker inspectは、コンテナやイメージの詳細情報をJSON形式で表示するコマンドです。

docker inspect my-web
📝 コマンドの意味
  • docker inspect :詳細情報を表示
  • my-web :対象のコンテナ名(イメージ名も可)
[ { “Id”: “a1b2c3d4e5f6789…”, “Created”: “2024-01-15T10:30:45.123456789Z”, “Path”: “nginx”, “Args”: [“-g”, “daemon off;”], “State”: { “Status”: “running”, “Running”: true, “Paused”: false, “StartedAt”: “2024-01-15T10:30:46.789Z” }, “NetworkSettings”: { “IPAddress”: “172.17.0.2”, “Ports”: { “80/tcp”: [{“HostIp”: “0.0.0.0”, “HostPort”: “8080”}] } }, … } ]

6-2. 特定の情報だけを取得(–format)

--format(または-f)オプションで、特定の情報だけを抽出できます。

# IPアドレスを取得 docker inspect -f ‘{{.NetworkSettings.IPAddress}}’ my-web
172.17.0.2
# コンテナの状態を取得 docker inspect -f ‘{{.State.Status}}’ my-web
running

6-3. よく使うフォーマット指定

フォーマット 取得できる情報
{{.NetworkSettings.IPAddress}} コンテナのIPアドレス
{{.State.Status}} コンテナの状態
{{.State.StartedAt}} 起動日時
{{.Config.Env}} 環境変数一覧
{{.Mounts}} マウント情報
{{.NetworkSettings.Ports}} ポートマッピング
{{.HostConfig.Memory}} メモリ制限

6-4. 実践的な使用例

# 環境変数を1行ずつ表示 docker inspect -f ‘{{range .Config.Env}}{{println .}}{{end}}’ my-web
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.25.3 NJS_VERSION=0.8.2
# コンテナのIPアドレスを使ってアクセス curl http://$(docker inspect -f ‘{{.NetworkSettings.IPAddress}}’ my-web)
# 複数の情報をまとめて取得 docker inspect -f ‘ID: {{.Id}} | Status: {{.State.Status}} | IP: {{.NetworkSettings.IPAddress}}’ my-web
ID: a1b2c3d4e5f6… | Status: running | IP: 172.17.0.2

6-5. jqと組み合わせる(上級)

jqコマンドを使うと、JSONをより柔軟に加工できます。

# jqで整形して表示 docker inspect my-web | jq ‘.[0].NetworkSettings’ # 特定の値を抽出 docker inspect my-web | jq ‘.[0].NetworkSettings.IPAddress’ # 複数の値を抽出 docker inspect my-web | jq ‘.[0] | {id: .Id[0:12], status: .State.Status, ip: .NetworkSettings.IPAddress}’
💡 jqのインストール

jqはJSONを扱うコマンドラインツールです。
Mac: brew install jq
Ubuntu: apt-get install jq
Windows: choco install jq

🛠️ 7. その他の便利なコマンド

7-1. docker rename – コンテナ名の変更

docker rename old-name new-name
📝 コマンドの意味
  • docker rename :コンテナ名を変更
  • old-name :現在の名前
  • new-name :新しい名前
# 例:my-webをproduction-webに変更 docker rename my-web production-web

7-2. docker cp – ファイルのコピー

ホストとコンテナ間でファイルをコピーします。

# ホスト → コンテナ docker cp ./local-file.txt my-web:/app/
📝 コマンドの意味
  • docker cp :ファイルをコピー
  • ./local-file.txt :ホスト上のファイル
  • my-web:/app/ :コンテナ名:コピー先パス
# コンテナ → ホスト docker cp my-web:/etc/nginx/nginx.conf ./nginx.conf
# ディレクトリごとコピー docker cp my-web:/var/log/nginx ./logs/

7-3. docker diff – 変更点の確認

コンテナ内でイメージから変更されたファイルを表示します。

docker diff my-web
C /var C /var/log C /var/log/nginx A /var/log/nginx/access.log A /var/log/nginx/error.log C /run A /run/nginx.pid
✅ 記号の意味
  • A (Added):追加されたファイル
  • C (Changed):変更されたファイル/ディレクトリ
  • D (Deleted):削除されたファイル

7-4. docker top – プロセス確認

コンテナ内で実行中のプロセスを表示します。

docker top my-web
UID PID PPID C STIME TTY TIME CMD root 1234 1233 0 10:30 ? 00:00:00 nginx: master process nginx -g daemon off; nginx 1235 1234 0 10:30 ? 00:00:00 nginx: worker process

7-5. docker stats – リソース使用状況

コンテナのCPU、メモリ、ネットワーク使用状況をリアルタイムで表示します。

docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a1b2c3d4e5f6 my-web 0.02% 3.5MiB / 7.776GiB 0.04% 1.5kB / 1.2kB 0B / 0B 2 b2c3d4e5f6a7 my-db 0.50% 120MiB / 7.776GiB 1.54% 2.1kB / 1.8kB 4MB / 8MB 10
# 特定のコンテナのみ docker stats my-web # 1回だけ表示(リアルタイム更新なし) docker stats –no-stream

💪 8. 練習問題

練習問題 1 基礎

docker createとdocker startを使ってコンテナを起動してください

nginxコンテナを「my-nginx」という名前で作成し、ポート8080で公開してから起動してください。

【解答】
# 1. コンテナを作成(起動しない) docker create –name my-nginx -p 8080:80 nginx # 2. 状態確認(Created) docker ps -a # 3. 起動 docker start my-nginx # 4. 状態確認(Running) docker ps # 5. ブラウザで確認:http://localhost:8080 # 後片付け docker stop my-nginx docker rm my-nginx
練習問題 2 基礎

コンテナの状態を確認してください

docker inspectを使って、コンテナのIPアドレスと状態を取得してください。

【解答】
# コンテナを起動 docker run -d –name test-web nginx # IPアドレスを取得 docker inspect -f ‘{{.NetworkSettings.IPAddress}}’ test-web # 状態を取得 docker inspect -f ‘{{.State.Status}}’ test-web # 複数の情報を一度に取得 docker inspect -f ‘Status: {{.State.Status}}, IP: {{.NetworkSettings.IPAddress}}’ test-web # 後片付け docker rm -f test-web
練習問題 3 基礎

docker execでコンテナ内のファイルを確認してください

nginxコンテナ内の /etc/nginx/nginx.conf の内容を表示してください。

【解答】
# コンテナを起動 docker run -d –name my-nginx nginx # ファイルの内容を表示 docker exec my-nginx cat /etc/nginx/nginx.conf # 後片付け docker rm -f my-nginx
練習問題 4 応用

コンテナ内でHTMLファイルを作成してください

タスク:

  1. nginxコンテナを起動(ポート8080)
  2. docker execでbashに入る
  3. /usr/share/nginx/html/hello.html を作成
  4. ブラウザで http://localhost:8080/hello.html を確認
【解答】
# 1. コンテナ起動 docker run -d –name my-nginx -p 8080:80 nginx # 2. bashに入る docker exec -it my-nginx bash # 3. HTMLファイルを作成 echo ‘<h1>Hello from Docker!</h1>’ > /usr/share/nginx/html/hello.html # 4. 確認して終了 cat /usr/share/nginx/html/hello.html exit # 5. ブラウザまたはcurlで確認 curl http://localhost:8080/hello.html # 後片付け docker rm -f my-nginx
練習問題 5 応用

pause/unpauseを体験してください

タスク:

  1. nginxコンテナを起動
  2. docker pauseで一時停止
  3. docker psで状態を確認(Paused)
  4. docker unpauseで再開
  5. docker psで状態を確認
【解答】
# 1. 起動 docker run -d –name my-nginx nginx # 2. 一時停止 docker pause my-nginx # 3. 状態確認 docker ps # STATUS: Up X seconds (Paused) # 4. 再開 docker unpause my-nginx # 5. 状態確認 docker ps # STATUS: Up X seconds # 後片付け docker rm -f my-nginx
練習問題 6 応用

docker cpでファイルをコピーしてください

タスク:

  1. ローカルにtest.htmlを作成
  2. nginxコンテナを起動
  3. docker cpでtest.htmlをコンテナにコピー
  4. ブラウザで確認
【解答】
# 1. ローカルにHTMLファイルを作成 echo ‘<h1>Copied from host!</h1>’ > test.html # 2. コンテナ起動 docker run -d –name my-nginx -p 8080:80 nginx # 3. ファイルをコピー docker cp test.html my-nginx:/usr/share/nginx/html/ # 4. 確認 curl http://localhost:8080/test.html # 後片付け docker rm -f my-nginx rm test.html
練習問題 7 発展

コンテナのライフサイクル全体を体験してください

1つのコンテナで、全ての状態遷移を体験してください:Created → Running → Paused → Running → Stopped → Running → Deleted

【解答】
# 1. Created docker create –name lifecycle-test nginx docker ps -a | grep lifecycle-test # STATUS: Created # 2. Running docker start lifecycle-test docker ps | grep lifecycle-test # STATUS: Up # 3. Paused docker pause lifecycle-test docker ps | grep lifecycle-test # STATUS: Up (Paused) # 4. Running(再開) docker unpause lifecycle-test docker ps | grep lifecycle-test # STATUS: Up # 5. Stopped docker stop lifecycle-test docker ps -a | grep lifecycle-test # STATUS: Exited # 6. Running(再起動) docker start lifecycle-test docker ps | grep lifecycle-test # STATUS: Up # 7. Deleted docker stop lifecycle-test docker rm lifecycle-test docker ps -a | grep lifecycle-test # 何も表示されない
練習問題 8 発展

docker statsでリソース使用状況を確認してください

タスク:

  1. 3つのnginxコンテナを起動
  2. docker statsで全コンテナの使用状況を確認
  3. 特定のコンテナだけの使用状況を確認
  4. –no-streamで1回だけ表示
【解答】
# 1. 3つのコンテナを起動 docker run -d –name web1 nginx docker run -d –name web2 nginx docker run -d –name web3 nginx # 2. 全コンテナの使用状況(Ctrl+Cで終了) docker stats # 3. 特定のコンテナだけ docker stats web1 # 4. 1回だけ表示 docker stats –no-stream # 後片付け docker rm -f web1 web2 web3

📝 STEP 8 のまとめ

✅ このステップで学んだこと
  • ライフサイクル:Created → Running → Paused/Stopped → Deleted
  • docker create:コンテナを作成(起動しない)
  • docker start:停止/作成済みコンテナを起動
  • docker pause/unpause:一時停止と再開
  • docker exec:実行中コンテナ内でコマンド実行
  • docker inspect:詳細情報をJSON形式で取得
  • docker cp:ホストとコンテナ間のファイルコピー
  • docker stats:リソース使用状況の確認
📊 今回学んだコマンド一覧
コマンド 機能
docker create コンテナを作成(起動しない)
docker start コンテナを起動
docker pause/unpause 一時停止/再開
docker exec -it コンテナ bash コンテナ内でシェルを起動
docker inspect -f 'フォーマット' 特定の情報を抽出
docker cp ファイルをコピー
docker diff 変更されたファイルを表示
docker stats リソース使用状況を表示
💡 重要ポイント

コンテナのライフサイクルを理解すると、より細かい制御ができるようになります。

特にdocker execは、トラブルシューティングで必須のコマンドです。
コンテナ内に入ってログを確認したり、設定を調べたりする場面で活躍します。

docker inspectは、ネットワーク設定や環境変数など、
コンテナの全ての情報を取得できる最強のツールです。

🎯 次のステップの予告

次のSTEP 9では、「ログとデバッグ手法」を学びます。

  • docker logsの詳細な使い方
  • リアルタイムログの確認(-f オプション)
  • ログのフィルタリングと検索
  • コンテナのデバッグ方法

実務で必須のトラブルシューティングスキルを習得しましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 8

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE