【Docker高级篇】吃透Docker CI/CD集成:从代码提交到镜像部署,一步到位不踩坑
予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 Debug 这个世界Return 更好的自己引言做Docker运维或开发的同学一定踩过“手动构建镜像、手动部署应用”的坑——每次Git提交代码后都要重复执行docker build、docker push、docker run不仅耗时还容易因人为操作出错。结合上一篇博客分享的Linux内核特性本文聚焦Docker进阶实战如何集成CI/CD流水线实现Git推送代码后自动触发镜像构建与应用部署既解放双手也为后续学习K8s打下基础。建议点赞收藏跟着实操一遍就能上手文章目录引言一、前置知识铺垫必看避免踩坑二、方案一GitHub Actions Docker 自动构建部署推荐轻量需求2.1 前期准备3步搞定2.2 编写GitHub Actions配置文件2.3 测试流水线效果三、方案二Jenkins Docker 自动构建部署适合企业级需求3.1 前期准备3.2 配置Jenkins核心步骤3.3 编写Jenkinsfile流水线配置3.4 触发流水线并测试四、两种方案对比与注意事项4.1 方案对比按需选择4.2 必看注意事项避坑关键五、总结一、前置知识铺垫必看避免踩坑在开始搭建CI/CD流水线前先明确2个核心前提确保后续实操顺畅环境准备已安装Docker建议20.10版本、Git服务器可正常访问外网拉取镜像、连接代码仓库核心逻辑CI/CD流水线的核心是“触发-构建-推送-部署”闭环——Git提交代码触发条件→ CI工具拉取代码、构建Docker镜像 → 推送镜像到仓库Docker Hub/私有仓库→ 服务器拉取镜像、重启应用工具选择本文提供两种主流方案按需选择GitHub Actions适合开源项目、轻量需求无需额外部署服务器配置简单Jenkins适合企业级、复杂流水线需求可自定义更多流程如测试、告警需部署Jenkins服务。提示如果还不了解Docker如何利用Linux内核特性如Namespace、Cgroups实现容器隔离可回顾我的上一篇博客底层原理吃透后续运维、排错更轻松二、方案一GitHub Actions Docker 自动构建部署推荐轻量需求该方案无需额外部署工具借助GitHub自带的Actions功能只需编写一个配置文件就能实现Git推送自动触发流水线。2.1 前期准备3步搞定GitHub仓库准备新建/打开你的项目仓库如docker-demo确保项目根目录有Dockerfile核心用于构建镜像Docker Hub准备注册/登录Docker Hub新建一个仓库如yufeng/docker-demo用于存储构建好的镜像GitHub密钥配置进入GitHub仓库 → Settings → Secrets and variables → Actions → New repository secret新增2个密钥名称固定后续配置文件会用到DOCKER_HUB_USERNAME你的Docker Hub用户名DOCKER_HUB_ACCESS_TOKENDocker Hub的访问令牌Docker Hub → Account Settings → Security → New Access Token。2.2 编写GitHub Actions配置文件在GitHub仓库根目录新建目录.github/workflows注意前面有个点在该目录下新建配置文件docker-cicd.yml文件名可自定义后缀必须是yml复制以下配置代码注释详细可直接修改适配你的项目# 流水线名称可自定义name:Docker CI/CD Pipeline# 触发条件push到main分支时触发可修改为你的分支如masteron:push:branches:[main]# 执行的作业jobs:# 作业名称构建并推送镜像build-and-push:# 运行环境Ubuntu最新版GitHub提供的虚拟环境runs-on:ubuntu-lateststeps:# 步骤1拉取GitHub仓库代码-name:Checkout codeuses:actions/checkoutv4# 步骤2登录Docker Hub使用前面配置的密钥-name:Login to Docker Hubuses:docker/login-actionv3with:username:${{secrets.DOCKER_HUB_USERNAME}}password:${{secrets.DOCKER_HUB_ACCESS_TOKEN}}# 步骤3构建Docker镜像标签格式Docker Hub用户名/仓库名:版本号-name:Build Docker imagerun:|docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/docker-demo:latest .# 步骤4推送镜像到Docker Hub-name:Push Docker imagerun:|docker push ${{ secrets.DOCKER_HUB_USERNAME }}/docker-demo:latest# 步骤5远程登录服务器拉取镜像并重启应用核心实现自动部署-name:Deploy to serveruses:appleboy/ssh-actionmasterwith:host:${{secrets.SERVER_HOST}}# 新增密钥服务器IPusername:${{secrets.SERVER_USERNAME}}# 新增密钥服务器用户名如rootkey:${{secrets.SERVER_SSH_KEY}}# 新增密钥服务器SSH私钥script:|# 登录Docker Hub如果服务器未登录 docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} # 拉取最新镜像 docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/docker-demo:latest # 停止并删除旧容器如果存在 docker stop docker-demo || true docker rm docker-demo || true # 启动新容器端口映射可修改如80:8080 docker run -d --name docker-demo -p 80:8080 ${{ secrets.DOCKER_HUB_USERNAME }}/docker-demo:latest2.3 测试流水线效果将配置文件提交到GitHub仓库的main分支任意修改项目代码如修改README.md再次push到main分支进入GitHub仓库 → Actions查看流水线执行状态绿色对勾表示成功红色叉号表示失败测试访问服务器IP:端口如http://192.168.1.100:80确认应用已更新为最新版本。小贴士如果流水线执行失败优先查看日志点击失败的步骤常见问题密钥配置错误、Dockerfile编写错误、服务器SSH连接失败。记得点赞收藏后续遇到问题可回头查看三、方案二Jenkins Docker 自动构建部署适合企业级需求如果你的项目需要更复杂的流水线如先执行单元测试、代码检查再构建部署推荐使用Jenkins。以下是核心实操步骤。3.1 前期准备部署Jenkins在服务器上通过Docker部署Jenkins简单高效命令如下# 拉取Jenkins镜像dockerpull jenkins/jenkins:lts# 启动Jenkins容器映射端口8080挂载目录保存数据dockerrun -d --name jenkins -p8080:8080 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts初始化Jenkins访问服务器IP:8080按照提示输入初始密码、安装推荐插件需等待几分钟安装必要插件进入Jenkins → 系统管理 → 插件管理安装3个核心插件Git Plugin拉取Git代码Docker Plugin操作DockerPipeline Plugin流水线插件支持编写Jenkinsfile。3.2 配置Jenkins核心步骤配置Git进入Jenkins → 系统管理 → 全局工具配置 → Git设置Git安装路径一般是/usr/bin/git配置Docker进入Jenkins → 系统管理 → 系统配置 → Docker添加Docker服务器本地部署则填写unix:///var/run/docker.sock配置代码仓库新建Jenkins任务自由风格/流水线任务配置Git仓库地址添加Git凭证用户名密码/SSH密钥。3.3 编写Jenkinsfile流水线配置在项目根目录新建Jenkinsfile文件复制以下代码适配Docker自动构建部署// 定义流水线pipeline{// 运行环境任意可用节点本地部署则填写localhostagent any// 环境变量替换为你的信息environment{DOCKER_HUB_USERNAME你的Docker Hub用户名DOCKER_HUB_REPOdocker-demoSERVER_PORT80:8080}// 流水线步骤stages{// 阶段1拉取Git代码stage(Checkout Code){steps{git branch:main,url:你的GitHub/GitLab仓库地址}}// 阶段2构建Docker镜像stage(Build Docker Image){steps{shdocker build -t ${DOCKER_HUB_USERNAME}/${DOCKER_HUB_REPO}:latest .}}// 阶段3推送镜像到Docker Hubstage(Push Docker Image){steps{shdocker login -u ${DOCKER_HUB_USERNAME} -p 你的Docker Hub访问令牌shdocker push ${DOCKER_HUB_USERNAME}/${DOCKER_HUB_REPO}:latest}}// 阶段4自动部署到服务器本地部署可省略SSH步骤stage(Deploy Application){steps{sh docker stop ${DOCKER_HUB_REPO} || true docker rm ${DOCKER_HUB_REPO} || true docker run -d --name ${DOCKER_HUB_REPO} -p ${SERVER_PORT} ${DOCKER_HUB_USERNAME}/${DOCKER_HUB_REPO}:latest }}}// 构建后操作无论成功失败都输出提示post{success{echoDocker CI/CD流水线执行成功应用已自动部署更新}failure{echo流水线执行失败请查看日志排查问题常见镜像构建失败、密钥错误}}}3.4 触发流水线并测试将Jenkinsfile提交到Git仓库进入Jenkins任务点击“立即构建”查看流水线执行状态后续修改代码并push到Git仓库可设置“Git提交触发构建”Jenkins任务 → 构建触发器 → 勾选“GitHub hook trigger for GITScm polling”实现自动触发。四、两种方案对比与注意事项4.1 方案对比按需选择对比维度GitHub ActionsJenkins部署成本无GitHub自带需部署服务器有一定运维成本配置难度简单yml配置几行代码搞定较复杂需配置插件、凭证、节点适用场景开源项目、轻量需求、个人项目企业级项目、复杂流水线、多环境部署扩展性一般可调用市场Actions但自定义程度有限极强可自定义插件、脚本适配复杂需求4.2 必看注意事项避坑关键镜像仓库选择如果是私有项目建议使用私有镜像仓库如阿里云容器仓库、Harbor避免镜像泄露密钥安全无论是GitHub Actions还是Jenkins密钥访问令牌、SSH私钥都要加密存储严禁明文写在配置文件中版本控制镜像标签建议使用Git提交哈希如latest-${GITHUB_SHA::8}避免latest标签覆盖旧版本便于回滚容错处理在流水线中添加容错命令如docker stop || true避免因旧容器未停止导致构建失败底层关联结合上一篇博客的Linux内核特性Docker的镜像构建、容器运行依赖Namespace隔离和Cgroups资源限制理解这一点能更好地排查流水线中的容器启动失败问题。五、总结本文聚焦Docker CI/CD流水线集成的核心实战提供了两种主流方案GitHub Actions轻量高效和Jenkins企业级可扩展全程围绕“Git推送自动触发构建部署”展开拆解了每一步实操步骤和避坑要点。掌握Docker与CI/CD的集成不仅能解放双手、提高运维效率更能理解容器技术在DevOps链路中的核心作用——这也是后续学习K8s容器编排的重要基础K8s的核心就是管理大量容器而CI/CD是容器化应用落地的关键链路。感谢阅读我是予枫专注Docker、Linux、K8s等运维/开发技术分享后续会持续更新Docker底层原理和K8s实操内容。如果本文对你有帮助欢迎点赞、收藏、评论关注我一起深耕技术、少踩坑

