インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

Dockerコンテナが起動しない・すぐ停止する原因と確認手順

Exited・Restartingなど、Dockerコンテナが期待どおり動かない場合の障害調査です。原因が分からないうちにrestartやrmを繰り返さないことを優先します。

この記事の目的

Docker daemonへの接続障害と、コンテナ内アプリの終了を分け、ログ・終了コード・設定を順番に調べます。

最初にやること

docker context show→docker ps -a→docker logs→docker inspectで状況を記録します。

注意:docker rm -fやdocker compose down -vを初手で実行しないでください。web01などのコンテナ名、Composeサービス名・ポートは例です。Docker context・ホスト・保存先を実環境で確認してください。

1. 最初に確認する4コマンド

docker context show docker ps -a docker logs --tail 100 --timestamps web01 docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.RestartCount}}' web01

コマンドに指定するコンテナ名は、docker ps -aで確認したものに置き換えます。docker inspectの全出力はSecretsや環境変数を含む場合があります。

2. ExitedとRestartingを分ける

結果確認すること
Exited (0)常駐サービスではなく正常に終了する一時ジョブか確認
Exited (1)等アプリログ、起動引数、設定、環境変数を確認
Exited (137)SIGKILL・OOMKilledの真偽・ホスト側イベントを確認。137だけでOOMと断定しない
Restartingrestart policy、終了コード、前回ログを確認
daemon接続エラーDocker context、daemon、ソケット権限、接続環境を確認

3. 終了理由とアプリHealthを分ける

# 参照のみ:終了理由・OOM・ヘルス状態(healthcheck未設定なら値はない) docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}}' web01 docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}healthcheck-not-configured{{end}}' web01 docker logs --tail 100 --timestamps web01
結果判断・次の調査
ExitCode 0でExited正常終了型ジョブか常駐サービスかを確認。常駐想定ならCMD・ENTRYPOINT・アプリログを調査
ExitCode 137SIGKILLによる終了の可能性。OOMKilled、ホストメモリ、管理者操作・終了猶予を照合し、137だけでOOMと断定しない
runningでunhealthyプロセスは生存。Healthcheckの実行結果とアプリ依存先を確認して原因を切り分ける
healthcheck-not-configured正常・異常は未判定。業務エンドポイントやアプリログなど別の確認方法を使う

繰り返し再起動する前に証跡を確保し、設定変更後は起動状態だけでなく業務機能が復旧したことを確認してください。

4. OOMとホストのリソース不足

docker inspect --format '{{.State.OOMKilled}}' web01 docker inspect --format '{{.HostConfig.Memory}}' web01 docker stats --no-stream web01 journalctl -k -b --since '1 hour ago' --no-pager

OOMKilledがtrueであればメモリ不足で強制終了した重要な根拠です。メモリ上限・ホストメモリ・コンテナの起動プロセスを合わせて判断します。

Linuxのメモリ不足・高負荷ガイドでホスト側の調査もできます。

5. ポート・マウント・権限

# 実コンテナ名へ置き換える docker port web01 docker inspect --format '{{json .Mounts}}' web01 docker inspect --format '{{json .Config.Cmd}}' web01 ss -lnt

address already in useはホスト側のポート競合、permission deniedは実行ユーザー・ファイル権限・SELinux等の問題が考えられます。

注意:--privilegedや無制限のchmodを、原因不明の権限エラーの暫定対処に使わないでください。

6. Docker Composeで起動しない

docker compose config -q docker compose ps -a docker compose logs --tail 100 docker compose config --services

Composeファイル、環境変数、実行プロジェクト、アプリのログを照合します。詳しい設定検証はCompose設定と安全な反映ガイドを参照してください。

7. 復旧時の注意と再確認

危険:ログ保存前にコンテナを削除したり、障害原因不明のまま何度も再作成したりしないでください。コンテナ内だけのデータが消える可能性があります。

修正したら、docker ps -aの稼働状態だけでなく、アプリ応答、ログ、restart回数、保存データを確認してから完了とします。

関連する確認手順:ポートが既に使われている場合。

関連する確認手順:Docker daemonへ接続できない場合。

8. 終了コード・状態別の対処方針

終了コード単独では根本原因を断定できません。まずDocker context、終了理由、直前ログ、RestartPolicyを照合します。以下の出力例は説明用の想定例で、実機実測ではありません。

docker context show docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.RestartCount}}' web01 docker inspect --format '{{json .HostConfig.RestartPolicy}}' web01 docker logs --tail 100 --timestamps web01
# 出力例(想定) exited 137 true 3
観測結果原因を絞るための確認次に取る行動
Exited (0)一時ジョブなら正常終了か、常駐サービスのはずなのか一時ジョブなら正常。常駐サービスならENTRYPOINT/CMD・起動設計を確認し、管理元の定義を修正
Exited (1)等直前ログの設定ファイル、環境変数、パス、権限エラー表示された原因だけを管理元で修正し、Compose設定検証を実施
137 + OOMKilled=trueホストのOOM記録、メモリlimits・使用推移制限不足か異常なメモリ増加かを区別。必要な容量計画やアプリ修正を判断し、無条件に制限を撤廃しない
137 + OOMKilled=falseSIGKILL、daemon再起動、ホスト操作履歴終了時刻とjournalを照合。OOMと決めつけてメモリ設定を変更しない
Restarting再起動ポリシー、終了ログ、設定変更履歴繰り返し終了する原因を修正。ポリシーを外して症状を隠さない
Createdで起動不能ポート競合、mountエラー、daemonの状態ポート競合やdaemon接続へ原因別に分岐

9. 設定修正から復旧判定まで

出力例(想定・実測ではありません):

$ docker logs --tail 5 web01 error: cannot load /etc/app/config.yaml: no such file or directory

この場合はアプリの期待パスと、Composeのbind mountやVolume設定を照合します。ファイルを無条件で新規作成したり、コンテナをprivilegedにしたりせず、管理元で正しいパス・権限を修正してください。

変更前:対象ホスト・Composeプロジェクト・イメージ参照・設定差分・Volumeのデータ・バックアップ・停止影響を記録。docker compose up -dは再作成が起こり得るため、承認後にのみ反映します。切り戻しは元の設定とイメージを管理元から再適用し、データ互換性を別途検証します。
# 読み取り:変更後の合否 docker compose config -q docker compose ps -a docker compose logs --tail 100 docker inspect --format '{{.State.Status}} {{.RestartCount}}' web01
変更後の結果完了・未解決の判断
runningを維持し、ログとアプリの実接続が正常復旧候補。業務機能・依存先・監視も確認して完了
RestartCountが継続して増加未解決。前回ログと変更差分へ戻り、原因を再調査
runningだが接続できないアプリlisten・公開ポート・依存先を確認。docker psだけで完了にしない
原因を特定できない終了コード・ログ・ホスト時刻・直近変更を記録してアプリ担当へ連携

公式・一次資料

関連手順を確認する

参照操作・変更操作・削除操作を区別し、作業前後に対象と正常性を記録します。

関連ガイドへ