[控场AI]
· 6 分钟阅读· 3,128 字

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

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 触发流水线,依次完成拉取代码、打包、构建镜像、推送镜像、生产服务器拉取并启动容器。最终用户在浏览器里就能访问到最新版本的前后端应用。

去写一个Docker File

流水线的五个核心阶段

阶段一:拉取代码

流水线第一步是从代码仓库拉取最新代码。这个仓库可以是 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 再反向代理到后端镜像。

然后Copy

容器编排: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 配置文件后一键启动。

#Docker#Jenkins#CI/CD#自动化部署#Dockerfile#容器编排#持续集成
分享:

相关推荐