相关新闻

61 二分查找

61 二分查找

1.代码int searchInsert(int* nums, int numsSize, int target) {int l 0;int r numsSize-1;while(l<r){int mid (lr)/2;if(nums[mid]target)return mid;if(nums[mid]>target){r mid-1;}if(nums[mid]<target){l mid1;}}return l; }

2026/5/17 5:37:56 阅读更多 →
基于springboot的健身爱好者打卡与互动交流系统

基于springboot的健身爱好者打卡与互动交流系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

2026/7/5 3:31:40 阅读更多 →
低代码能力要不要加?AI应用架构师的智能数资系统低代码决策

低代码能力要不要加?AI应用架构师的智能数资系统低代码决策

低代码能力要不要加&#xff1f;AI应用架构师的智能数资系统低代码决策框架 一、引言&#xff1a;智能数资系统的“开发效率焦虑”&#xff0c;你有吗&#xff1f; 1. 钩子&#xff1a;一个架构师的深夜吐槽 上周和一位银行AI应用架构师吃饭&#xff0c;他刚结束一个智能资管系…

2026/7/2 19:25:57 阅读更多 →

最新新闻

LSTM 时间序列预测实战:基于3000期双色球数据,构建7维序列模型

LSTM 时间序列预测实战:基于3000期双色球数据,构建7维序列模型

