ひとことで言うと

# サーバー再起動後も自動でコンテナを起動させる
docker run -d --restart unless-stopped nginx

# 既存コンテナに再起動ポリシーを後から設定
docker update --restart unless-stopped <container_name>

やりたかったこと / 現象

コンテナがクラッシュしたり、サーバーを再起動したりすると、コンテナが自動で立ち上がってこない。本番環境で常時稼働させたいサービスに、再起動ポリシーを設定したい。


環境

  • Docker Engine 24.x 以降
  • OS: Ubuntu 22.04 / CentOS / WSL2
  • systemd で docker サービスが自動起動する設定済みであること

注意: 再起動ポリシーが効くのは Docker デーモン自体が起動している場合のみです。OS起動時に Docker サービス自体が立ち上がるよう systemctl enable docker も併せて設定してください。


解決策

再起動ポリシーの4種類

docker run -d --restart no <image>              # 再起動しない(デフォルト)
docker run -d --restart on-failure <image>       # エラー終了時のみ再起動
docker run -d --restart on-failure:5 <image>     # 最大5回まで再起動
docker run -d --restart always <image>           # 常に再起動(手動停止でも)
docker run -d --restart unless-stopped <image>   # 手動停止以外は常に再起動
ポリシー動作
no自動再起動しない(デフォルト)
on-failure[:回数]終了コードが0以外の場合のみ再起動
alwaysどんな理由で停止しても再起動。docker stop 後もデーモン再起動で復活する
unless-stoppedalways と同じだが、明示的に docker stop した場合は再起動しない

本番環境でのおすすめ

常時稼働させたいWebサーバーやDBには unless-stopped が最も扱いやすいです。

docker run -d --restart unless-stopped -p 80:80 nginx

always だと、意図的に docker stop してもデーモン再起動時に復活してしまうため、メンテナンス時に混乱しやすいです。

既存コンテナのポリシーを変更する

すでに起動しているコンテナにも後から設定できます。

docker update --restart unless-stopped my-container

複数コンテナをまとめて変更する場合:

docker update --restart unless-stopped $(docker ps -q)

docker-compose での設定

services:
  web:
    image: nginx
    restart: unless-stopped

docker compose up -d で起動すれば、自動的にこのポリシーが適用されます。

現在のポリシーを確認する

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' my-container

よくあるエラーと対処

再起動ポリシーを設定してもサーバー再起動後にコンテナが起動しない

Docker デーモン自体が自動起動していない可能性があります。

sudo systemctl enable docker
sudo systemctl status docker

Error response from daemon: no such container

コンテナ名やIDが間違っています。docker ps -a で正確な名前を確認してください。

docker ps -a
docker update --restart unless-stopped <正しいコンテナ>

on-failure を設定したのに再起動が止まらない

回数制限を指定していない場合、失敗するたびに無限に再起動を試みます。回数を指定しましょう。

docker update --restart on-failure:3 my-container

コンテナが再起動ループに陥る(CrashLoop)

アプリ側のエラーが原因で on-failurealways のループに入ることがあります。ログを確認してください。

docker logs --tail 50 my-container

よくある質問

Q: alwaysunless-stopped の違いは何ですか?
alwaysdocker stop で止めても、Dockerデーモンが再起動すると自動的にコンテナも再起動します。unless-stopped は明示的に停止した場合はデーモン再起動後も停止したままになります。

Q: 再起動ポリシーはデフォルトで何が設定されていますか?
--restart オプションを指定しない場合、デフォルトは no(自動再起動しない)です。

Q: docker-compose.ymlrestart: alwaysrestart: unless-stopped はどちらが推奨ですか?
本番運用では unless-stopped が推奨です。メンテナンスで意図的に停止した際に、予期せず再起動してしまうのを防げます。

Q: 再起動ポリシーの設定を確認するコマンドは?
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' <container_name> で確認できます。

Q: on-failure の回数制限を超えた場合はどうなりますか?
指定回数を超えて失敗すると、Dockerは再起動を諦めてコンテナは停止したままになります。


関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。