自動啟動容器

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-stoppedalways 類似,不同之處在於當容器停止時 (手動或其他方式),即使在 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 結束,無論容器的重新啟動原則為何。下列範例說明了此行為。

  1. 建立一個 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
  2. 從 Dockerfile 建立映像檔。

    $ docker build -t startstop .
    
  3. 從映像檔執行容器,並將其重新啟動原則指定為 always

    容器會將數字 1..5 列印到 stdout,然後結束。這也會導致附加的 CLI 結束。

    $ docker run --restart always startstop
    Starting...
    1
    2
    3
    4
    5
    Exiting...
    $
    
  4. 執行 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
    
  5. 您可以使用 docker container attach 命令,在重新啟動之間將終端機重新附加到容器。下次容器結束時,它會再次分離。

    $ docker container attach 081991b35afe
    4
    5
    Exiting...
    $
    

使用行程管理員

如果重新啟動原則不符合您的需求,例如當 Docker 以外的行程依賴 Docker 容器時,您可以使用行程管理員,例如 systemdsupervisor

警告

不要將 Docker 重新啟動策略與主機級別的行程管理員合併使用,因為這會造成衝突。

要使用行程管理員,請將其配置為使用您通常手動啟動容器時所用的相同 docker startdocker service 命令來啟動您的容器或服務。有關更多詳細資訊,請參閱特定行程管理員的說明文件。

在容器內使用行程管理員

行程管理員也可以在容器內運行,以檢查行程是否正在運行,如果沒有則啟動/重新啟動它。

警告

這些行程管理員並非 Docker 感知,僅監控容器內的作業系統行程。Docker 不建議使用這種方法,因為它與平台相關,並且在特定 Linux 發行版本的不同版本之間可能有所不同。