Docker+Jenkins CI/CD实战:代码提交到上线全流程

拆解企业自建 GitLab+Jenkins 的 Docker CI/CD 流水线五阶段与关键实现。
文章基于 B 站技术 UP 主的讲解,介绍了企业自建 Docker + Jenkins 的 CI/CD 流水线。企业出于代码安全考虑,通常用私有 GitLab 存放代码、Jenkins 作为内部平台,流水线以 Pipeline 形式依次执行拉取代码、Maven/npm 打包、编写 Dockerfile、构建并推送镜像到私有仓库、生产服务器拉取并启动容器、浏览器访问应用五个阶段。后端 SpringBoot 项目经 Maven 打包为 jar,Dockerfile 用 FROM、WORKDIR、COPY 和 java -jar 启动;前端两个项目共用一个 Nginx 镜像,分别放置 dist 目录并统一配置反向代理。容器编排复杂场景用 K8S,简单场景用 Docker Compose 编写 YAML 一键启动。标准化流水线大幅压缩了人为失误空间。
手动部署和平台自动化部署之后,企业里更常见的方案是自建 Docker + Jenkins 流水线。它把“提交代码”到“应用上线”的每一步都标准化,也就是常说的 CI/CD(持续集成与持续部署)。本文基于 B 站技术 UP 主的讲解,拆解这条流水线的完整链路,并给出后端、前端和容器编排环节的关键实现细节。
为什么企业偏爱自建 CI/CD 平台
企业通常不会把代码仓库直接暴露在公网,而是用 GitLab 自建私有仓库,代码只在内部网络流转,降低泄露风险。Jenkins 同样提前部署在 Linux 服务器上,作为公司内部平台使用。这套组合的好处是流程可控:仓库里可以配置自动触发 Pipeline,也可以保留手动点击触发的入口,兼顾效率与审批需求。
整个流程以 Pipeline(流水线)形式从上到下依次执行。程序员把代码提交到代码仓库后,Jenkins 触发流水线,依次完成拉取代码、打包、构建镜像、推送镜像、生产服务器拉取并启动容器。最终用户在浏览器里就能访问到最新版本的前后端应用。

流水线的五个核心阶段
阶段一:拉取代码
流水线第一步是从代码仓库拉取最新代码。这个仓库可以是 GitHub,也可以是企业自建的 GitLab。对于后端项目,后续会使用 Maven 打包成 jar 包;对于前端项目,则执行 npm run build 生成 dist 目录,两者都是打包后的产物。
Maven 与 npm 打包:Maven 是 Java 生态的构建工具,通过 pom.xml 声明依赖与插件,执行 mvn package 会编译源码、运行测试并将项目打包为可执行的 jar。SpringBoot 项目默认生成 fat jar,内嵌 Tomcat,可直接 java -jar 运行。npm 是 Node.js 的包管理器,npm run build 会调用构建脚本(如 Webpack/Vite),把源码、样式和静态资源编译压缩为浏览器可加载的 dist 目录。两者的共同点是把“源代码”转换为“可部署产物”,这也是后续 Docker 镜像构建的输入。
阶段二:编写 Dockerfile
在进入镜像构建之前,必须为每个项目编写 Dockerfile。由于每个项目的目录结构不同,Dockerfile 需要根据项目实际情况定制。它配合前面生成的 jar 包或 dist 目录,才能构建出可运行的 Docker 镜像。
阶段三:构建并推送镜像
Dockerfile 加上打包产物,就能构建出 Docker 镜像。镜像随后被推送到镜像仓库。企业一般使用私有仓库(如 Harbor),与私有代码仓库同理,保证镜像不对外公开。
Harbor 与镜像仓库:镜像仓库分为公有(如 Docker Hub)和私有(如 Harbor)两类。Harbor 是 CNCF 开源的私有镜像仓库,提供基于角色的访问控制、镜像复制、漏洞扫描和镜像签名等能力。在 CI/CD 中,Jenkins 构建完镜像后执行 docker push 推送到 Harbor,生产服务器再执行 docker pull 拉取。私有仓库保证了镜像只在企业内部网络流转,与私有 GitLab 一样,是代码与制品安全的重要一环。
阶段四:生产服务器拉取镜像
构建服务器和生产服务器通常是分开的。生产服务器从镜像仓库拉取最新镜像,然后启动容器。镜像启动后即成为容器,应用开始运行。
阶段五:访问应用
前端和后端容器都启动后,用户通过浏览器访问前端页面,前端再反向代理到后端服务,整个应用链路就打通了。
后端:从源码到容器的完整路径
后端项目通常是 SpringBoot 源码,经过 Maven 打包生成 jar 包,再结合 Dockerfile 构建镜像。Dockerfile 中有几个核心命令值得注意。
FROM 指定基础镜像。UP 主选择的是包含 JDK 的 Eclipse 镜像,这样无需手动安装 JDK;如果基于 CentOS 或 Ubuntu 等普通发行版,则需要额外安装 JDK 依赖。WORKDIR 指定工作目录,后续 COPY 和命令都在该目录下执行。COPY 把服务器上的 jar 包复制到镜像内的工作目录。最后一条命令让镜像在作为容器启动时执行 java -jar,从而把程序运行起来。

