Docker Compose 重啟策略
一、概述
在本教程中,我們將學習如何在 Docker Compose 中使用重啟策略。
首先,我們將介紹如何使用重啟策略重啟 Docker 容器。然後,我們將介紹 Docker Compose 如何將正常模式和 swarm 模式下的重啟策略定義為多容器 Docker 應用程序的配置。
2. Docker重啟策略
重啟策略是我們可以用來自動重啟 Docker 容器並管理其生命週期的策略。
鑑於容器可能會意外失敗, Docker 具有防止服務運行到重啟循環的保護措施。如果發生故障,除非容器成功運行至少 10 秒,否則重啟策略不會生效。
我們還可以假設手動停止容器將使 Docker 在提供重啟策略時自動重啟服務。但是,在這種情況下,這些策略被解除,以防止容器在被任意停止後重新啟動。
為了使用重啟策略,Docker 提供了以下選項:
-
no
: 容器不會自動重啟 -
on-failure[:max-retries]
:如果容器以非零退出代碼退出,則重新啟動容器,並為 Docker 守護進程提供重新啟動容器的最大嘗試次數 -
always
:如果容器停止,總是重新啟動容器 -
unless-stopped
:總是重啟容器,除非它被任意停止或被 Docker 守護進程停止
現在,讓我們看一個如何使用 Docker CLI 為單個容器設置重啟策略的示例:
docker run --restart always my-service
從上面的示例中,如果容器停止運行, my-service
將always
重新啟動。但是,如果我們顯式停止容器,重啟策略只會在 Docker 守護進程重啟或我們使用restart
命令時生效。
前面的示例演示了restart
標誌如何配置策略以自動重啟單個容器。但是, Docker Compose 允許我們通過在普通模式或集群模式下使用restart
或restart_policy
屬性來配置重啟策略來管理多個容器。
3. 設置
在使用 Docker Compose 深入研究重啟策略實施之前,讓我們設置一個工作環境。
我們必須有一個正在運行的 Docker 容器來測試我們將指定的重啟策略。我們將使用上一篇文章中的一個項目spring-cloud-docker
docker ,它是一個 dockerized Spring Boot 應用程序。這個項目有兩個 Docker 服務,我們將使用它們來通過 Docker Compose 實現不同的重啟策略。
首先,我們必須通過從項目根目錄運行以下命令來確認我們可以運行這兩個容器:
docker-compose up --detach --build
現在,我們應該能夠通過執行docker-compose ps
看到這兩個服務都在運行:
$ docker ps
Name Command State Ports
--------------------------------------------------------------------------------
message-server java -jar /message-server.jar Up 0.0.0.0:18888->8888/tcp
product-server java -jar /product-server.jar Up 0.0.0.0:19999->9999/tcp
此外,我們可以在瀏覽器中訪問localhost:18888
或localhost:19999
並驗證我們是否看到了應用程序服務顯示的消息。
4. Docker Compose 中的重啟策略
與restart
Docker 命令一樣, **Docker Compose 包含restart
屬性以自動重啟容器。
**
此外,我們可以通過在docker-compose.yml
文件中為服務提供restart
屬性來定義 Docker Compose 中的重啟策略。 Docker Compose 使用 Docker CLI restart
命令提供的相同值來定義重啟策略。
現在,讓我們為我們的容器創建一個重啟策略。在spring-cloud-docker
docker 項目中,我們必須通過添加重啟策略屬性來更改docker-compose.yml
配置文件。例如:
message-server:
container_name: message-server
build:
context: docker-message-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 18888:8888
networks:
- spring-cloud-network
restart: no
product-server:
container_name: product-server
build:
context: docker-product-server
dockerfile: Dockerfile
image: product-server:latest
ports:
- 19999:9999
networks:
- spring-cloud-network
restart: on-failure
請注意我們如何將restart
屬性添加到兩個服務中。在這種情況下, message-server
永遠不會自動重啟。 product-server
僅在以非零代碼退出時才會重新啟動,該代碼由on-failure
值指定。
接下來,讓我們看看如何在 swarm 模式下使用 Docker Compose 聲明相同的策略。
5. Docker Compose Swarm 模式下的重啟策略
在指定容器如何自動重啟時,集群模式下的 Docker Compose 提供了更多的選項。但是,以下實現僅適用於 Docker Compose v3,它在配置中引入了deploy
鍵值對。
下面,我們可以找到不同的屬性來進一步擴展 swarm 模式下重啟策略的配置:
-
condition
:none
、on-failure,
或any
(默認) -
delay
:重新啟動嘗試之間的持續時間 -
max_attempts
:重啟window
之外的最大嘗試次數 -
window
**:**判斷重啟是否成功的持續時間
現在,讓我們定義我們的重啟策略。首先,我們必須通過更改version
屬性來確保我們使用的是 Docker Compose v3,如下所示:
version: '3'
更改版本後,我們可以將restart_policy
屬性添加到我們的服務中。與上一節類似,我們的message-server
容器將始終通過在condition
中提供any
值來自動重啟,如下所示:
deploy:
restart_policy:
condition: any
delay: 5s
max_attempts: 3
window: 120s
同樣,我們向product-server
添加一個on-failure
重啟策略:
deploy:
restart_policy:
condition: on-failure
delay: 3s
max_attempts: 5
window: 60s
請注意restart_policy
屬性是如何在deploy
鍵中的,這表明重啟策略是我們提供的部署配置,用於在 swarm 模式下管理容器集群。
此外,這兩個服務中的重啟策略都包含額外的配置元數據,使策略成為更強大的容器重啟策略。
六,結論
在本文中,我們學習瞭如何使用 Docker Compose 定義重啟策略。在介紹了 Docker 重啟策略之後,我們使用之前的 Baeldung 項目來介紹兩種配置容器重啟策略的方法。
首先,我們使用了 Docker Compose restart
屬性配置,它包含與 Docker CLI 中的本機restart
命令相同的選項。最後,我們使用了僅在 swarm 模式和 Docker Compose 版本 3 中可用的restart_policy
屬性,以及定義重啟策略的其他配置值。
與往常一樣,本教程中使用的所有示例代碼都可以在 GitHub 上找到。