導入
本番のサーバーは、コンテナが落ちたり、サーバーが再起動したりしても、勝手に立ち上がってほしいものです。それを実現するのが 再起動ポリシー(--restart)。あわせて、「動いてはいるが正常か」を見張る ヘルスチェック の考え方も押さえます。
説明
docker run に --restart <ポリシー> を付けると、コンテナが停止したときの振る舞いを決められます。
docker run -d --restart always -p 8080:80 --name web nginx
代表的なポリシーは3つです。
| ポリシー | 意味 |
|---|---|
no(既定) | 止まっても何もしない |
on-failure | 異常終了(エラー)したときだけ再起動する |
always | 止まったら常に再起動する(サーバー再起動後も立ち上がる) |
unless-stopped | always に近いが、手動で止めたときは復活させない |
flowchart TD
A["コンテナが停止"] --> B{"--restart は?"}
B -->|"no"| C["そのまま停止"]
B -->|"on-failure"| D["エラー終了なら再起動"]
B -->|"always / unless-stopped"| E["自動で再起動<br/>(サーバー再起動後も)"]
これは Linux コースの systemctl enable(第7章:再起動後も自動起動)と同じ発想です。設定したポリシーは docker inspect で確認できます。
docker inspect web
"RestartPolicy": { "Name": "always" } と記録されていれば、自動復活が有効です。
もう1つ大切なのが ヘルスチェック。コンテナは「プロセスが動いている=正常」とは限りません(応答が固まっていても、プロセスは生きていることがある)。そこで Dockerfile に HEALTHCHECK を書くと、Docker が定期的に「本当に応答するか」を確かめてくれます。
FROM nginx
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
flowchart LR
A["Docker が定期的に<br/>HEALTHCHECK を実行"] --> B{"応答した?"}
B -->|"はい"| C["healthy(健全)"]
B -->|"いいえ"| D["unhealthy(異常)<br/>→ 通知・入れ替えの合図"]
ヘルスチェックを付けると、docker ps の STATUS に (healthy) / (unhealthy) が表示され、「動いてはいるが応答しない」状態を検知できます。Linux コースの curl -I で 200 OK を確かめる監視(第6章)を、Docker が自動でやってくれるイメージです。
やってみよう
docker run -d --restart always -p 8080:80 --name web nginxを実行し、docker inspect webの"RestartPolicy"がalwaysになっていることを確認しましょう。--restart on-failureに変えて起動し直すと、ポリシーが変わることも見てください。