📋 このステップで学ぶこと
コンテナのライフサイクル(状態遷移)を理解する
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 createはdocker 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ファイルを作成してください
タスク:
nginxコンテナを起動(ポート8080)
docker execでbashに入る
/usr/share/nginx/html/hello.html を作成
ブラウザで 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を体験してください
タスク:
nginxコンテナを起動
docker pauseで一時停止
docker psで状態を確認(Paused)
docker unpauseで再開
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でファイルをコピーしてください
タスク:
ローカルにtest.htmlを作成
nginxコンテナを起動
docker cpでtest.htmlをコンテナにコピー
ブラウザで確認
解答を見る
【解答】
# 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でリソース使用状況を確認してください
タスク:
3つのnginxコンテナを起動
docker statsで全コンテナの使用状況を確認
特定のコンテナだけの使用状況を確認
–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 オプション)
ログのフィルタリングと検索
コンテナのデバッグ方法
実務で必須のトラブルシューティングスキルを習得しましょう!