2.3 Dockerコンテナのライフサイクル完全解説|状態遷移・終了コード・再起動ポリシー

【第2章】イメージとコンテナの基本操作

Dockerコンテナは「起動したら終わり」ではありません。created → running → paused → exited → deleted という明確な状態を持ち、各状態でできる操作・できない操作が決まっています。この仕組みを理解していないと、「コンテナが消えた」「ログが見えない」「起動したはずが動いていない」といったトラブルに悩まされます。

この記事ではコンテナのライフサイクルを状態マシンとして完全解説します。


目次

  1. コンテナの5つの状態
  2. シミュレータで状態遷移を体験する
  3. created ── 作成済み・未起動
  4. running ── 実行中
  5. paused ── 一時停止
  6. exited ── 停止済み
  7. 終了コード(Exit Code)の読み方
  8. コンテナの削除
  9. 再起動ポリシー(–restart)
  10. –rm フラグと docker container prune
  11. OOM Killer ── メモリ超過による強制終了
  12. まとめ

1. コンテナの5つの状態

Dockerコンテナは常に次のいずれかの状態にあります。

状態 意味 docker ps での表示 プロセスの状態
created コンテナが作成されたが起動していない -a のみ(Created) なし
running メインプロセスが実行中 常に表示(Up X hours) 実行中
paused プロセスが凍結中(CPU停止・メモリ保持) 常に表示(Paused) SIGSTOP 相当(凍結)
exited メインプロセスが終了した(コンテナは残存) -a のみ(Exited (N)) なし
dead 削除に失敗した異常状態(まれ) -a のみ(Dead) なし
💡 docker ps -a を使う場面
docker ps-a なし)は running のみを表示します。「コンテナを起動したはずなのに出てこない」という場合、docker ps -a で確認すると exited 状態で停止しているケースがほとんどです。

状態遷移の全体像をまず把握しましょう:

docker create / docker run
created
↓ docker start
running
→ docker pause → paused
← docker unpause ←
終了トリガー:
docker stop (SIGTERM)
docker kill (SIGKILL)
プロセス自己終了
OOM Killer
exited
→ docker start → running
→ docker rm -f → running(強制削除)
↓ docker rm
(削除済み) ← イメージは残る
created → docker rm → 削除

2. シミュレータで状態遷移を体験する

下のシミュレータで、コマンドボタンを押して実際に状態を遷移させてみましょう。左の図で現在の状態がハイライトされ、右パネルに詳細情報が表示されます。

💡 試してみよう
docker startdocker pausedocker unpausedocker stop の流れ
docker start → プロセス正常終了(終了コード 0)と異常終了(終了コード 1)の違い
docker kill(SIGKILL) で終了コードが 137 になることを確認
④ exited から docker start で再起動できることを確認

3. created ── 作成済み・未起動

created 状態は、コンテナのファイルシステムと設定が準備されたが、メインプロセスがまだ起動していない状態です。

created になる操作

# docker create: コンテナを作成するが起動しない
docker create --name myapp nginx

# docker run はコンテナを作成 → 即座に起動するため、
# created 状態は一瞬しか続かない(通常は意識しない)

docker create は「コンテナを事前に準備しておき、必要なときに docker start する」用途に使います。Docker Compose が複数コンテナを一括で作成するときに内部的に使用しています。

操作 遷移先
docker start <ID> running
docker rm <ID> (削除)

4. running ── 実行中

running 状態は、メインプロセス(PID 1)が動作中の状態です。コンテナとして最も正常な状態であり、docker ps-a 不要)で確認できます。

# running に移行するコマンド
docker run nginx                # イメージから起動(フォアグラウンド)
docker run -d nginx             # バックグラウンド起動
docker start mycontainer        # 停止中コンテナを再起動

# running 状態でできること
docker logs -f mycontainer      # ログ追跡
docker exec -it mycontainer sh  # コンテナ内でコマンド実行
docker stats mycontainer        # リソース使用量確認
docker top mycontainer          # コンテナ内プロセス一覧

running から他の状態に移行するトリガー

トリガー シグナル 遷移先 終了コード
docker pause —(cgroup freezer) paused
docker stop SIGTERM → (10秒後)SIGKILL exited 0 または 143
docker kill SIGKILL(デフォルト) exited 137
プロセス自己終了(正常) exited 0
プロセス自己終了(異常) exited 1〜255
OOM Killer SIGKILL exited 137
docker rm -f SIGKILL (削除)
💡 コンテナの PID 1 が終了するとコンテナも終了する
Dockerコンテナのメインプロセス(PID 1)が終了すると、コンテナ自体が exited 状態に移行します。これは Linux のプロセスツリーの仕組みによるもので、PID 1 が終了すると名前空間内の他のプロセスも連鎖的に終了します。nginx など常駐サービスはプロセスが終了しないため running を維持し、hello-world のような一時的なプロセスは実行後すぐに exited になります。