前端:多项目共用一个 Nginx 镜像
前端项目同样是源码经过打包生成 dist 目录,再复制进镜像。UP 主的做法是让两个前端项目共用一个 Nginx 镜像:基于 Nginx 基础镜像,把两个前端项目的 dist 目录分别放到不同目录下,同时提前编写 Nginx 配置文件并拷贝进镜像。这样两个前端内容由同一个 Nginx 管理,启动容器即可访问,Nginx 再反向代理到后端镜像。

容器编排:K8S 或 Docker Compose
当需要同时管理前端和后端多个容器时,一般会用到容器编排工具。复杂场景用 K8S;如果需求没那么复杂,Docker 自带的 Docker Compose 就够用。Compose 需要编写 YAML 配置文件,声明前端镜像名、容器名、暴露端口,以及后端服务对应配置,一条命令即可自动启动两个容器。

从手动到自动:标准化的价值
从手动部署到自动化部署,再到 Jenkins 流水线,方案的标准化和平台化程度越来越高。团队成员修改代码后,只需在平台上点一下触发,Jenkins 就会自动完成打包、构建、推送、部署的全过程。生产服务器上运行的始终是最新代码,人为操作失误的空间被大幅压缩。
对于想深入理解 Docker 命令和镜像原理的开发者,UP 主建议回看 Docker 专题内容,再结合本文的流水线视角,就能把 CI/CD 的每个环节串起来。
Pipeline as Code:Jenkins 流水线通常以 Jenkinsfile 的形式存放在代码仓库中,称为“流水线即代码”。它用声明式(Declarative)或脚本式(Scripted)语法描述拉取代码、打包、构建镜像、推送、部署等阶段,使流水线配置与代码一同版本化、可审查、可复用。配合 GitLab 的 Webhook,代码推送即可自动触发流水线;也可以在 Jenkins 界面保留手动触发入口,用于生产发布等需要审批的场景。
常见问题
Q:Dockerfile 必须用包含 JDK 的基础镜像吗? A:不是必须。也可以基于普通 Linux 发行版,但需要手动安装 JDK 依赖。使用 JDK 镜像更省事。
Q:前端为什么可以共用一个 Nginx 镜像? A:两个前端项目的 dist 目录可以放在镜像内不同路径下,由同一个 Nginx 配置文件管理,反向代理到后端即可。
Q:没有 K8S 环境能跑这套流程吗? A:可以。Docker Compose 足以编排前后端容器,编写 YAML 配置文件后一键启动。
相关推荐

达芬奇如何证明太阳是热的?一段被忽视的科学史
达芬奇如何用凹面镜实验推翻亚里士多德的冷太阳理论?本文梳理这段被忽视的科学史,揭示科学思维在十五世纪的萌芽,以及达芬奇对太阳发热和生命本质的冷峻观察。

SharpLogic:用k-CNF为LangGraph路由图做形式化查错
SharpLogic开源项目将LangGraph风格的多智能体路由与重试图映射为k-CNF,用Rust内核统计死锁与失败路径(#F计数),提供Python AgentGuard钩子与CLI,在发布前做形式化门禁检查。本文分析其原理、与评测的互补关系及社区关注的建模成本问题。

PPO训练Franka机械臂抓取放置:一个强化学习入门项目
一个用PPO算法在PyBullet中训练Franka Panda机械臂完成抓取放置任务的强化学习项目,涵盖技术栈选型、任务设计难点与未来文本/语音指令交互计划,适合入门者参考。