当前位置: 首页 > news >正文

Docker Swarm之Java 应用部署与平滑更新

Docker Swarm Java 应用部署与平滑更新

  • 📘 一、概述
  • 🧩 二、准备工作
    • 1、docker-compose-swarm.yml
    • 2、nginx.conf
    • 3、prod.sh + Dockerfile(构建并推送镜像)
    • 4、diagnose.sh(诊断脚本,可选)
  • 🚀 三、首次部署
  • 🔄 四、平滑更新 Java 服务
  • 🧰 五、问题排查与回滚
  • ✅ 六、总结

📘 一、概述

本文介绍如何使用 Docker Swarm 集群部署 Java 应用,并实现 零停机的平滑滚动更新。
适用于中小型分布式系统、微服务架构项目的生产环境。

🧩 二、准备工作

1、docker-compose-swarm.yml

说明:Swarm 不支持 docker-compose build,因此需要提前构建并推送镜像到远程仓库(如腾讯云容器镜像服务)。

version: "3.9"services:redis:image: redis:7.2networks:- app-netdeploy:replicas: 1restart_policy:condition: on-failuremax_attempts: 3resources:limits:memory: 512Mreservations:memory: 256Mjava-app:image: ccr.ccs.tencentyun.com/lensung_supply/aigc-api-aiyunhua:aigc-api-assistant-1.0.0depends_on:- redisenvironment:SPRING_PROFILES_ACTIVE: prodSPRING_REDIS_HOST: redisSPRING_REDIS_PORT: 6379ports:- "9799:9799"networks:- app-nethealthcheck:test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9799/actuator/health"]interval: 10stimeout: 5sretries: 3start_period: 90sdeploy:replicas: 2  # 至少两个副本实现平滑切换restart_policy:condition: on-failuremax_attempts: 3update_config:parallelism: 1       # 每次更新1个副本delay: 15s           # 每两个副本更新间隔15秒monitor: 60s         # 监控健康状态60秒failure_action: rollbackorder: start-first   # 先启动新副本,再停止旧副本resources:limits:memory: 2Greservations:memory: 1Gnginx:image: nginx:1.25depends_on:- java-appvolumes:- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro- ./nginx/logs:/var/log/nginxports:- "8000:80"networks:- app-netdeploy:replicas: 1restart_policy:condition: on-failuremax_attempts: 3resources:limits:memory: 256Mreservations:memory: 128Mnetworks:app-net:driver: overlay

🟡 小贴士:

⚠️ Swarm 环境不支持 container_name,会自动命名副本。

💡 如果 Java 服务启动较慢,start_period 可调大到 120s。

✅ 建议在各节点上提前执行 docker login ccr.ccs.tencentyun.com

2、nginx.conf

支持 CORS、WebSocket、Gzip 压缩,转发到 Swarm 服务名 java-app。

