You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm单副本暴露端口服务如何实现无停机滚动更新?

Docker Swarm 单实例WebSocket服务无停机更新方案

核心策略

仅单副本的WebSocket服务要实现无停机更新,核心是调整Swarm的更新顺序为「先启动新副本,待新副本健康检查通过、流量切换完成后,再优雅停止旧副本」,同时配置足够长的优雅停机周期处理存量WebSocket长连接,全程不会出现服务空档和端口冲突。

关键配置说明

  • --replicas 1:符合业务要求的单实例配置
  • --update-order start-first:核心参数,更新时优先启动新副本,而非默认的先停止旧副本
  • --stop-grace-period 300s:可根据业务WebSocket连接的平均生命周期调整,给旧副本足够时间处理完存量长连接,期间旧副本不再接收新流量
  • 健康检查配置:必须配置可用的健康检查规则,确保新副本完全启动、业务正常后才会切流量,避免把流量导到未就绪的新实例
  • --update-failure-action rollback:可选配置,新副本启动失败时自动回滚到旧版本,避免业务异常

操作命令

1. 首次创建服务(预配置更新策略)

docker service create \
  --name <你的服务名> \
  --replicas 1 \
  --update-order start-first \
  --stop-grace-period 300s \
  --update-failure-action rollback \
  --health-cmd "curl -f http://localhost:<容器内部端口>/<健康检查路径> || exit 1" \
  --health-interval 5s \
  --health-timeout 3s \
  --health-retries 3 \
  -p <宿主机暴露端口>:<容器内部端口> \
  <镜像地址>:<镜像标签>

2. 后续无停机更新服务

无需删除旧服务,直接执行update命令更新镜像即可:

docker service update --image <新镜像地址>:<新镜像标签> <你的服务名>

如果要临时调整本次更新的优雅停机时长,可以加参数覆盖原有配置:

docker service update \
  --image <新镜像地址>:<新镜像标签> \
  --stop-grace-period 600s \
  <你的服务名>

注意事项

如果你使用host网络模式直接绑定宿主机端口,start-first策略会因为新副本无法绑定被旧实例占用的端口而失败,该场景必须使用Swarm默认的路由mesh模式暴露端口(仅用-p参数映射端口,不指定--network host)。

内容的提问来源于stack exchange,提问作者shrw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:36:02