コンテナを自動的に開始

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 コンテナを起動し、明示的にコンテナを停止をしなければ、Docker の再起動時も含め、常に Redis コンテナを再起動する設定です。明示的に停止すると、Docker を再起動しても Redis コンテナは起動しません。

$ 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 サービスに対する再起動ポリシーの設定とは異なります。 サービス再起動に関連するフラグ をご覧ください。

プロセス・マネージャの使用

Docker コンテナと Docker 外のプロセスに依存する場合のように、再起動ポリシーの必要性がなければ、これにかわって upstartsystemdsupervisor のようなプロセス・マネージャを利用できます。

警告

Docker 再起動ポリシーとホストレベルのプロセス・マネージャの同時利用は、設定上の競合を引き起こすため、同時に使わないでください。

プロセス・マネージャを使うには、 docker startdocker service コマンドでコンテナやサービスを起動するのと同じように、コンテナを手動で通常どおり起動するように設定します。詳細については、それぞれのプロセス・マネージャのドキュメントを参照ください。

プロセス・マネージャの中でコンテナを使う

プロセス・マネージャも、その中でコンテナのプロセスが実行しているかどうかを確認し、実行していなければ起動や再起動が行えます。

警告

これは Docker からは関知できず、オペレーティングシステムのプロセスの中にコンテナが単に存在するだけです。このアプローチを Docker は推奨していません。理由はプラットフォームに依存するのと、Linux ディストリビューションのバージョンによって対処方法が異なるからです。