docker run したコンテナがすぐ終了して起動し続けられない
コンテナはメインプロセス(PID 1)が終了すると停止します。
常駐プロセスが無い、デタッチで対話シェルを起動した、CMD が即終了する、のいずれかが原因です。
docker logs と docker ps -a で終了コードを確認します。
公開: 更新:
要約
Docker コンテナは「PID 1 のプロセスが生きている間だけ」動き続けます。docker run 直後に停止するのは、メインプロセスが終了したからです。
原因の切り分けには docker ps -a で終了コードを、docker logs <コンテナ> で標準出力を確認するのが第一歩です。
よくある原因
- 常駐しないコマンド:
CMD ["echo", "hello"]のように一瞬で終わるコマンドだと、出力後すぐ終了コード 0 で停止する。 - デーモンを background 起動:
nginxをdaemon off;無しで起動すると、本体がフォークして PID 1 が即終了する。 - 対話シェルの誤起動:
docker run image bashを-it無しで実行すると、入力が無く即 EOF となり終了する。 - アプリのクラッシュ: 設定ミスや例外で異常終了。
終了コードが1や137(OOM Kill)になる。
解決策
1. まず終了理由を確認する
docker ps -a # STATUS の Exited (コード) を見る
docker logs <container> # 例外やスタックトレースを確認終了コード 0 なら「正常に処理が終わった」、137 はメモリ不足等による強制終了です。
2. フォアグラウンドで常駐させる
サーバ系はフォアグラウンド実行が必須です。
# nginx をフォアグラウンドで保持
CMD ["nginx", "-g", "daemon off;"]3. 対話的に使うなら -it を付ける
docker run -it ubuntu bash-i(標準入力を保持)と -t(疑似 TTY)の両方が必要です。
デタッチで常駐させたい場合のみ -d を使い、その際は常駐プロセスを CMD に指定します。docker run のオプションは公式リファレンス(新しいタブで開く)が一次情報です。
実行例
実際に上記の手順を github-actions-runner (host docker) 上で動かすと、echo hello を CMD に指定したコンテナが出力直後に終了コード 0 で Exited となり、docker logs で hello が確認できる一方、sleep 60 を常駐コマンドとして -d 起動したコンテナは Up 状態を保つ——という記事で述べた挙動が再現されました。
$ docker run --name exits-demo alpine:3 echo hello
Unable to find image 'alpine:3' locally
3: Pulling from library/alpine
hello
run の終了コード: 0$ docker ps -a --filter name=exits-demo
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aaaa103ab09 alpine:3 "echo hello" 4 seconds ago Exited (0) Less than a second ago exits-demo$ docker logs exits-demo
hello$ docker run -d --name stays-demo alpine:3 sleep 60
f75cecb073a45deb52d95516aab273eac3292deace0014cfdb78b8ae2710c135$ docker ps --filter name=stays-demo
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f75cecb073a4 alpine:3 "sleep 60" 2 seconds ago Up 2 seconds stays-demo— 2026-08-10 時点の出力
検証環境
- 検証日
- 実行環境
github-actions-runner (host docker)
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。