
单台服务器应用不中断服务热部署滚动更新方案
多台服务器通过负载均衡,或者K8S之类的,很容易实现不断服务滚动更新。
以下是 单台服务器应用不中断服务热部署方案,本文基于docker / docker swarm实现(目录如下)
1.准备好dockerfile和APP
# 基础镜像 FROM openjdk:21-jdk # author MAINTAINER bruce # 挂载上传目录 VOLUME ./upload/ # 创建目录 RUN mkdir -p /home/app ENV TZ=Asia/Shanghai RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 指定路径 WORKDIR /home/app # 复制jar文件到路径 COPY ./api-0.0.1-SNAPSHOT.jar /home/app/api-0.0.1-SNAPSHOT.jar # 启动服务 EXPOSE 8000 ENTRYPOINT ["java","-jar","api-0.0.1-SNAPSHOT.jar"]
2. 准备好 docker-compose.yml
version: '3.7' services: homecare-api: image: homecare-api:202502281410 ports: - "8000:8000" hostname: homecare-api deploy: replicas: 1 update_config: parallelism: 1 delay: 10s order: start-first # 先启动新副本,再停止旧副本 restart_policy: condition: on-failure healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"] interval: 30s #必须等服务有足够的时间启动,否则还未启动,就被当成不健康被不断重启 timeout: 3s retries: 3
3. 打包镜像
docker build -t homecare-api:202502281410 .
4.使用以下命令将服务部署到 Swarm 中:
docker stack deploy -c docker-compose.yml homecare-api
5. 构建新版本镜像
当需要更新服务时,首先构建新的镜像版本:
docker build -t homecare-api:202502281430 .
6. 更新服务
更新
docker-compose.yml
文件中的镜像版本:image: homecare-api:202502281427
然后运行以下命令进行更新:
docker stack deploy -c docker-compose.yml homecare-api
Docker Swarm 会自动执行滚动更新:
-
先启动一个新版本的容器。
-
确保新版本容器运行正常(通过健康检查)。
-
停止旧版本的容器。
7. 监控更新过程
你可以通过以下命令监控更新进度:(服务命令为docker-compose.yml 中的service name)
docker service ps homecare-api_homecare-api
#或使用
docker stats
8. 验证服务
确保服务正常运行后,访问你的 API 接口,确认新版本已经生效。
curl http://192.168.2.218:8000/api/version curl http://192.168.2.218:8000/api/health
9. 清理旧镜像(可选)
更新完成后,旧版本的容器会被自动清理。如果你希望清理旧镜像,可以运行:
docker image prune -a
这将删除所有未使用的镜像。
总结
通过上述步骤,你可以在单台机器上实现零停机滚动更新。关键在于:
-
构建镜像:确保在更新前构建好新版本的镜像。
-
使用 Docker Swarm 的滚动更新机制:通过
docker stack deploy
和更新配置,确保新旧版本的平滑切换。
如果你的项目代码有更新,只需重新构建镜像并更新
docker-compose.yml
文件中的镜像版本即可。============ 欢迎各位老板打赏~ ===========


与本文相关的文章
- · docker安装 Confluence9
- · docker安装code-server
- · Docker 镜像加速列表(20250216已更新)
- · 解决docker push 到私有registry时,报unknown blob错
- · Amazon Linux 2023 安装Docker和Docker Compose
- · 修改Docker的默认网段
- · 阿里云三种负载均衡的区别
- · docker定时任务Mysql脚本
- · 解决Linux实例磁盘空间满问题
- · failed to fetch metadata: fork/exec /home/appuser/.docker/cli-plugins/docker-buildx: exec format error
- · Docker登录login报错Error saving credentials
- · docker安装mysql8注意事项