Dockerコンテナが再起動を繰り返すときの原因と確認方法|restart loopを調べる
Dockerでコンテナを起動したのに、しばらくすると停止してしまったり、何度も再起動を繰り返したりすることがあります。
docker psを見るとコンテナが動いているように見えても、実際には起動と停止を短時間で繰り返しているケースもあります。
このような状態では、単純にdocker restartを繰り返すよりも、コンテナのログ・終了コード・起動コマンド・環境変数・ボリュームなどを順番に確認することが重要です。
Dockerコンテナが再起動を繰り返す原因
コンテナが再起動を繰り返す原因には、いくつかのパターンがあります。
代表的なのは次のようなケースです。
- アプリケーションが起動直後にエラーで終了している
CMDやENTRYPOINTの設定に問題がある- 環境変数が不足している
- 設定ファイルが存在しない
- データベースへ接続できない
- ポートやファイルの設定に問題がある
- ボリュームのマウント先が間違っている
- restart policyによって自動再起動している
- メモリ不足などでプロセスが終了している
まずは、コンテナがなぜ終了しているのかを確認する必要があります。
まずdocker psで状態を確認する
現在動作しているコンテナを確認します。
docker ps
停止しているコンテナも含めて確認する場合は、
docker ps -a
を使います。
例えば、
CONTAINER ID IMAGE STATUS
abc123 myapp Restarting (1) 5 seconds ago
のように表示されていれば、コンテナが起動と停止を繰り返しています。
Restartingと表示されている場合は、次にログを確認します。
docker logsで原因を確認する
コンテナのトラブルでは、まずdocker logsを確認するのが基本です。
docker logs コンテナ名
大量のログがある場合は、
docker logs --tail 100 コンテナ名
とすると最後の100行だけ確認できます。
リアルタイムでログを確認する場合は、
docker logs -f コンテナ名
を使います。
再起動を繰り返している場合は、起動直後に表示されるエラーを確認してください。
例えば、
Error: Cannot find module
や、
Connection refused
などのメッセージがあれば、アプリケーションや接続先に原因がある可能性があります。
コンテナの終了コードを確認する
ログだけでは原因が分からない場合は、コンテナの状態を詳しく確認します。
docker inspect コンテナ名
特に確認したいのがStateの情報です。
必要な部分だけ確認するなら、
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.Error}}' コンテナ名
とできます。
例えば、
exited 1
なら、アプリケーションがエラー終了している可能性があります。
終了コードだけで原因を断定することはできませんが、ログと合わせて確認すると切り分けに役立ちます。
アプリケーション自体が終了していないか確認する
Dockerコンテナは、中で動いているメインプロセスが終了すると、基本的にコンテナも終了します。
例えば、
CMD ["python", "app.py"]
となっている場合、app.pyがエラーで終了すればコンテナも停止します。
そのため、Dockerそのものではなく、コンテナ内のアプリケーションが終了していないかを確認することが重要です。
ログにアプリケーションのエラーが出ていないか確認しましょう。
CMDやENTRYPOINTを確認する
DockerfileのCMDやENTRYPOINTに問題がある場合も、コンテナが起動直後に停止します。
例えば、
CMD ["node", "server.js"]
となっている場合、コンテナ内にserver.jsが存在しなければ起動できません。
イメージの設定を確認するには、
docker inspect コンテナ名
を使います。
また、イメージの情報を確認する場合は、
docker image inspect イメージ名
も利用できます。
ファイルが存在するか確認したい場合は、コンテナが起動している時間が短いとdocker execが使えないことがあります。
その場合は、同じイメージから一時的なコンテナを起動して確認する方法もあります。
環境変数を確認する
アプリケーションによっては、起動時に環境変数が必要です。
例えば、
DATABASE_HOST
DATABASE_USER
DATABASE_PASSWORD
APP_ENV
などです。
必要な環境変数が設定されていないと、アプリケーションが起動直後に終了することがあります。
設定されている環境変数を確認する場合は、
docker inspect コンテナ名
からEnvの情報を確認できます。
ただし、パスワードやAPIキーなどの秘密情報をログや記事、画面共有にそのまま表示しないよう注意してください。
データベースへの接続エラーを確認する
Webアプリケーションなどでは、起動時にMySQLやPostgreSQLなどへ接続することがあります。
例えば、
Application
↓
MySQL
という構成で、MySQLが起動していなかったり、接続先が間違っていたりすると、アプリケーションが終了する場合があります。
Docker Composeを使用している場合は、
docker compose ps
で関連するコンテナの状態を確認します。
さらに、
docker compose logs
でサービス全体のログを確認できます。
Docker Composeの設定を確認する
Docker Composeを使用している場合は、compose.ymlやdocker-compose.ymlの設定も確認します。
例えば、
services:
app:
restart: always
となっている場合、アプリケーションが終了するとDockerが自動的に再起動します。
そのため、
アプリケーション起動
↓
エラー
↓
プロセス終了
↓
Dockerが再起動
↓
再びエラー
という状態が続くことがあります。
この場合、再起動を止めるだけでは原因が解決しません。
まずログを確認して、なぜアプリケーションが終了しているのかを調べる必要があります。
restart policyを確認する
コンテナの再起動設定は、
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' コンテナ名
で確認できます。
例えば、
always
や、
unless-stopped
などが設定されている場合、コンテナ終了後に自動的に再起動されることがあります。
この設定によって「Dockerが壊れている」ように見えることがありますが、実際にはアプリケーションが終了しているだけというケースもあります。
ポート設定を確認する
アプリケーションが使用するポートが正しく設定されているか確認します。
docker port コンテナ名
例えば、
3000/tcp -> 0.0.0.0:3000
のように表示されます。
ただし、ポート設定が間違っている場合でも、必ずコンテナ自体が再起動するとは限りません。
「コンテナは動いているのにアクセスできない」場合と「コンテナが再起動を繰り返す」場合は分けて考えましょう。
ボリュームの設定を確認する
設定ファイルやデータをホスト側からマウントしている場合、ボリューム設定が原因になることがあります。
例えば、
volumes:
- ./config:/app/config
という設定がある場合、ホスト側の./configに必要なファイルが存在するか確認します。
ls -la ./config
マウント先の設定が想定と違っていると、アプリケーションが必要なファイルを読み込めず終了することがあります。
メモリ不足で終了していないか確認する
コンテナが突然終了する場合は、メモリ不足も確認します。
ホスト側のメモリ使用状況は、
free -h
で確認できます。
Dockerコンテナの状態については、
docker stats
も利用できます。
メモリ不足によってプロセスが強制終了されている場合、通常のアプリケーションエラーとは違った形でログに現れることがあります。
サーバー全体の負荷も合わせて確認してください。
再起動を止めて原因を調べる方法
再起動を繰り返してログを確認しにくい場合は、まずコンテナを停止します。
docker stop コンテナ名
そのうえで、restart policyなどの設定を確認します。
原因を修正したあと、
docker start コンテナ名
で起動します。
Docker Composeの場合は、
docker compose up
として、ターミナル上に表示されるログを直接確認する方法もあります。
問題の原因を確認する目的では、バックグラウンドで起動する-dを使わず、ログを見ながら起動するのも有効です。
Dockerコンテナが再起動を繰り返すときの確認コマンド
| 確認内容 | コマンド |
|---|---|
| コンテナ状態 | docker ps -a |
| ログ確認 | docker logs コンテナ名 |
| 最新ログ | docker logs --tail 100 コンテナ名 |
| 詳細情報 | docker inspect コンテナ名 |
| 終了コード | docker inspect -f '{{.State.ExitCode}}' コンテナ名 |
| 再起動設定 | docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' コンテナ名 |
| ポート確認 | docker port コンテナ名 |
| リソース確認 | docker stats |
| Compose状態 | docker compose ps |
| Composeログ | docker compose logs |
Dockerコンテナの再起動で注意したいこと
restartを繰り返すだけでは原因は直らない
docker restart コンテナ名
を何度実行しても、アプリケーションが同じエラーで終了していれば再起動を繰り返すだけです。
まずdocker logsを確認しましょう。
ログだけで原因を断定しない
ログにエラーが表示されても、それが直接の原因とは限りません。
例えばデータベース接続エラーが出ている場合、データベース側が停止している可能性もあります。
関連するコンテナやサービスも確認してください。
秘密情報をログに残さない
環境変数やアプリケーションログにパスワード、APIキー、アクセストークンなどが含まれる場合があります。
ログを共有したり、トラブルシューティング記事に掲載したりする場合は、秘密情報を削除・マスクしてから扱いましょう。
まとめ
Dockerコンテナが再起動を繰り返すときは、Docker自体を疑う前に、コンテナ内のメインプロセスがなぜ終了しているのかを確認することが重要です。
まず、
docker ps -a → docker logs → docker inspect → restart policy → 環境変数・設定 → データベース・依存サービス
の順番で確認すると、原因を切り分けやすくなります。
特にRestartingと表示されている場合は、自動再起動設定によって同じエラーが何度も繰り返されている可能性があります。
再起動そのものを止めることだけを目的にせず、ログと終了状態を確認して、アプリケーションが終了する原因を一つずつ調べることが大切です。
Dockerコンテナが再起動を繰り返すのはなぜですか?
コンテナ内のメインプロセスがエラーで終了し、restart policyによって自動的に再起動されているケースが多くあります。
まずdocker logsで起動直後のエラーを確認してください。
DockerのRestartingを確認するにはどうすればいいですか?
docker ps -a
を実行すると、コンテナの状態を確認できます。
Restartingと表示されている場合は、起動と停止を繰り返している状態です。
docker logsで何も分からない場合はどうすればいいですか?
docker inspectで終了コード、起動コマンド、環境変数、restart policyなどを確認してください。
さらに、Docker Composeを使用している場合はdocker compose logsで関連サービスのログも確認します。
restart policyを無効にすれば解決しますか?
自動再起動を止めることで原因を調べやすくなる場合はありますが、アプリケーションが終了する根本原因が解決するわけではありません。
ログや終了コードを確認して原因を修正することが重要です。
Dockerコンテナが起動しないときの確認方法|docker ps・logsで原因を調べる手順
Dockerとは?コンテナでアプリを動かす仕組みを初心者向けに解説
Linuxサーバーのメモリ不足を確認する方法|free・topで原因を調べる手順
