当前位置: 首页 > news >正文

第十九篇:《Docker 在生产环境中的 CI/CD 实践》

将 Docker 集成到 CI/CD 流水线中,可以实现从代码提交到镜像构建、测试、部署的全自动化。本文介绍如何使用 Jenkins、GitLab CI 和 GitHub Actions 构建镜像、推送到私有仓库,并通过滚动更新部署到 Swarm 或 Kubernetes 集群。同时涵盖镜像缓存、安全扫描、蓝绿部署等生产级实践。

一、CI/CD 中的 Docker 典型流程
text
代码提交 → 触发构建 → 运行单元测试 → 构建镜像 → 推送镜像 → 部署到测试环境 → 集成测试 → 部署到生产环境
每个阶段都可以在容器中执行,确保环境一致性。

二、使用 Jenkins Pipeline 构建 Docker 镜像
2.1 环境准备
Jenkins 安装 Docker Pipeline 插件。

Jenkins 节点上安装 Docker,并将 Jenkins 用户加入 docker 组(或使用 Docker outside of Docker 方式)。

2.2 Jenkinsfile 示例
groovy
pipeline {
agent any
environment {
DOCKER_REGISTRY = ‘myregistry.com:5000’
DOCKER_IMAGE = “DOCKERREGISTRY/myapp:{DOCKER_REGISTRY}/myapp:DOCKERREGISTRY/myapp:{BUILD_NUMBER}”
}
stages {
stage(‘Checkout’) {
steps { git ‘https://github.com/your/app.git’ }
}
stage(‘Unit Test’) {
steps {
sh ‘docker run --rm -v $(pwd):/app -w /app node:18 npm test’
}
}
stage(‘Build Image’) {
steps {
sh “docker build -t ${DOCKER_IMAGE} .”
}
}
stage(‘Push Image’) {
steps {
withCredentials([string(credentialsId: ‘registry_password’, variable: ‘REG_PASS’)]) {
sh ‘’’
echo ${REG_PASS} | docker login -u youruser --password-stdin ${DOCKER_REGISTRY}
docker push ${DOCKER_IMAGE}
‘’’
}
}
}
stage(‘Deploy to Test’) {
steps {
sh “docker stack deploy -c docker-compose.test.yml myapp --with-registry-auth”
}
}
stage(‘Integration Test’) {
steps {
sh ‘./integration-tests.sh’
}
}
stage(‘Deploy to Production’) {
input { message “Deploy to production?” }
steps {
sh “docker stack deploy -c docker-compose.prod.yml myapp --with-registry-auth”
}
}
}
post {
always {
cleanWs() // 清理工作空间
}
}
}
2.3 使用 Docker 缓存加速构建
在构建阶段,可以挂载宿主机的 Docker 缓存目录,避免重复下载基础镜像层:

groovy
sh ‘’’
docker build --cache-from ${DOCKER_IMAGE} -t ${DOCKER_IMAGE} .
‘’’
或在 docker build 中使用 --build-arg BUILDKIT_INLINE_CACHE=1 配合 registry 缓存。

三、GitLab CI 集成
.gitlab-ci.yml 示例:

stages:-test-build-deployvariables:DOCKER_REGISTRY:myregistry.com:5000IMAGE_TAG:$CI_COMMIT_SHORT_SHAbefore_script:-docker login-u $CI_REGISTRY_USER-p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRYunit-test:stage:testscript:-docker run--rm-v $(pwd):/app-w /app node:18 npm testbuild:stage:buildscript:-docker build-t $DOCKER_REGISTRY/myapp:$IMAGE_TAG .-docker push $DOCKER_REGISTRY/myapp:$IMAGE_TAGdeploy-test:stage:deployscript:-docker stack deploy-c docker-compose.test.yml myapp--with-registry-authenvironment:testdeploy-prod:stage:deployscript:-docker stack deploy-c docker-compose.prod.yml myapp--with-registry-authenvironment:productiononly:-main

四、GitHub Actions 集成
.github/workflows/docker-ci.yml:

name:Docker CI/CDon:push:branches:[main]pull_request:branches:[main]jobs:test:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v3-name:Run unit testsrun:docker run--rm-v ${{github.workspace}}:/app-w /app node:18 npm testbuild-and-push:needs:testruns-on:ubuntu-latestif:github.event_name == 'push'&&github.ref == 'refs/heads/main'steps:-uses:actions/checkout@v3-name:Login to Registryuses:docker/login-action@v2with:registry:myregistry.com:5000username:${{secrets.REG_USER}}password:${{secrets.REG_PASS}}-name:Build and pushuses:docker/build-push-action@v4with:context:.push:truetags:myregistry.com:5000/myapp:${{github.sha}}-name:Deploy to Swarmuses:appleboy/ssh-action@v0.1.5with:host:${{secrets.SWARM_MANAGER}}username:${{secrets.SSH_USER}}key:${{secrets.SSH_KEY}}script:|docker login -u ${{ secrets.REG_USER }} -p ${{ secrets.REG_PASS }} myregistry.com:5000 docker stack deploy -c /path/to/docker-compose.prod.yml myapp --with-registry-auth

五、镜像安全扫描
在 CI 中集成漏洞扫描,可阻断含高危漏洞的镜像。

5.1 使用 Trivy

dockerrun--rm-v/var/run/docker.sock:/var/run/docker.sock aquasec/trivy image--severityHIGH,CRITICAL myapp:latest

在 Jenkins 中若扫描失败则终止流水线。

5.2 使用 Docker Scout(官方)

dockerscout quickview myapp:latest

六、部署策略
6.1 滚动更新(Swarm)
Swarm 服务支持滚动更新,只需在 stack 文件中配置更新策略:

deploy:replicas:5update_config:parallelism:2delay:10sfailure_action:rollback

6.2 蓝绿部署(手动实现)
使用两个环境标签(blue / green),通过负载均衡切换。

# 部署新版本 greendockerserviceupdate --label-addenv=green myapp# 切换负载均衡器路由到 green# 验证成功后移除 bluedockerservicermmyapp_blue

6.3 金丝雀发布(Istio + Kubernetes)
更复杂的金丝雀发布需要服务网格,不在 Docker Swarm 原生支持范围内,可考虑迁移到 K8s。

七、构建缓存优化
使用 BuildKit:DOCKER_BUILDKIT=1 docker build,支持并行构建和跳过未使用的阶段。

缓存外部依赖:将 package.json / go.mod 先复制,安装依赖,再复制源码。

使用 registry 作为缓存源:–cache-from 参数。

示例优化版 Dockerfile 已在前文提及。

八、清理 CI 环境
避免 CI 节点磁盘被大量旧镜像占满。定期执行:

dockersystem prune-f--filter"until=24h"

或在 GitLab Runner 配置中设置 cleanup 脚本。

九、小结
将 Docker 融入 CI/CD 流水线,可以显著提升交付速度和可靠性。核心要点:

每个阶段使用容器保证一致。

镜像缓存和分层构建加速构建。

安全扫描嵌入流水线。

选择合适的部署策略(滚动更新、蓝绿)。

http://www.jsqmd.com/news/955765/

相关文章:

  • 告别环境冲突!用Anaconda为Python 3.8创建专属虚拟环境(保姆级图文指南)
  • BBDown:快速掌握B站视频下载的终极命令行工具
  • 解决Quartus II编译内存不足:Windows 3GB开关原理与实战
  • 2026 企业智能体降本增效实践指南:主流平台能力深度评测 - 极欧测评
  • Loop:5分钟掌握Mac窗口管理的终极免费开源方案
  • 2026论文写作工具红黑榜:一键生成论文工具怎么选?照着用就行!
  • 2026年Vibe Coding工具对比:为什么MonkeyCode最适合初学者?
  • MATLAB光学MTF分析工具包:一键生成模糊图像+参数化MTF曲线+PSF/FFT全流程可视化
  • 如何在Windows电脑上轻松安装安卓应用?APK-Installer完整教程指南
  • HarmonyOS 6 ArkUI Rect 矩形组件使用文档
  • 高考分数够了却上不了大学?省招考院公布多种退档原因,济南家长注意了 - 博客万
  • 嵌入式C语言结构体:从内存对齐到硬件映射的实战指南
  • 终极指南:如何用Nucleus Co-Op快速实现PC游戏分屏多人体验
  • Tinke终极指南:三步搞定NDS游戏资源解包与修改
  • 《Tate-Shafarevich群的物理化映射与自由意志测度的动力学演化》(世毫九实验室原创研究)
  • TPM管理咨询靠谱服务商汇总:2026年设备管理升级指南 - 远大方略管理咨询
  • 精密整流电路设计:从二极管压降到运放负反馈的微弱信号处理
  • 模糊综合评价怎么做:SPSSAU操作步骤与结果解读
  • 【第 001 讲】计算机底层基础与 Python 生态全景:硬件架构 | 语言演进 | 执行机制 | 语言特性 | 解释器 | 版本策略
  • 2026济南钻石回收全攻略:六家实体店实测,璀璨变现更璀璨 - 薛定谔的梨花猫
  • AWS代理商怎么选?中国企业为什么更需要代理开户和充值
  • 大模型提示注入防御三水位线实战:L1/L2/L3工程化落地指南
  • 别再死记硬背了!用Python+PuLP库5分钟搞定运筹学对偶问题建模与求解
  • 终极免费音乐解锁工具:如何在浏览器中轻松解密加密音乐文件
  • 上海入境就医服务公司排名
  • 高效高功率因数三相电源控制策略优化【附仿真】
  • 视频自动配背景音乐哪个好?5款智能配乐工具横评与工程选型
  • 多厂商LLM接入避坑指南:大模型接口参数统一标准化落地方案
  • 2026乌鲁木齐新房装修 怎么避坑?源头直采、气候适配、不转包的本地标杆全解析 - 优质企业观察收录
  • 十大CRM汇总:适配不同类型企业运营管理系统盘点 - Joyky