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とは?コンテナでアプリを動かす仕組みを初心者向けに解説

Dockerコンテナと仮想マシンの違いとは?仕組みを比較

Linuxサーバーのメモリ不足を確認する方法|free・topで原因を調べる手順

Linuxサーバーが重い・遅いときの原因と確認方法|CPU・メモリ・ディスクを順番に調べる

Linuxのポートが開いているか確認する方法|ss・nc・curlで接続障害を切り分ける

類似投稿