自動啟動容器

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-stoppedalways 類似,不同之處在於,當容器停止時(手動或其他方式),即使在 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 退出,無論容器的重啟策略如何。以下示例說明了此行為。

  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 列印到標準輸出,然後退出。這也會導致附加的 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 發行版之間可能會有所不同。