Docker Swarm:如何按需执行指定服务的滚动更新?
使用GitHub Actions滚动更新Docker Swarm服务
核心思路
在GitHub Actions完成代码测试、镜像构建推送后,通过SSH连接到Docker Swarm的manager节点,执行docker service update命令触发滚动更新,让Swarm自动拉取新镜像并逐步替换旧容器,避免服务中断。
步骤1:配置GitHub Secrets
先把Swarm集群的访问凭证存到GitHub仓库的Secrets中:
SWARM_MANAGER_SSH_KEY:Swarm manager节点的SSH私钥(需确保该密钥拥有manager节点的sudo/root权限,可执行Docker命令)SWARM_MANAGER_HOST:manager节点的访问地址(格式:user@host,例如ubuntu@192.168.1.100)DOCKER_HUB_USERNAME、DOCKER_HUB_TOKEN:Docker Hub的账号和访问令牌(用于推送镜像)
步骤2:编写GitHub Actions工作流
在仓库的.github/workflows目录下创建yaml文件(比如swarm-deploy.yml),整合全流程:
name: Test, Build & Update Swarm Service on: push: branches: [ main ] jobs: test-build-push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # 执行代码测试(根据你的技术栈调整) - name: Run unit tests run: | pip install -r requirements.txt pytest tests/ # 登录Docker Hub - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} # 构建并推送镜像(用commit SHA作为标签,保证版本唯一) - name: Build and push image uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ secrets.DOCKER_HUB_USERNAME }}/your-app:${{ github.sha }} update-swarm: needs: test-build-push runs-on: ubuntu-latest steps: # 连接到Swarm Manager节点执行更新 - name: Connect to Swarm Manager and update service uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SWARM_MANAGER_HOST }} key: ${{ secrets.SWARM_MANAGER_SSH_KEY }} script: | # 触发滚动更新,配置更新策略 docker service update \ --image ${{ secrets.DOCKER_HUB_USERNAME }}/your-app:${{ github.sha }} \ --update-parallelism 2 \ # 每次更新2个容器实例 --update-delay 15s \ # 每批更新间隔15秒 --health-cmd "wget --spider http://localhost/health || exit 1" \ --health-interval 5s \ --health-retries 3 \ your-swarm-service-name
关键参数说明
--update-parallelism:控制同时更新的容器数量,避免一次性替换所有实例导致服务不可用--update-delay:每批更新完成后的等待时间,确保新容器稳定后再更新下一批- 健康检查参数:Swarm会等待容器通过健康检查后,才标记该实例更新完成,避免将异常容器对外提供服务
注意事项
- 确保Swarm manager节点能正常访问Docker Hub拉取新镜像(私有镜像需在manager节点提前配置Docker Hub登录凭证)
- SSH私钥需严格控制权限,仅授予manager节点的必要操作权限,防止集群控制权泄露
- 可在更新后添加状态校验步骤,比如执行
docker service ps your-swarm-service-name检查更新状态,确保所有实例正常运行
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

