予枫个人主页 个人专栏: 《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实操内容。如果本文对你有帮助欢迎点赞、收藏、评论关注我一起深耕技术、少踩坑