Docker CI/CD集成实践:Jenkins与GitLab深度指南
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()
}
}
}
}
}
}
实践建议:
- 使用
--build-arg
传递构建时变量 - 为每个构建赋予唯一标签(如 BUILD_ID)
- 通过
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
安全建议:
- 将凭证存储在 GitHub Secrets 中
- 限制触发构建的文件路径
- 使用矩阵构建测试多版本兼容性
Docker Hub 自动构建
Docker Hub 提供原生自动化构建功能:
- 在 Docker Hub 创建自动化构建任务
- 关联 GitHub/Bitbucket 代码仓库
- 配置构建规则(如分支/tag 触发)
- 设置环境变量和构建参数
优化技巧:
- 使用缓存镜像加速构建
- 设置构建规则限制触发条件
- 配置 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 集成优势:
- 构建环境与运行环境分离
- 最终镜像不包含构建工具
- 减少镜像体积 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 漏洞数量统计
- 漏洞严重等级分布
- 基础镜像健康评分
五、实践建议总结
- 环境一致性:所有构建步骤应在 Docker 容器中执行
标签策略:
- 开发分支使用 commit SHA 作为标签
- 生产环境使用语义化版本标签
缓存优化:
docker build --cache-from=my-app:latest -t my-app:new .
清理策略:定期清理旧镜像和构建缓存
docker system prune --filter "until=24h" --force
- 灾备方案:重要镜像应推送到至少两个仓库
通过以上实践,可以构建高效、安全的 Docker CI/CD 流水线,实现从代码提交到生产部署的完全自动化。