当前位置: 首页 > 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.gsyq.cn/news/1467389.html

相关文章:

  • 如何在Windows电脑上轻松安装安卓应用?APK-Installer完整教程指南
  • 【第 001 讲】计算机底层基础与 Python 生态全景:硬件架构 | 语言演进 | 执行机制 | 语言特性 | 解释器 | 版本策略
  • TPM管理咨询靠谱服务商汇总:2026年设备管理升级指南 - 远大方略管理咨询
  • 《Tate-Shafarevich群的物理化映射与自由意志测度的动力学演化》(世毫九实验室原创研究)
  • 视频自动配背景音乐哪个好?5款智能配乐工具横评与工程选型
  • 上海入境就医服务公司排名
  • 高效高功率因数三相电源控制策略优化【附仿真】
  • LogExpert终极指南:Windows平台最强大的免费日志分析工具完整教程
  • 免费PDF转Word哪个好用?从扫描件到电子书,这3款微信小程序承包了我的工作 - AI测评
  • 云游戏服务器选择优化:基于增强元启发式算法平衡成本与体验
  • LabVIEW数据采集性能优化:生产者-消费者模式与TDMS流盘实战
  • 2026年精益生产管理咨询专业机构盘点:效率瓶颈破局指南 - 远大方略管理咨询
  • ImDisk虚拟磁盘驱动架构解析:Windows存储虚拟化的核心技术方案
  • 超高频RFID读写实战:从硬件连接到EPC Gen2协议指令全解析
  • Transformers.js离线提取并分类网页内容:可行性与性能评测
  • 35岁,大专、计算机专业,折腾了8年!失业一年后,翻身上岸1.3w
  • 2026年百达翡丽中国大陆授权维修服务网络优化公告(最新电话及地址) - 资讯纵览
  • MuleSoft企业级AI编排:LLM与集成平台的深度协同
  • 2026年楚雄短视频账号策划与企业AI营销完整指南 - 精选优质企业推荐官
  • 2026 重庆钻石回收推荐,合扬专业门店鉴定功底扎实 - 奢侈品交易观察员
  • 2026年楚雄新媒体运营与本地获客完整方案 - 精选优质企业推荐官
  • 书匠策AI官网www.shujiangce.com|我把期刊论文写作的“难度等级“从地狱调成了简单模式
  • 本地租房网站哪个好用?同城租房优选平台盘点 - 讲清楚了
  • Nacos 2.x 源码深度解析 (二):通信协议迭代 —— HTTP长轮询到gRPC演进
  • AI工作流主机测评:联想AI主机Mini辅助办公提效,让工作流更顺畅
  • 2026年常州格力中央空调总代理榜单:商用/家用多联机优选,技术实力与服务口碑深度解析 - 企业推荐官【官方】
  • 爱彼国内官方售后服务网点、联系方式与收费标准全梳理|2026年6月最新 - 亨得利官方服务中心
  • 利用快马平台快速构建claude desktop风格桌面应用原型
  • 厦门思明区黄金上门回收,足不出户轻松对接高价 - 黄金上门回收
  • Android设备自动化驱动配置解决方案:告别手动安装烦恼