Dockerには、特定のイベントや障害が発生した場合にコンテナーを自動的に再起動できるようにする再起動ポリシーオプションが用意されています。
これは、Dockerホスト(Linuxサーバー)を再起動する必要があるシナリオや、コンテナーで実行されているサービスに障害が発生した場合に非常に役立ちます。
Dockerの再起動ポリシーは、コンテナーごとに適用されます。再起動ポリシーをコンテナに割り当てるには、2つの方法があります。 Docker Compose、Swarm、Kubernetesを使用する場合は、YAMLファイルで設定できます。
コンテナを実行するときに、コマンドラインで直接再起動ポリシーを設定することもできます。
docker container run --restart <policy>
使用できる再起動ポリシーの種類について話しましょう。
Dockerコンテナには次の再起動ポリシーがあります:
- いいえ:デフォルトの動作では、コンテナは自動的に起動されません
- 常に:コンテナが明示的に停止されていない限り、停止されたコンテナを常に再起動します
- unless-stopped:Dockerデーモンが停止する前にコンテナーが停止状態になっていない限り、コンテナーを再起動します(後で説明します)
- 失敗時:コンテナがゼロ以外の終了コードで終了した場合、またはdockerデーモンが再起動した場合は、コンテナを再起動します
前述したように、再起動ポリシーを明示的に追加しない場合は、「no」が表示されます。これは、コンテナが自動的に再起動されないことを意味します。
Docker再起動ポリシーの説明と例
実際に視覚化できるように、これらのポリシーの実際の動作を示しましょう。これは、always
の違いを理解するのに特に役立ちます およびunless-stopped
ポリシー。
always
から始めましょう ポリシーを再起動します。このポリシーを設定すると、明示的に停止されない限り、コンテナは常に再起動されます。
always
でAlpineLinuxコンテナを実行します ポリシーを再起動します。私はそれをalways-policyと名付けています。
コンテナには1つのタスクがあります。 bash sleepコマンドを10秒間実行してから、終了します。
docker container run --name always-policy --restart always alpine sleep 10
always
なし ポリシーを再起動すると、コンテナは10秒後に停止します。ただし、ここでは自動的に再起動し、sleepコマンドをさらに10秒間実行すると、このように続行されます。
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 25 seconds ago Up 4 seconds always-policy
上記のコマンドで、コンテナは25秒前に作成されましたが、稼働しているのは4秒だけであることがわかります。同じコンテナが再起動され、新しいコンテナは作成されないことに注意してください。
docker inspectコマンドを使用して、コンテナがこれまでに再起動された回数を確認できます。
[email protected]:~$ docker inspect always-policy | grep -i restartcount
"RestartCount": 4,
stopコマンドでコンテナを停止した場合、その後自動的に再起動することはありません。以下の例では、コンテナのステータスがUpではなく「Exited」になっていることがわかります。
[email protected]:~$ docker stop always-policy
always-policy
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 58 seconds ago Exited (0) 6 seconds ago always-policy

-it
を使用しました 上のスクリーンショットのインタラクティブ端末でコンテナを実行するためのオプション。それは習慣から外れていて、ここでは不要でした。
unless-stopped vs always restart policy
unless-stopped
always
に似ています ポリシーを再起動します。どちらもコンテナを自動的に再起動し、コンテナを明示的に停止しても再起動しません。
ただし、この2つの主な違いは、docker stopコマンドを使用してコンテナーを停止してから、dockerデーモンを再起動すると、コンテナーはalways
で再起動することです。 再起動ポリシーはコンテナを自動的に起動しますが、unless-stopped
のコンテナ ポリシーは再開されません。
例を挙げて説明します。常に再起動ポリシーで停止したコンテナがすでにあります。 unless-stopped-policyという名前の新しいコンテナを作成しましょう unless-stopped
ポリシー。
docker container run --name unless-stopped-policy --restart always alpine sleep 10
コンテナを停止します:
docker stop unless-stopped-policy
これで、明示的に停止された2つのコンテナがあります:
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d244b6e08899 alpine "sleep 10" 2 minutes ago Exited (0) About a minute ago unless-stopped-policy
1171dcfb7e06 alpine "sleep 10" 22 minutes ago Exited (0) 21 minutes ago always-policy
Dockerデーモンを再起動します:
sudo systemctl restart docker
実行中のコンテナーを確認すると、always-policyという名前のコンテナーがalways
で設定されているため、実行中であることがわかります。 ポリシーを再起動します。
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 30 minutes ago Up 8 seconds always-policy
手順全体は、次のスクリーンショットで確認できます:

on-failure
コンテナがゼロ以外の終了コード(エラー/失敗を示す)で終了した場合、再起動ポリシーはコンテナを再起動します。また、以前に停止状態だったものを含め、dockerデーモンが再起動した場合は、コンテナーを再起動します。
docker stopコマンドを使用してコンテナを手動で停止すると、すべてが正常であることを示すコード0でコンテナが存在します。
DockerComposeファイルでの再起動ポリシーの設定
これで、再起動ポリシーを使用してコンテナを実行することについて、かなり良いアイデアが得られました。
Docker Composeのようなものをコンテナのデプロイに使用している場合は、YAMLファイルでサービスオブジェクトの再起動ポリシーを指定できます。
サンプル例を次に示します。
version: "3.3"
services:
NginxProxy:
image: "jwilder/nginx-proxy:latest"
restart: "on-failure"
networks: ["net"]
ports:
- "80:80"
- "443:443"
どのDocker再起動ポリシーを使用しますか?
正直なところ、この質問に対する直接的な答えはありません。それはあなたのユースケースとあなたが望むものに依存します。
この記事がDockerの再起動ポリシーを理解するのに役立つことを願っています。ご質問やご提案がございましたら、コメント欄でお知らせください。