5. paused ── 一時停止

paused 状態は、Linux の cgroups freezer サブシステムによってコンテナ内の全プロセスが凍結された状態です(第1章 1-5 参照)。

# 一時停止
docker pause mycontainer

# 再開
docker unpause mycontainer

# 確認(STATUS 列が "Paused" になる)
docker ps

pause の特徴

項目 paused の挙動
CPU 消費 ゼロ(プロセスが凍結されているため)
メモリ 保持される(ページスワップなし)
ネットワーク 新しいパケットを処理しない(受信はキューに蓄積)
ファイルI/O 新しい操作は凍結(既存の I/O は完了待ち)

一時停止は本番での高負荷時のリソース確保や、コンテナのスナップショット取得(チェックポイント)の前処理として使われます。通常の開発では多用しません。

⚠️ docker stop は paused コンテナにも使える
docker stoppaused コンテナに対して実行すると、自動的に unpause してから停止します。ただし paused 状態のコンテナに docker exec は実行できません(凍結中のため)。

6. exited ── 停止済み

exited 状態は、コンテナのメインプロセスが終了した後の状態です。コンテナ自体(書き込みレイヤー・ログ・メタデータ)はディスクに残っています。

# exited コンテナを確認
docker ps -a
# CONTAINER ID   IMAGE     ...   STATUS
# a1b2c3d4e5f6   nginx     ...   Exited (0) 5 minutes ago
# f6e5d4c3b2a1   ubuntu    ...   Exited (1) 2 hours ago

# exited コンテナのログはまだ確認できる
docker logs a1b2c3

# exited コンテナを再起動
docker start a1b2c3

# exited コンテナを削除
docker rm a1b2c3
💡 exited ≠ 削除
exited 状態はコンテナが停止しているだけで、削除はされていません。書き込みレイヤーとログが残っているため、docker start で再起動でき、docker logs で過去のログも確認できます。docker rm を実行して初めてコンテナが削除されます。

溜まった exited コンテナはディスクを消費します。不要なら docker container prune で一括削除しましょう。

7. 終了コード(Exit Code)の読み方

コンテナが exited 状態になったとき、docker ps -a の STATUS 列に Exited (N) と終了コードが表示されます。この数値から何が原因で終了したかを判断できます。

終了コード 意味 主な原因
0 正常終了 メインプロセスが成功して終了(hello-world、バッチ処理完了など)
1 一般的なエラー アプリケーションのエラー、設定ファイルなし、接続エラーなど
125 Docker デーモンのエラー docker run 自体の失敗
126 コマンドが実行不可 指定したコマンドに実行権限がない
127 コマンドが見つからない 存在しないコマンドを指定(docker run ubuntu nonexistent
130 Ctrl+C で中断(SIGINT) ユーザーがターミナルで Ctrl+C を押した
137 SIGKILL で強制終了 docker kill、OOM Killer(メモリ超過)、ホストの OOM
143 SIGTERM で終了 docker stop 後、プロセスが正常に SIGTERM を処理して終了
# 終了コードを取得する方法
docker inspect --format='{{.State.ExitCode}}' <コンテナID>

# OOM(メモリ超過)による強制終了かどうかを確認
docker inspect --format='{{.State.OOMKilled}}' <コンテナID>
# true が返ればメモリ超過による SIGKILL

# 直前に終了したコンテナのコードを確認(シェルスクリプトで利用)
docker run --rm myapp
echo $?   # docker run コマンドの終了コード = コンテナの終了コード
💡 終了コードの計算規則
シグナルによる終了コードは 128 + シグナル番号 です。
SIGKILL = 9 → 128 + 9 = 137、SIGTERM = 15 → 128 + 15 = 143 となります。

8. コンテナの削除

コンテナを削除(docker rm)すると、そのコンテナの書き込みレイヤー・ログ・メタデータがすべて消去されます。イメージは残ります。

# 停止中コンテナを削除
docker rm mycontainer

# 実行中コンテナを強制削除(stop + rm の組み合わせ)
docker rm -f mycontainer

# 停止中コンテナを一括削除
docker container prune
# WARNING! This will remove all stopped containers.
# Are you sure you want to continue? [y/N]

# 確認なしで一括削除
docker container prune -f

# 特定フィルタで削除(1日より古い停止コンテナ)
docker container prune --filter "until=24h"
⚠️ 削除は元に戻せない
docker rm で削除されたコンテナのデータ(書き込みレイヤー内のファイル変更・インストール済みパッケージなど)は復元できません。永続化が必要なデータは必ずボリューム(-v)で管理しましょう(第4章で詳しく解説)。

9. 再起動ポリシー(–restart)

コンテナが exited になったとき、Dockerデーモンに自動的に再起動させるかどうかを制御するのが再起動ポリシーです。

docker run --restart=<ポリシー> イメージ名
ポリシー 動作 用途
no(デフォルト) 自動再起動しない 開発・一時実行・バッチ処理
always 常に再起動。Dockerデーモン再起動時も含む 本番の常駐サービス(停止させたくない)
unless-stopped always と同じだが、docker stop で止めた場合はデーモン再起動後も停止したまま 本番サービス(意図的な停止は維持したい)
on-failure[:N] 終了コードが非ゼロのとき最大N回まで再起動 一時的な失敗に対するリトライ、クラッシュループ防止
# 本番 nginx: デーモン起動時に自動起動し、意図的な停止は維持
docker run -d --restart=unless-stopped --name web nginx

# 最大5回までリトライするバッチ処理
docker run --restart=on-failure:5 myjob

# 既存コンテナのポリシーを変更(Docker 1.13以降)
docker update --restart=always mycontainer
💡 always vs unless-stopped
always はホストを再起動した後もコンテナが自動起動します。unless-stopped も同様ですが、ホスト再起動前に docker stop で明示的に停止したコンテナは、ホスト再起動後も停止したままです。本番環境では unless-stopped が推奨される場合が多いです。

再起動のバックオフ

再起動ポリシーが設定されているコンテナが繰り返し失敗すると、Dockerは指数バックオフ(100ms → 200ms → 400ms → … 最大5分)で再起動間隔を延ばします。これにより、クラッシュループが起きてもシステム全体に影響しません。

10. –rm フラグと docker container prune

--rm フラグを付けて docker run すると、コンテナが exited になった瞬間に自動的に削除されます。

# 実行後に自動削除(一時的な作業に最適)
docker run --rm alpine echo "hello"
docker run --rm ubuntu:22.04 bash -c "uname -a"

# ビルド作業(現在のディレクトリをマウント)
docker run --rm -v "$(pwd)":/work -w /work node:20 npm test

# ツールとして使う(ホストにツールをインストールしたくないとき)
docker run --rm python:3.12 python -c "import this"
💡 –rm と –restart は共存できない
--rm--restartno 以外)を同時に指定するとエラーになります。「終了したら削除」と「終了したら再起動」は矛盾するからです。

