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

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会等待容器通过健康检查后,才标记该实例更新完成,避免将异常容器对外提供服务

注意事项

  1. 确保Swarm manager节点能正常访问Docker Hub拉取新镜像(私有镜像需在manager节点提前配置Docker Hub登录凭证)
  2. SSH私钥需严格控制权限,仅授予manager节点的必要操作权限,防止集群控制权泄露
  3. 可在更新后添加状态校验步骤,比如执行docker service ps your-swarm-service-name检查更新状态,确保所有实例正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:21:05