--restartによるDockerリスタートポリシー
Dockerの--restartフラグを使用してcontainerの自動リスタート動作を設定する方法を学びます。4つのリスタートポリシー、ユースケース、docker stopとの相互作用について解説します。
Environment & Config
詳細な説明
Containerの自動復旧
Dockerの--restartフラグは、containerが停止した際の動作を設定します。クラッシュから自動的に復旧する必要がある本番デプロイメントに不可欠です。
4つのリスタートポリシー
# リスタートしない(デフォルト)
docker run --restart no my-app
# ゼロ以外の終了コードでリスタート
docker run --restart on-failure my-app
# 失敗時にリスタート(最大リトライ回数付き)
docker run --restart on-failure:5 my-app
# 明示的に停止しない限り常にリスタート
docker run --restart unless-stopped my-app
# docker stop + daemon再起動後も常にリスタート
docker run --restart always my-app
ポリシーの比較
| ポリシー | クラッシュ時 | docker stop時 |
daemon再起動時 |
|---|---|---|---|
no |
リスタートなし | 該当なし | 起動なし |
on-failure |
リスタート | リスタートなし | 起動なし |
on-failure:N |
リスタート(最大N回) | リスタートなし | 起動なし |
unless-stopped |
リスタート | 停止のまま | 実行中だった場合に起動 |
always |
リスタート | リスタート | 常に起動 |
指数バックオフ
Dockerはリスタート試行に指数バックオフ戦略を使用します。最初のリスタートは即座に行われ、2回目は1秒後、その後2秒、4秒、8秒、16秒と増加し、最大120秒まで延長されます。これにより、クラッシュループするcontainerが過剰なリソースを消費することを防ぎます。
unless-stoppedとalwaysの違い
重要な違いは、Dockerデーモンが再起動した場合(例:サーバーの再起動後)に現れます:
always: daemonが停止した時の状態に関係なく、containerが起動します。unless-stopped: daemonが停止した時にcontainerが実行中だった場合のみ起動します。docker stopで明示的に停止した場合、daemon再起動後も停止のままです。
ほとんどの本番サービスでは、手動停止を尊重するunless-stoppedが推奨される選択です。
実行中のContainerのリスタートポリシーを変更する
containerを再作成せずにリスタートポリシーを更新できます:
docker update --restart unless-stopped my-container
本番環境での推奨設定
# Webサーバー:常に復旧
docker run -d --restart unless-stopped --name web nginx
# データベース:常に復旧
docker run -d --restart unless-stopped --name db postgres:16
# 一回限りのタスク:一時的な障害から復旧
docker run --restart on-failure:3 --name migration my-migration-image
# 開発:リスタートなし(クラッシュを確認したい)
docker run --name dev-app my-dev-image
オーケストレーターとの連携
Docker Compose、Kubernetes、またはDocker Swarmを使用している場合、オーケストレーターがより上位のレベルでリスタートを管理します。それらの場合:
- Docker Compose:
docker-compose.ymlのrestartキーを使用します。 - Kubernetes:podのリスタートポリシーとヘルスチェックを使用します。
- Docker Swarm:レプリカを管理し、障害のあるcontainerを自動的に置き換えます。
docker runレベルでの--restart設定は、オーケストレーターで管理されていないスタンドアロンcontainerに依然として有用です。
ユースケース
本番環境のWebサーバーとデータベースをクラッシュから自動復旧するよう設定し、手動で停止したサービスはオペレーターが意図的に再起動するまで停止状態を維持するようにする場合に使用します。