定期的なクリーンアップ

# 停止コンテナ・未使用イメージ・ネットワーク・ビルドキャッシュを一括削除
docker system prune

# ディスク使用量の内訳を確認
docker system df

# 出力例:
# TYPE            TOTAL   ACTIVE   SIZE      RECLAIMABLE
# Images          12      3        2.34GB    1.89GB (80%)
# Containers      8       2        142MB     138MB (97%)
# Local Volumes   4       2        1.2GB     0B (0%)
# Build Cache     23      0        892MB     892MB

11. OOM Killer ── メモリ超過による強制終了

コンテナのメモリ使用量がホストの利用可能メモリを超えると、Linuxカーネルの OOM(Out of Memory)Killer がコンテナのプロセスを SIGKILL で強制終了します。結果として終了コードは 137OOMKilled: true になります。

# メモリ上限を設定して起動(メモリ超過を防ぐ)
docker run --memory=256m --memory-swap=256m myapp

# OOM Killer で終了したか確認
docker inspect --format='{{.State.OOMKilled}}' mycontainer
# true → OOM Killerによる強制終了

# メモリ使用量をリアルタイム確認
docker stats mycontainer
⚠️ OOM Killed の対処法
--memory の上限を増やす(根本原因の解消ではない)
② アプリケーションのメモリリークを調査する
docker stats や cAdvisor でメモリ使用量のトレンドを監視する(第9章で詳しく解説)

cgroup によるメモリ制限の仕組みはシミュレータで体験できます:

12. まとめ

状態 docker ps 表示 移行コマンド(INTO) 移行コマンド(FROM)
created -a のみ docker create docker start / docker rm
running 常に表示 docker start / docker run docker pause / docker stop / docker kill / プロセス終了
paused 常に表示(Paused) docker pause docker unpause / docker stop
exited -a のみ docker stop / docker kill / プロセス終了 docker start / docker rm

再起動ポリシー早見表

ポリシー 異常終了で再起動 デーモン再起動で自動起動 docker stop 後に自動起動
no × × ×
on-failure ○(N回まで) △(終了コードが非ゼロなら) ×
always
unless-stopped ×(停止したままを維持)
✅ 次のステップ
次の記事「2-4. インタラクティブモード(-it オプション)」では、コンテナ内に入ってシェル操作する方法を詳しく解説します。
2-5. デタッチモード(-d)とバックグラウンド実行」では、サーバー型コンテナを running 状態で維持する方法を扱います。

参考リンク

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました