Docker再起動ポリシーを使用してコンテナを常に稼働させる方法
Dockerは、コンテナのライフサイクルを管理するためのいくつかのオプションを提供します。コンテナは通常、終了した後に自動的に再起動しません。再起動ポリシーを使用することで、個々のコンテナのライフサイクルを管理することができます。
コンテナが停止すると再起動ポリシーが使用されます。また、Dockerはデーモンが起動するときにも再起動ポリシーを確認します。このメカニズムを使用して、再起動後にホストとともにコンテナを起動することができます。
利用可能なポリシー
現在、4つの異なる再起動ポリシーがあります。
no- このポリシーはコンテナを自動的に起動することはありません。これは、作成されたすべてのコンテナのデフォルトポリシーです。docker runalwayson-failure- コンテナはエラーによって停止した場合に再起動されます。デーモンが再起動した後、Docker はコンテナを起動しません。unless-stoppedalways
- Dockerはコンテナが常に実行されるようにします。コンテナが停止した場合、すぐに再起動されます。docker stopを使用して手動でコンテナを停止することもできますが、次回デーモンが再起動する際にDockerはそれを再起動します。
- これは . に似た機能です。その違いは、Dockerが手動で停止されたコンテナを再起動することは決してないということです。
通常、プロダクションワークロードでは、最後の3つのオプションのいずれかを使用します。Dockerコンテナは、長時間実行されるバックグラウンドサービスにしばしば使用されるため、何か問題が発生した際には、通常、再起動するようにしたいものです。noポリシーは、ローカル開発に最適です。また、単一の実行可能ファイルを実行してから終了するユーティリティコンテナにも便利です。
どの再起動ポリシーを使用するか決めるのは難しいことがあります。
alwaysしばしば最も自然な選択ですが、デーモンの再起動動作は簡単に見落とされることがあります。docker stopを実行した後、コンテナが確実に停止したままにしたい場合は、次を使用するべきです。
unless-stoppedDockerはコンテナのフォアグラウンドプロセスから出力された終了コードに基づいてエラーを検出します。終了コードは
1またはそれ以上はエラーとして解釈されます。これは、終了コードの扱いにおいてUnixと一致します。
0成功した実行を表します。
Dockerがコンテナを再起動する時、それは実行することと同等です。
docker run再び。それは画像のことを意味します。
ENTRYPOINT
スクリプトが実行されます。ブートストラップシステムは常に複数の呼び出しに対して堅牢であるべきです。
再起動ポリシーの適用
特定の再起動ポリシーでコンテナを起動するには、
--restartフラグを
docker run:
docker run --name httpd --restart always httpd:latestDocker Composeを使用している場合は、docker-compose.ymlにrestartフィールドを追加してください:
services:
httpd:
image: httpd:latest
restart: always
既存のコンテナの再起動ポリシーは、docker updateを使用して変更できます。コマンドにコンテナの名前を渡します。コンテナの名前は、docker ps -aを実行することで見つけることができます。
docker update --restart-policy unless-stopped httpd実行中または停止中のコンテナに対して docker update を使用できます。
再起動ループ
Dockerには、永久再起動ループに対するいくつかの安全策が含まれています。最初のものは、再起動ポリシーが有効になる前の必須の時間遅延です。Dockerは、コンテナが少なくとも10秒間実行されるまで再起動の監視を開始しません。これにより、失敗したコンテナが継続して再起動するのを防ぐことができます。
もう一つの専門的な挙動は、docker stop コマンドに関するものです。Dockerは常に docker stop の使用を尊重するため、コマンドを実行した後にコンテナはすぐには再起動しません。実際にコンテナを再起動したい場合は、その代わりに docker restart を使用してください。
再起動の再試行を制限する
on-failure 再起動ポリシーでは、試行すべき再試行回数を指定できます。Dockerは、連続して複数回起動に失敗した場合は、諦めてコンテナを停止状態にします。
docker run httpd:latest --restart on-failure:5この例では、Dockerは失敗(ゼロ以外の終了コード)の後にコンテナを5回再起動しようとします。5回目の試行でコンテナが起動に失敗した場合、これ以上の再試行は行われません。このオプションは、手動介入なしでは持続的な起動エラーが解決される可能性が低いコンテナに便利です。
コンテナが停止した理由の調査
コンテナが停止した理由を知りたい場合は、docker ps -aを実行してください。これにより、すべてのコンテナの詳細(停止中または実行中)が表示されます。対象のコンテナを見つけて、その「ステータス」列を確認してください。停止したコンテナの場合、終了コードが括弧内に表示されます。コードがゼロより大きい場合、そのコンテナはエラーにより終了しました。
コンテナ内で実行されているプロセスのドキュメントを参照して、個々のエラーコードの意味を確認する必要があります。ただし、コンテナのログを取得することで、クラッシュの原因についての洞察を得ることができることがよくあります。ログは、コンテナが停止した後も利用可能です。
docker logs my-containerログストリームはコンテナの標準出力と標準エラーストリームを集約します。エラーが記録されている場合、出力の最後の数行にそれが表示されることを期待するべきです。
要約
再起動ポリシーは、必要なときにDockerコンテナが存在することを確実にするのに役立ちます。デフォルトのnoポリシーはほとんどの本番ワークロードには適していません。コンテナがクラッシュした場合に停止したままになるのは避けたいですよね!
3つの再起動可能なポリシーの1つを使用することで、コンテナはハードウェアの再起動や予期しない終了に対してより耐性を持ちます。Dockerは、コンテナがクラッシュした場合でもサービスの可用性を維持します。

