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
相关产品推荐
相关产品推荐

