核心是围绕环境隔离、流程可控、触发自动三大目标组织组件:1. 准备docker与docker compose并配置权限;2. 用多阶段dockerfile分层构建前后端镜像;3. jenkins通过dind模式驱动声明式pipeline完成构建、推送与部署;4. 用docker-compose.yml统一编排服务,实现一键启停与配置外化。

用 Docker 搭建前后端自动化部署流水线,核心不是“先装 Docker 再堆服务”,而是围绕环境隔离、流程可控、触发自动三个目标来组织组件。关键在于让构建环境干净可复现,让部署动作可定义、可回溯、可重复。下面分四块讲清楚怎么做。
1. 基础容器环境准备(Docker + Docker Compose)
先确保服务器(CentOS 7/Ubuntu 20.04+)上装好 Docker 和 docker-compose,并验证权限:
- 安装 Docker:执行
yum install -y yum-utils && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum install -y docker-ce docker-ce-cli containerd.io,然后systemctl start docker && systemctl enable docker - 把 Jenkins 或构建用户加入 docker 组:
usermod -aG docker jenkins,否则容器内无法调用 docker 命令 - 安装 docker-compose:下载二进制文件到
/usr/local/bin/docker-compose,加执行权限,运行docker-compose --version确认可用
2. 前后端镜像分层构建(多阶段 Dockerfile)
避免把 node_modules、devDependencies 打进生产镜像。用多阶段构建分离“构建”和“运行”:
-
前端(如 Vue/React):第一阶段用
node:18-alpine安装依赖并执行npm run build;第二阶段用nginx:alpine,只 COPY 构建产物dist/和自定义nginx.conf -
后端(如 Spring Boot):用
openjdk:17-jre-slim为基础镜像,COPY 打包好的 JAR 包,设置ENTRYPOINT ["java","-jar","/app.jar"],不装 Maven 或 JDK 全套工具链 - 在项目根目录加
.dockerignore,排除node_modules/、src/、test/、.git等非必需文件,加快构建速度
3. Jenkins 流水线驱动部署(声明式 Pipeline + Docker-in-Docker)
Jenkins 不只是“跑命令的机器”,它要能启动容器、构建镜像、推送到仓库、再更新线上服务。重点配置两件事:
-
让 Jenkins 能用 Docker:推荐 Docker-in-Docker(DinD)模式——启动 Jenkins 容器时挂载
/var/run/docker.sock,并加--privileged(或更安全的--cap-add=SYS_ADMIN),这样 Pipeline 中就能直接执行docker build和docker push -
写一个可复用的 Jenkinsfile:定义拉代码 → 构建前端镜像 → 推送至私有 Harbor → 停旧容器 → 启新容器。例如后端部署段可写:
sh 'docker stop my-backend || true' && sh 'docker rm my-backend || true' && sh 'docker run -d --name my-backend --network my-net -p 8080:8080 registry.example.com/my-backend:${BUILD_NUMBER}'
4. 一键启停与服务编排(docker-compose.yml 统一管理)
别让 Jenkins 直接裸跑一堆 docker run。把所有服务(前端 Nginx、后端应用、MySQL、Redis)定义在 docker-compose.yml 中,由 Jenkins 在部署时执行 docker-compose up -d:
- 各服务通过
service name互访(如后端代码里数据库地址写mysql:3306,而不是127.0.0.1) - 使用
env_file外部化敏感配置(数据库密码、API Key),避免硬编码 - Jenkins 执行部署时,先
scp更新 compose 文件和镜像 tag,再远程运行docker-compose pull && docker-compose up -d