user  nginx;
worker_processes  auto;events { worker_connections  1024; }http {include       mime.types;default_type  application/octet-stream;sendfile        on;tcp_nopush      on;tcp_nodelay     on;keepalive_timeout  65;server_tokens off;gzip on;gzip_min_length 1k;gzip_comp_level 2;gzip_types text/plain text/css application/javascript application/json application/xml;gzip_vary on;map $http_upgrade $connection_upgrade {default     keep-alive;websocket   upgrade;}server {listen 80;server_name aigc.aiyunhua.com;location /v1 {add_header Access-Control-Allow-Origin * always;add_header Access-Control-Allow-Headers Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Requested-With,token,platform,satoken always;add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD,PUT,DELETE always;add_header Access-Control-Allow-Credentials true always;if ($request_method = OPTIONS) { return 200; }proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://java-app:9799;proxy_redirect off;proxy_connect_timeout 60s;proxy_send_timeout    300s;proxy_read_timeout    300s;}location / { return 403; }}
}

3、prod.sh + Dockerfile(构建并推送镜像)

#!/bin/bash -v
buildPath="ccr.ccs.tencentyun.com/lensung_supply/aigc-api-aiyunhua"
name="aigc-api-assistant"
version="1.0.1"git pull
#mvn clean install package -Dmaven.test.skip=truedocker login --username=100009090170 --password=hzls2020 ccr.ccs.tencentyun.com
docker build -t $buildPath:$name-$version --platform=linux/amd64 .
docker push $buildPath:$name-$version
docker rmi $buildPath:$name-$version

4、diagnose.sh(诊断脚本,可选)

此脚本可快速检测:

  • Swarm 集群状态
  • 服务副本是否健康
  • 镜像版本是否匹配
  • 网络配置是否存在
#!/bin/bash# Docker Swarm 服务诊断脚本
# 使用方法: ./diagnose.shset -e# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No ColorSTACK_NAME="aigc-stack"
SERVICE_NAME="${STACK_NAME}_java-app"
CORRECT_IMAGE="ccr.ccs.tencentyun.com/lensung_supply/aigc-api-aiyunhua/aigc-api-assistant-1.0.0"echo -e "${BLUE}=== Docker Swarm 服务诊断 ===${NC}"
echo ""# 1. 检查Swarm状态
echo -e "${BLUE}1. 检查Docker Swarm状态${NC}"
if docker info | grep -q "Swarm: active"; thenecho -e "${GREEN}✓ Docker Swarm已激活${NC}"
elseecho -e "${RED}✗ Docker Swarm未激活${NC}"echo -e "${YELLOW}请执行: docker swarm init${NC}"exit 1
fi# 2. 检查服务状态
echo -e "\n${BLUE}2. 检查服务状态${NC}"
docker service ls --filter name="${STACK_NAME}_"# 3. 检查Java服务详情
echo -e "\n${BLUE}3. 检查Java服务详情${NC}"
if docker service ls | grep -q "$SERVICE_NAME"; thenecho -e "${YELLOW}当前镜像地址:${NC}"docker service inspect "$SERVICE_NAME" --format "{{.Spec.TaskTemplate.ContainerSpec.Image}}"echo -e "\n${YELLOW}期望镜像地址:${NC}"echo "$CORRECT_IMAGE"# 检查镜像地址是否匹配CURRENT_IMAGE=$(docker service inspect "$SERVICE_NAME" --format "{{.Spec.TaskTemplate.ContainerSpec.Image}}")if [[ "$CURRENT_IMAGE" == "$CORRECT_IMAGE" ]]; thenecho -e "${GREEN}✓ 镜像地址正确${NC}"elseecho -e "${RED}✗ 镜像地址不匹配${NC}"echo -e "${YELLOW}需要更新服务镜像${NC}"fi
elseecho -e "${RED}✗ 服务 $SERVICE_NAME 不存在${NC}"
fi# 4. 检查服务副本状态
echo -e "\n${BLUE}4. 检查服务副本状态${NC}"
if docker service ls | grep -q "$SERVICE_NAME"; thendocker service ps "$SERVICE_NAME" --no-trunc
elseecho -e "${RED}✗ 无法检查副本状态${NC}"
fi# 5. 检查镜像是否存在
echo -e "\n${BLUE}5. 检查镜像是否存在${NC}"
if docker images | grep -q "aigc-api-aiyunhua"; thenecho -e "${GREEN}✓ 本地存在相关镜像${NC}"docker images | grep "aigc-api-aiyunhua"
elseecho -e "${YELLOW}! 本地不存在相关镜像${NC}"
fi# 6. 检查网络
echo -e "\n${BLUE}6. 检查网络${NC}"
docker network ls --filter name="${STACK_NAME}_"# 7. 提供修复建议
echo -e "\n${BLUE}=== 修复建议 ===${NC}"# 检查镜像地址问题
CURRENT_IMAGE=$(docker service inspect "$SERVICE_NAME" --format "{{.Spec.TaskTemplate.ContainerSpec.Image}}" 2>/dev/null || echo "")
if [[ "$CURRENT_IMAGE" != "$CORRECT_IMAGE" ]]; thenecho -e "${YELLOW}1. 镜像地址不匹配,需要更新服务:${NC}"echo -e "   docker service update --image $CORRECT_IMAGE $SERVICE_NAME"
fi# 检查副本问题
REPLICAS=$(docker service ls --filter name="$SERVICE_NAME" --format "{{.Replicas}}" 2>/dev/null || echo "0/0")
if [[ "$REPLICAS" == "0/"* ]]; thenecho -e "${YELLOW}2. 副本数为0,可能的原因:${NC}"echo -e "   - 镜像拉取失败"echo -e "   - 健康检查失败"echo -e "   - 资源不足"echo -e "   - 配置错误"echo -e "\n${YELLOW}建议检查服务日志:${NC}"echo -e "   docker service logs $SERVICE_NAME"
fiecho -e "\n${YELLOW}3. 如果问题持续,建议重新部署:${NC}"
echo -e "   docker stack rm $STACK_NAME"
echo -e "   docker stack deploy -c docker-compose-swarm.yml $STACK_NAME"echo -e "\n${GREEN}=== 诊断完成 ===${NC}"

🚀 三、首次部署

# 初始化 Swarm
docker swarm init# 登录镜像仓库
docker login ccr.ccs.tencentyun.com# 拉取镜像
docker pull ccr.ccs.tencentyun.com/lensung_supply/aigc-api-aiyunhua:aigc-api-assistant-1.0.0# 部署服务
docker stack deploy -c docker-compose-swarm.yml aigc-stack# 查看服务状态
docker service ls# 查看 Java 应用副本详情
docker service ps aigc-stack_java-app# 查看运行日志
docker logs -f <容器ID># 删除整个堆栈
docker stack rm aigc-stack

🔄 四、平滑更新 Java 服务

可使用版本号迭代(如 1.0.0 → 1.0.1 → 1.0.2),也可使用固定的 latest 标签。

docker service update \--image ccr.ccs.tencentyun.com/lensung_supply/aigc-api-aiyunhua:aigc-api-assistant-1.0.1 \--update-parallelism 1 \--update-delay 15s \--update-monitor 60s \--update-failure-action rollback \--update-order start-first \aigc-stack_java-app

✅ 更新策略说明

参数含义推荐值
--update-parallelism同时更新副本数1
--update-delay两次更新间隔10–20s
--update-monitor健康检测周期60s
--update-failure-action更新失败操作rollback
--update-order更新顺序start-first

🧰 五、问题排查与回滚

场景排查命令解决方式
新镜像无法拉取docker pull确认仓库登录权限
服务更新失败docker service ps查看退出状态与错误
健康检查失败docker logs检查启动慢、依赖未连接
强制回滚docker service rollback aigc-stack_java-app回到上一个稳定版本

✅ 六、总结

阶段关键点说明
镜像构建确保远程仓库可访问否则 Swarm 管理节点无法获取 digest
健康检查/actuator/health 必须返回 200影响滚动更新的成功率
滚动更新start-first + 2 副本保证无中断平滑切换
自动回滚failure_action: rollback避免错误镜像影响生产
http://www.dtcms.com/a/521563.html

相关文章:

  • 网站图片标签群晖 做网站服务器
  • 网站开发项目实训报告企业融资的主要方式
  • 对遗传学进行机器学习的现状与展望!
  • 做旅游海报的软件或是网站wordpress 4.7.2 提权
  • 电子商务网站设计分析怎么做宿州建设银行网站
  • 基于GMapping和蚁群算法的导航方案
  • 阳朔县建设规划局网站怒江州建设局网站企业备案网站
  • O2OA(v9.5)开发平台更新说明(三):聚焦安全与系统维护的全面升级
  • 工信部网站备案查询步骤iis做网站视
  • win7本机做网站自己创建公司网站
  • 【Day 81】虚拟化-虚拟磁盘管理
  • 使用python开发任天堂gameboy模拟器|pyboy开发实践
  • 平顶山网站建设公司视频软件制作app
  • 手机网站模板网网站开发实训报告总结2021
  • mwf攻防。
  • 购物网站开发 书籍wordpress+去掉阅读
  • CICD实战(9) - 使用Arbess+GitLab实现Python项目自动化部署
  • 贵州两学一做教育网站怎么做点击图片进入网站
  • 阮一峰《TypeScript 教程》学习笔记——类型系统
  • 网站如何做微信支付宝支付湖南网站排名优化公司
  • 房产网站推广做自己移动端网站
  • 江阴网站建设公司vs用户登录注册网站建设代码
  • 锁和原子变量的基础介绍
  • asp网站开发实训报告公司中英文网站建设
  • 状态机之tinyfsm
  • Spring中@Configuration注解的proxyBeanMethods属性详解
  • RSI超买信号与仓位递减结合的ETF止盈策略实现与验证
  • 浙江企业网站建设上海cms建站系统
  • 太原做app网站建设上海网站建设seo公司哪家好
  • windows 安装 nginx