Docker 在 CI/CD 中的深度集成实践

一、与 DevOps 工具链结合

Jenkins 中的 Docker 构建步骤

在 Jenkins 流水线中集成 Docker 可以实现环境一致性和快速部署。以下是典型的使用场景:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    docker.build("my-app:${env.BUILD_ID}", "--build-arg VERSION=1.0 .")
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    docker.image("my-app:${env.BUILD_ID}").inside {
                        sh 'mvn test'
                    }
                }
            }
        }
        stage('Push') {
            steps {
                script {
                    docker.withRegistry('https://registry.example.com', 'credentials-id') {
                        docker.image("my-app:${env.BUILD_ID}").push()
                    }
                }
            }
        }
    }
}

实践建议

  1. 使用 --build-arg 传递构建时变量
  2. 为每个构建赋予唯一标签(如 BUILD_ID)
  3. 通过 docker.inside() 在容器内执行测试

GitLab CI 中的 Docker 集成

GitLab CI 原生支持 Docker 作为执行环境,.gitlab-ci.yml 示例:

image: docker:20.10

services:
  - docker:dind

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""

stages:
  - build
  - deploy

build-image:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy:
  stage: deploy
  script:
    - docker-compose up -d

关键点

  • 使用 docker:dind (Docker in Docker) 服务
  • 利用 GitLab 内置的容器注册表变量
  • 提交哈希作为镜像标签保证唯一性

二、镜像仓库集成实践

Harbor 企业级仓库配置

Harbor 提供了企业级镜像管理功能,与 CI 工具集成示例:

# 登录Harbor
docker login harbor.example.com -u admin -p Harbor12345

# 构建并推送镜像
docker build -t harbor.example.com/my-project/my-app:1.0 .
docker push harbor.example.com/my-project/my-app:1.0

# 从Harbor拉取镜像
docker pull harbor.example.com/my-project/my-app:1.0

高级功能

  • 镜像漏洞扫描
  • 镜像签名验证
  • 基于角色的访问控制(RBAC)

AWS ECR 集成

AWS Elastic Container Registry 与 AWS 服务深度集成:

# 获取ECR登录命令
aws ecr get-login-password | docker login \
    --username AWS \
    --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com

# 构建并推送镜像
docker build -t my-app .
docker tag my-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest

最佳实践

  • 使用 IAM 策略控制访问权限
  • 启用生命周期策略自动清理旧镜像
  • 结合 ECS 实现自动部署

三、自动化构建方案

GitHub Actions 工作流

GitHub Actions 可以监听代码变更自动构建 Docker 镜像:

name: Docker Build

on:
  push:
    branches: [ main ]
    paths:
      - 'src/**'
      - 'Dockerfile'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Build Docker image
        run: docker build -t my-app .
        
      - name: Log in to Docker Hub
        run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
        
      - name: Push image
        run: |
          docker tag my-app ${{ secrets.DOCKER_HUB_USERNAME }}/my-app:latest
          docker push ${{ secrets.DOCKER_HUB_USERNAME }}/my-app:latest

安全建议

  1. 将凭证存储在 GitHub Secrets 中
  2. 限制触发构建的文件路径
  3. 使用矩阵构建测试多版本兼容性

Docker Hub 自动构建

Docker Hub 提供原生自动化构建功能:

  1. 在 Docker Hub 创建自动化构建任务
  2. 关联 GitHub/Bitbucket 代码仓库
  3. 配置构建规则(如分支/tag 触发)
  4. 设置环境变量和构建参数

图1

优化技巧

  • 使用缓存镜像加速构建
  • 设置构建规则限制触发条件
  • 配置 Webhook 通知构建状态

四、进阶集成模式

多阶段构建优化

结合 CI 工具实现高效构建:

# 构建阶段
FROM maven:3.8-jdk-11 AS builder
WORKDIR /app
COPY . .
RUN mvn package -DskipTests

# 运行时阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/my-app.jar .
CMD ["java", "-jar", "my-app.jar"]

CI 集成优势

  1. 构建环境与运行环境分离
  2. 最终镜像不包含构建工具
  3. 减少镜像体积 50% 以上

安全扫描集成

在流水线中加入安全扫描步骤:

# 在GitLab CI中添加安全扫描
security-scan:
  stage: test
  image: docker:stable
  script:
    - docker scan --login --token $SNYK_TOKEN
    - docker scan $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --severity=high
  allow_failure: true

关键指标

  • CVE 漏洞数量统计
  • 漏洞严重等级分布
  • 基础镜像健康评分

五、实践建议总结

  1. 环境一致性:所有构建步骤应在 Docker 容器中执行
  2. 标签策略

    • 开发分支使用 commit SHA 作为标签
    • 生产环境使用语义化版本标签
  3. 缓存优化

    docker build --cache-from=my-app:latest -t my-app:new .
  4. 清理策略:定期清理旧镜像和构建缓存

    docker system prune --filter "until=24h" --force
  5. 灾备方案:重要镜像应推送到至少两个仓库

通过以上实践,可以构建高效、安全的 Docker CI/CD 流水线,实现从代码提交到生产部署的完全自动化。

添加新评论