コンテナーの自動起動

Docker では 再起動ポリシー (restart policy) が提供されています。 これは Docker の停止や再起動を指示した場合に、コンテナーを自動的に起動するかどうかを制御するものです。 再起動ポリシーを使えば、リンクしているコンテナーは確実に正しい順番で起動させることができます。 Docker ではこの再起動ポリシーを利用することが推奨されています。 プロセスマネージャーを利用してコンテナーを起動することはやめてください。

再起動ポリシーはdockerdコマンドの--live-restoreフラグとは異なります。 --live-restoreは Docker のアップグレード中にコンテナーを起動し続けるものですが、ネットワーク接続やユーザー入力は遮断されます。

再起動ポリシーの利用

コンテナーに対して再起動ポリシーを設定するには、docker runコマンド実行時の--restartフラグを用います。 --restartフラグには以下に示す値を指定することができます。

フラグ 内容説明
no コンテナーを自動では再起動しません。(デフォルト)
on-failure[:max-retries] エラー発生により停止したコンテナーを再起動します。非ゼロの終了コードが返ります。任意として、:max-retriesオプションを使って Docker デーモンによるコンテナー再起動回数を制限します。
always コンテナー停止時に常に再起動します。手動で停止させた場合は、Docker デーモン再起動時、あるいはコンテナーそのものが手動で再起動された場合のみ再起動します。 (再起動ポリシーの詳細 における 2 項めを参照してください。)
unless-stopped alwaysと同様。ただしコンテナーが(手動またはその他によって)停止した場合は除きます。Docker デーモンが再起動した場合には再起動しません。

以下の例は Redis コンテナーを起動する際に、常に (always) 再起動するように設定していますが、ただし明示的に停止した場合や Docker が再起動された場合には再起動しないという設定です。

$ docker run -d --restart unless-stopped redis

以下のコマンドは、redisというすでに起動されているコンテナーの再起動ポリシーを変更します。

$ docker update --restart unless-stopped redis

また以下のコマンドは、現在あるコンテナーの中で、停止されていてないものはすべて再起動します。

$ docker update --restart unless-stopped $(docker ps -q)

再起動ポリシーの詳細

再起動ポリシーの利用にあたっては以下の点に注意してください。

  • 再起動ポリシーが処理適用されるのは、コンテナーが正常に起動した後です。 この正常に起動というのは、コンテナーの起動から 10 秒以上が経過し Docker がこれを監視し始めたときです。 このようになっているのは、コンテナーが全く起動していないまま再起動ループに陥ることがないようにするためです。

  • コンテナーを手動で停止した場合は、Docker デーモンの再起動、あるいはコンテナーの手動再起動を行わない限り、再起動ポリシーは無視されます。 これも再起動ループを避けるための動作です。

  • 再起動ポリシーが適用されるのは コンテナー に対してのみです。 Swarm サービスに対する再起動ポリシーは、別の方法により設定します。 service restart に対するフラグ を参照してください。

プロセスマネージャーの利用

Docker 外部にあるプロセスが Docker コンテナーに依存するような場合、再起動ポリシーの利用は適当ではありません。 この場合は upstartsystemdsupervisor といったプロセスマネージャーを利用します。

警告

Docker の再起動ポリシーとホストのプロセスマネージャーを組み合わせた利用は避けてください。 これを行うと衝突が発生します。

プロセスマネージャーを利用する場合は、普段コンテナー起動を手動で行っているときと同じコマンド docker startまたはdocker serviceを使って、コンテナーを起動するように設定してください。 詳しくは個々のプロセスマネージャーのドキュメントを参照してください。

コンテナー内部のプロセスマネージャーの利用

プロセスマネージャーはコンテナー内部において起動させることができます。 このプロセスマネージャーから、プロセスの実行状態を確認したり、起動、再起動を行うこともできます。

警告

この場合は Docker が察知できる状況ではなくなり、コンテナー内のオペレーティングシステムのプロセスをただ監視するだけになります。 Docker ではこの方法を推奨しません。 これはプラットフォームに依存する話であり、利用する Linux ディストリビューションの各バージョンによって異なるからです。

containers, restart, policies, automation, administration