温馨提示×

如何利用Debian Docker进行持续集成与持续部署

小樊
40
2025-12-28 16:57:17
栏目: 智能运维

在 Debian 上使用 Docker 搭建 CI/CD 的实操指南

一 环境准备与基础配置

  • 在 Debian 上安装 Docker(推荐官方仓库方式),并启动服务与开机自启:
    • 安装依赖与 GPG 密钥:
      • sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
      • 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
      • sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
      • sudo systemctl start docker && sudo systemctl enable docker
    • 可选:安装 Docker Compose 插件:sudo apt install -y docker-compose-plugin
    • 验证:sudo docker run --rm hello-world
  • 选择 CI 工具(任选其一或组合):
    • Jenkins:安装 Java 17+,添加 Jenkins 仓库后安装并启动服务,访问 http://<服务器IP>:8080 完成初始化。
    • GitLab CI/CD:在目标主机安装并注册 GitLab Runner(常见执行器为 Docker)。

二 流水线设计与关键配置

  • 通用流水线阶段:拉取代码 → 构建镜像 → 运行测试 → 推送镜像 → 部署上线;镜像标签建议使用 $CI_COMMIT_SHORT_SHA构建编号,便于追溯与回滚。
  • 工具与配置要点:
    • Jenkins:安装插件(如 Docker Pipeline、Docker、SSH),在“凭据”中配置 Docker Hub/私有仓库SSH 私钥,通过 Jenkinsfile 定义多阶段流水线。
    • GitLab CI/CD:在项目根目录放置 .gitlab-ci.yml,使用 stages 定义阶段;启用 services: docker:dind 以支持在 CI 环境中构建镜像;通过 only/except 控制分支触发,生产部署可用 when: manual 做人工把关。

三 完整示例

  • 示例一 Jenkinsfile(构建→测试→推送→SSH 部署)
    • 说明:使用 Jenkins 凭据 dockerhub-credsproduction-server-ssh-key;镜像以 $BUILD_NUMBER 打标签;部署阶段通过 SSH 远程拉取并重启容器。
    • 参考片段:
      • pipeline { agent any environment { IMAGE_NAME = “my-debian-app:${env.BUILD_NUMBER}” DOCKER_HUB_CREDENTIALS = credentials(‘dockerhub-creds’) } stages { stage(‘Checkout’) { steps { git ‘https://github.com/your-repo/your-debian-app.git’ } } stage(‘Build Docker Image’) { steps { script { docker.build(IMAGE_NAME) } } } stage(‘Run Tests’) { steps { script { docker.image(IMAGE_NAME).inside { sh ‘npm test’ } } } } stage(‘Push to Docker Hub’) { steps { script { docker.withRegistry(‘https://registry.hub.docker.com’, DOCKER_HUB_CREDENTIALS) { docker.image(IMAGE_NAME).push() } } } } stage(‘Deploy to Production’) { steps { sshagent([‘production-server-ssh-key’]) { sh ‘ssh user@your-production-server “docker pull ${IMAGE_NAME} && docker stop my-app || true && docker rm my-app || true && docker run -d --name my-app -p 80:80 ${IMAGE_NAME}”’ } } } } }
  • 示例二 .gitlab-ci.yml(含 Docker-in-Docker、按分支部署、手动生产发布)
    • 说明:使用 docker:dind 在 CI 中构建与推送;develop 分支自动部署到预发;main 分支生产部署需手动触发;镜像以 $CI_COMMIT_SHA 唯一标记。
    • 参考片段:
      • stages:
        • build
        • test
        • deploy_staging
        • deploy_prod
      • variables:
        • DOCKER_REGISTRY: “registry.example.com”
      • build_job:
        • stage: build
        • image: docker:latest
        • services: [“docker:dind”]
        • script:
          • docker login -u “$DOCKER_USER” -p “$DOCKER_PASS” “$DOCKER_REGISTRY”
          • docker build -t “$DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA” .
          • docker push “$DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA”
      • test_job:
        • stage: test
        • image: docker:latest
        • services: [“docker:dind”]
        • script:
          • docker run --rm “$DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA” pytest
      • deploy_staging:
        • stage: deploy_staging
        • image: docker:latest
        • services: [“docker:dind”]
        • script:
          • ssh user@staging “docker pull $DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA && docker-compose -f docker-compose.staging.yml up -d”
        • only: [“develop”]
      • deploy_prod:
        • stage: deploy_prod
        • image: docker:latest
        • services: [“docker:dind”]
        • script:
          • ssh user@prod “docker pull $DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA && docker tag $DOCKER_REGISTRY/myapp:$CI_COMMIT_SHA $DOCKER_REGISTRY/myapp:latest && docker-compose -f docker-compose.prod.yml up -d”
        • only: [“main”]
        • when: manual

四 部署与运维实践

  • 生产部署与回滚
    • 使用 Docker Compose 管理多容器应用(如 Web + DB),通过 docker-compose up -d 启动;生产环境建议将镜像标签固定为 vX.Y.Z$CI_COMMIT_SHA,回滚时直接拉取旧标签并重启:
      • 回滚示例:docker pull my-app:v1.0 && docker-compose down && docker-compose up -d
  • 安全与质量
    • 在 CI 中加入镜像漏洞扫描(如 Trivy):trivy image myapp:$CI_COMMIT_SHORT_SHA
    • 使用 多阶段构建非 root 用户,减少攻击面与镜像体积。
  • 监控与日志
    • 容器资源与日志:docker stats、docker logs;集中式方案可用 Prometheus + Grafana 监控、Fluentd/ELK 收集日志。
  • 自动更新
    • 无编排场景可用 Watchtower 自动拉取新镜像并重启容器(适合单机或少量实例):
      • docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower。

0