自動啟動容器
Docker 提供重新啟動原則來控制容器在結束或 Docker 重新啟動時是否自動啟動。重新啟動原則會以正確的順序啟動連結的容器。Docker 建議您使用重新啟動原則,並避免使用行程管理員來啟動容器。
重新啟動原則與 dockerd
命令的 --live-restore
旗標不同。使用 --live-restore
可讓您在 Docker 升級期間保持容器執行,但網路和使用者輸入會中斷。
使用重新啟動原則
要設定容器的重新啟動原則,請在使用 docker run
命令時使用 --restart
旗標。--restart
旗標的值可以是下列任何一項:
旗標 | 說明 |
---|---|
no | 不要自動重新啟動容器。(預設) |
on-failure[:max-retries] | 如果容器因錯誤而結束 (顯示為非零的結束代碼),則重新啟動容器。或者,使用 :max-retries 選項限制 Docker Daemon 嘗試重新啟動容器的次數。on-failure 原則僅在容器因失敗而結束時才會提示重新啟動。如果 Daemon 重新啟動,它不會重新啟動容器。 |
always | 容器停止時一律重新啟動。如果手動停止,則僅在 Docker Daemon 重新啟動或手動重新啟動容器本身時才會重新啟動。(請參閱重新啟動原則詳細資訊中列出的第二個項目符號) |
unless-stopped | 與 always 類似,不同之處在於當容器停止時 (手動或其他方式),即使在 Docker Daemon 重新啟動後也不會重新啟動。 |
以下命令會啟動 Redis 容器,並將其設定為一律重新啟動,除非明確停止容器或 Daemon 重新啟動。
$ docker run -d --restart unless-stopped redis
以下命令會變更已在執行的容器 redis
的重新啟動原則。
$ docker update --restart unless-stopped redis
以下命令可確保所有正在執行的容器都重新啟動。
$ docker update --restart unless-stopped $(docker ps -q)
重新啟動原則詳細資訊
使用重新啟動原則時,請記住以下事項:
重新啟動原則僅在容器成功啟動後才會生效。在此情況下,成功啟動表示容器已啟動至少 10 秒,且 Docker 已開始監控它。這可以防止根本無法啟動的容器進入重新啟動迴圈。
如果您手動停止容器,則重新啟動原則會被忽略,直到 Docker Daemon 重新啟動或手動重新啟動容器為止。這可以防止重新啟動迴圈。
重新啟動原則僅適用於容器。若要設定 Swarm 服務的重新啟動原則,請參閱與服務重新啟動相關的旗標。
重新啟動前景容器
當您在前台中執行容器時,停止容器也會導致附加的 CLI 結束,無論容器的重新啟動原則為何。下列範例說明了此行為。
建立一個 Dockerfile,列印數字 1 到 5,然後結束。
FROM busybox:latest COPY --chmod=755 <<"EOF" /start.sh echo "Starting..." for i in $(seq 1 5); do echo "$i" sleep 1 done echo "Exiting..." exit 1 EOF ENTRYPOINT /start.sh
從 Dockerfile 建立映像檔。
$ docker build -t startstop .
從映像檔執行容器,並將其重新啟動原則指定為
always
。容器會將數字 1..5 列印到 stdout,然後結束。這也會導致附加的 CLI 結束。
$ docker run --restart always startstop Starting... 1 2 3 4 5 Exiting... $
執行
docker ps
會顯示仍在執行或重新啟動中,這要歸功於重新啟動原則。但是,CLI 工作階段已結束。它無法在初始容器結束後繼續存在。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 081991b35afe startstop "/bin/sh -c /start.sh" 9 seconds ago Up 4 seconds gallant_easley
您可以使用
docker container attach
命令,在重新啟動之間將終端機重新附加到容器。下次容器結束時,它會再次分離。$ docker container attach 081991b35afe 4 5 Exiting... $
使用行程管理員
如果重新啟動原則不符合您的需求,例如當 Docker 以外的行程依賴 Docker 容器時,您可以使用行程管理員,例如 systemd