自動啟動容器
Docker 提供 重啟策略 來控制容器在退出時或 Docker 重啟時是否自動啟動。重啟策略按正確順序啟動連結的容器。Docker 建議您使用重啟策略,並避免使用程序管理器來啟動容器。
重啟策略與 dockerd
命令的 --live-restore
標誌不同。使用 --live-restore
可以在 Docker 升級期間保持容器執行,但網路和使用者輸入會中斷。
使用重啟策略
要配置容器的重啟策略,請在使用 docker run
命令時使用 --restart
標誌。--restart
標誌的值可以是以下任何一個
標誌 | 說明 |
---|---|
no | 不要自動重啟容器。(預設) |
on-failure[:max-retries] | 如果容器由於錯誤退出,則重啟容器,錯誤表現為非零退出程式碼。可選地,使用 :max-retries 選項限制 Docker 守護程序嘗試重啟容器的次數。on-failure 策略僅在容器以失敗退出時才會提示重啟。如果守護程序重啟,則不會重啟容器。 |
always | 如果容器停止,則始終重啟容器。如果手動停止,則僅在 Docker 守護程序重啟或容器本身手動重啟時才會重啟。(請參閱 重啟策略詳細資訊 中列出的第二點) |
unless-stopped | 與 always 類似,但當容器停止(手動或其他方式)時,即使 Docker 守護程序重啟,也不會重啟容器。 |
以下命令啟動一個 Redis 容器,並將其配置為始終重啟,除非容器被明確停止或守護程序重啟。
$ 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 守護程序重啟或容器手動重啟。這可以防止重啟迴圈。
重啟策略僅適用於容器。要配置 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 或 supervisor 而不是。
警告
不要將 Docker 重啟策略與主機級程序管理器結合使用,因為這會導致衝突。
要使用程序管理器,請將其配置為使用與您通常手動啟動容器相同的 docker start
或 docker service
命令啟動您的容器或服務。有關更多詳細資訊,請參閱特定程序管理器的文件。
在容器內使用程序管理器
程序管理器也可以在容器內執行,以檢查程序是否正在執行,如果未執行則啟動/重啟程序。
警告
它們不是 Docker 感知的,只監控容器內的作業系統程序。Docker 不推薦這種方法,因為它依賴於平臺,並且在給定 Linux 發行版的不同版本之間可能會有所不同。