温馨提示×

Debian如何利用Docker实现自动化部署

小樊
41
2025-11-23 07:21:04
栏目: 智能运维

在 Debian 上用 Docker 实现自动化部署

一 架构与流程

  • 代码托管与触发:将应用托管在 Git(GitHub/GitLab),通过 push/合并请求触发流水线。
  • CI 构建与推送:在 CI 中执行 docker builddocker push,产出带版本标签的镜像(如 yourname/app:latestyourname/app:1.2.3)。
  • 目标机器部署:在 Debian 生产/测试机上通过 SSH 拉取镜像并运行容器,建议使用 Docker Compose 管理服务编排与回滚。
  • 可选编排:多服务用 docker-compose.yml 定义网络、卷与重启策略,实现一键启停与滚动更新。

二 在 Debian 上准备环境

  • 安装 Docker 与 Docker Compose(推荐插件方式)
    • 更新索引并安装依赖
      • sudo apt-get update
      • sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
    • 添加 Docker 官方 GPG 密钥与 APT 源(使用 keyring 更安全)
      • curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
      • echo “deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    • 安装并验证
      • sudo apt-get update
      • sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
      • sudo docker run --rm hello-world
  • 非 root 使用与开机自启
    • sudo usermod -aG docker $USER
    • sudo systemctl enable --now docker
  • 如需在 CI 中远程部署,建议为目标机器配置 SSH 免密登录(将 CI 的公钥加入目标机 ~/.ssh/authorized_keys)。

三 方案一 GitHub Actions 云端构建与远程部署

  • 在仓库创建 .github/workflows/deploy-docker.yml,示例要点:
    • 触发分支:如 main
    • 步骤:拉取代码 → 登录镜像仓库 → 构建并推送镜像(带 BUILD_NUMBERgit sha 标签)→ 通过 SSH 在 Debian 目标机执行部署脚本
  • 示例工作流(精简版)
    • name: Deploy Docker on: push: branches: [ main ] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/myapp:${{ github.sha }},${{ secrets.DOCKERHUB_USERNAME }}/myapp:latest - name: Deploy to Debian server uses: appleboy/ssh-action@v1 with: host: ${{ secrets.PROD_HOST }} username: ${{ secrets.PROD_USER }} key: ${{ secrets.PROD_SSH_KEY }} script: | cd /opt/myapp docker compose pull docker compose up -d --force-recreate
  • 要点
    • 在仓库 Settings → Secrets 中配置 DOCKERHUB_USERNAME、DOCKERHUB_TOKEN、PROD_HOST、PROD_USER、PROD_SSH_KEY
    • 目标机建议预置 /opt/myapp/docker-compose.yml,由 CI 只负责 pull 与 up(减少在 CI 中传递敏感配置)。

四 方案二 Jenkins 在 Debian 上编排全流程

  • 安装与权限
    • 安装 Jenkins(Debian 示例)
      • sudo apt-get update
      • sudo apt-get install -y openjdk-11-jdk
      • wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
      • sudo sh -c ‘echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
      • sudo apt-get update && sudo apt-get install -y jenkins
      • sudo systemctl enable --now jenkins
    • 授权 Jenkins 使用 Docker
      • sudo usermod -aG docker jenkins
      • sudo systemctl restart jenkins
  • Pipeline 示例(Jenkinsfile)
    • pipeline { agent any environment { IMAGE = “yourname/myapp:${env.BUILD_NUMBER}” REGISTRY = “https://registry.hub.docker.com” CRED_REGISTRY = ‘dockerhub-cred-id’ REMOTE = “deploy@${{ secrets.PROD_HOST }}” COMPOSE_FILE = “/opt/myapp/docker-compose.yml” } stages { stage(‘Checkout’) { steps { git branch: ‘main’, url: ‘https://github.com/your/repo.git’ } } stage(‘Build’) { steps { sh “docker build -t $IMAGE .” } } stage(‘Push’) { steps { script { docker.withRegistry(REGISTRY, CRED_REGISTRY) { docker.image(IMAGE).push() } docker.image(IMAGE).push(‘latest’) } } } stage(‘Deploy’) { steps { sshagent([‘ssh-cred-id’]) { sh “”" ssh $REMOTE ‘cd /opt/myapp && docker compose pull’ ssh $REMOTE ‘docker compose -f $COMPOSE_FILE up -d --force-recreate’ “”" } } } } }
  • 要点
    • Manage Jenkins → Plugins 安装 Docker Pipeline、Pipeline、SSH Pipeline Steps
    • Manage Jenkins → Credentials 添加 Docker HubSSH 私钥 凭据,并在 Pipeline 中引用对应 ID

五 生产可用的最佳实践

  • 镜像与标签
    • 避免使用 latest 作为发布标签,使用 git sha语义化版本;CI 同时打 latest 仅作便捷拉取。
  • 部署策略
    • 优先使用 Docker Compose 管理服务;在部署脚本中使用 pull + up -d --force-recreatedocker compose up -d --no-deps 做滚动更新;必要时增加 healthcheck 与回滚流程。
  • 安全
    • 禁止在镜像中硬编码 密钥/密码;通过 Secrets 注入或使用 Docker Secrets/外部配置中心;SSH 使用 密钥 且最小权限。
  • 可观测性
    • 容器设置 restart=unless-stopped;统一日志驱动(如 json-file 或对接 ELK/Fluentd);为关键路径添加 健康检查超时
  • 回滚与演练
    • 保留最近 N 个镜像标签;在 CI/CD 中提供 手动回滚 选项(如部署前记录当前 digest,回滚时指定该 digest 重新部署)。
  • 多机与编排
    • 多实例/多环境建议引入 Swarm/Kubernetes;若仅单机多服务,使用 Composeprofilesdepends_on 管理依赖与启动顺序。

0