跳到主要内容

零停机部署

示例:​

如果你更喜欢通过示例学习,请参阅此 GitHub 仓库。

该仓库包含一个启动需要 15 秒的示例应用。但是,在任何 CapRover 实例上部署此应用时,你都不会看到 502 错误。

请注意,创建应用时必须确保不要勾选“持久化数据”复选框。

了解挑战​

部署过程中推出新的 Docker 镜像时,可能会出现暂时的服务中断(部署期间出现 502 错误)。这通常是因为新容器需要一些时间(例如 30 秒)才能完全运行。在此期间,如果服务收到流量,Nginx 可能会返回 502 Bad Gateway 错误,表示它无法从后端服务收到响应。

Docker 健康检查的作用​

Docker 健康检查是一项重要功能,有助于缓解部署导致的停机。你可以在 Dockerfile 中指定一个命令,定期检查容器的健康状态。Docker 随后会根据该状态信息管理容器的生命周期。

在 CapRover 中实现健康检查​

要将健康检查集成到 CapRover 部署流程中,请按以下步骤操作:

**步骤 1:**在 Dockerfile 中定义健康检查 修改 Dockerfile,加入 HEALTHCHECK 指令。该指令告诉 Docker 如何测试容器是否仍在正常工作。可以使用检查容器内部状态的命令,也可以请求 HTTP 端点。

HEALTHCHECK --interval=30s --timeout=30s --retries=3 \
CMD curl -f http://127.0.0.1:3000/ || exit 1

在此示例中,curl 每 30 秒请求一次容器的根 URL。如果 curl 连续超过三次以非零状态退出(由 --retries 定义),容器就会被视为不健康。

**步骤 2:**在 CapRover 中部署并配置 更新 Dockerfile 后,通过 CapRover 部署应用。CapRover 使用 Docker Swarm,会识别健康检查指令并据此管理部署。

使用 Docker Swarm 时,CapRover 的默认行为是在新容器通过健康检查后,再将流量路由到该容器。这样可以有效避免将请求路由到尚未准备好处理请求的容器,从而防止 502 错误。

什么时候不起作用?​

如果应用不使用 volume,CapRover 在更新容器时会使用 start-first 策略。这意味着新版本容器会先启动并运行,然后旧容器才会被终止,因此停机时间几乎为零。

对于挂载了 volume 的应用,CapRover 有意不使用此策略。这是因为同一服务的多个实例如果尝试访问同一个文件,会导致数据损坏和故障。对于带有 volume(持久化数据)的应用,CapRover 使用 stop-first 策略,即先停止旧容器,再启动新容器,因此会产生一定程度的停机。

如果应用有持久化数据,你仍然可以强制使用 start-first 策略,但请注意,这可能导致数据损坏,因为旧容器和新容器可能会同时尝试写入同一个文件。如果仍要这样做,只需在服务覆盖配置中输入以下内容:

UpdateConfig:
Parallelism: 2
Delay: 1000000000
FailureAction: pause
Monitor: 15000000000
MaxFailureRatio: 0.15
Order: start-first