--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-stoppedalwaysの違い

重要な違いは、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.ymlrestartキーを使用します。
  • Kubernetes:podのリスタートポリシーとヘルスチェックを使用します。
  • Docker Swarm:レプリカを管理し、障害のあるcontainerを自動的に置き換えます。

docker runレベルでの--restart設定は、オーケストレーターで管理されていないスタンドアロンcontainerに依然として有用です。

ユースケース

本番環境のWebサーバーとデータベースをクラッシュから自動復旧するよう設定し、手動で停止したサービスはオペレーターが意図的に再起動するまで停止状態を維持するようにする場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く