LSTM时间序列预测实战&#xff1a;基于3000期双色球数据的7维序列建模引言&#xff1a;当深度学习遇见概率游戏每次双色球开奖时&#xff0c;那些在彩票站盯着走势图沉思的身影总让人好奇——是否存在某种数学规律能穿透随机性的迷雾&#xff1f;作为数据科学家&#xff0c;我们…

2026/7/6 0:15:20 阅读更多 →
Cartographer ROS Noetic 仿真建图实战:Gazebo+Rviz 完整流程与 3 个关键配置文件解析

Cartographer ROS Noetic 仿真建图实战:Gazebo+Rviz 完整流程与 3 个关键配置文件解析

Cartographer ROS Noetic 仿真建图实战&#xff1a;GazeboRviz 完整流程与 3 个关键配置文件解析当我们需要在仿真环境中验证SLAM算法时&#xff0c;Cartographer与Gazebo的组合提供了一个理想的测试平台。本文将深入探讨如何在ROS Noetic环境下&#xff0c;通过精心配置三个核…

2026/7/6 0:15:20 阅读更多 →
POSIX 1003.1 标准解析:从 fork/exec 到 72 个系统调用的可移植性实践

POSIX 1003.1 标准解析:从 fork/exec 到 72 个系统调用的可移植性实践

POSIX 1003.1 标准解析&#xff1a;从 fork/exec 到 72 个系统调用的可移植性实践在跨平台软件开发中&#xff0c;操作系统接口的差异一直是工程师面临的主要挑战之一。POSIX&#xff08;Portable Operating System Interface&#xff09;标准作为Unix-like系统的通用接口规范&…

2026/7/6 0:15:20 阅读更多 →
位置编码外推实战:从BERT 512到26万token的3种延拓策略

位置编码外推实战:从BERT 512到26万token的3种延拓策略

位置编码外推实战&#xff1a;从BERT 512到26万token的3种延拓策略当处理长文本序列时&#xff0c;BERT等Transformer模型面临一个根本性限制——位置编码的长度约束。传统BERT模型最多只能处理512个token&#xff0c;这严重制约了其在长文档理解、基因组分析等场景的应用潜力。…

2026/7/6 0:11:20 阅读更多 →
如何彻底告别重复点击:AutoClicker鼠标自动化完全指南

如何彻底告别重复点击:AutoClicker鼠标自动化完全指南

如何彻底告别重复点击&#xff1a;AutoClicker鼠标自动化完全指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker 还在为每天重复的鼠标点击任务感到疲惫吗…

2026/7/6 0:11:20 阅读更多 →
DQN 算法实战:CartPole-v0 环境 1000 轮训练实现 200 分满分

DQN 算法实战:CartPole-v0 环境 1000 轮训练实现 200 分满分

DQN算法实战&#xff1a;从零构建CartPole智能体的完整指南1. 环境准备与基础概念在开始构建DQN智能体之前&#xff0c;我们需要先理解几个核心概念。CartPole-v0是OpenAI Gym中的一个经典控制问题&#xff0c;目标是让小车上的杆子保持直立不倒下。这个环境有四个状态变量&…

2026/7/6 0:11:20 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