基于Docker搭建CI/CD流水线
-
- 一、部署目标与服务器配置
-
- [1.1 目标](#1.1 目标)
- [1.2 服务器](#1.2 服务器)
- 二、环境准备与配置
-
- [2.1 安装Docker和Docker Compose](#2.1 安装Docker和Docker Compose)
- [2.2 配置Docker镜像加速](#2.2 配置Docker镜像加速)
- 三、Gitlab私有仓库搭建(Docker方式)
-
- [3.1 创建Gitlab数据目录](#3.1 创建Gitlab数据目录)
- [3.2 创建Docker Compose配置文件](#3.2 创建Docker Compose配置文件)
- [3.3 启动Gitlab容器](#3.3 启动Gitlab容器)
- [3.4 获取初始管理员密码](#3.4 获取初始管理员密码)
- [3.5 访问Gitlab](#3.5 访问Gitlab)
- [3.6 创建项目](#3.6 创建项目)
- 四、Jenkins持续集成配置(Docker方式)
-
- [4.1 创建Jenkins数据目录](#4.1 创建Jenkins数据目录)
- [4.2 创建Docker Compose配置文件](#4.2 创建Docker Compose配置文件)
- [4.3 启动Jenkins容器](#4.3 启动Jenkins容器)
- [4.4 配置Jenkins](#4.4 配置Jenkins)
- [4.5 配置Node.js环境](#4.5 配置Node.js环境)
- [4.6 创建并配置Jenkins项目](#4.6 创建并配置Jenkins项目)
- 五、CD持续交付配置
-
- [5.1 准备Web服务器(Docker方式)](#5.1 准备Web服务器(Docker方式))
- 六、配置推送代码时触发构建
-
- [6.1 Jenkins中生成API Token](#6.1 Jenkins中生成API Token)
- [6.2 Gitlab配置Webhooks](#6.2 Gitlab配置Webhooks)
- [6.3 验证完整流程](#6.3 验证完整流程)
- [七、Docker Compose完整编排](#七、Docker Compose完整编排)
- 八、故障排查
技术栈:Gitlab CE latest + Jenkins (BlueOcean) latest + Ubuntu 24.04 + Docker + Docker Compose + Node.js latest
一、部署目标与服务器配置
1.1 目标
模拟企业级自动化部署场景,使用Docker容器化技术搭建包含以下组件的CI/CD流水线:
bash
前端代码仓库 → Gitlab (Docker) → Jenkins (Docker) → Web Server (Docker)
1.2 服务器
| 服务器角色 | 配置 | 主要组件 | 系统 |
|---|---|---|---|
| Gitlab服务器 | 4核8G | Gitlab CE | Ubuntu 24.04 |
| Jenkins服务器 | 2核4G | Jenkins BlueOcean (Docker) + Docker | Ubuntu 24.04 |
| Web应用服务器 | 2核4G | Node.js latest (Docker) + Nginx (Docker) | Ubuntu 24.04 |
部署说明:
- 一般公司代码不能放在公有的云服务器上,所以需要私有化部署一个仓库管理系统,本次选型为Gitlab并使用Docker容器化部署在一台云服务器上
- Jenkins一般和一些工具放在一个服务器上,这里也单独部署在一个存放工具类的云服务器,使用Docker容器化部署
- 使用Docker容器化部署的优势:环境隔离 、易于管理 、快速部署 、资源利用率高
二、环境准备与配置
| 工具名称 | 版本号 | 部署方式 |
|---|---|---|
| Docker | 24.0+ | Ubuntu官方仓库 |
| Docker Compose | 2.20+ | Docker官方仓库 |
| Gitlab CE | latest | Docker Hub |
| Jenkins BlueOcean | latest | Docker Hub |
| Node.js | latest | Docker官方镜像 |
| Nginx | latest | Docker官方镜像 |
2.1 安装Docker和Docker Compose
更新系统包
bash
sudo apt update
sudo apt upgrade -y
卸载旧版本
bash
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
添加Docker官方GPG key
bash
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
添加镜像仓库
bash
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
bash
sudo apt update
安装Docker
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证Docker安装
bash
sudo docker --version
sudo docker compose version
将当前用户添加到docker组(避免每次使用sudo)
bash
sudo usermod -aG docker $USER
需要重新登录才能生效
2.2 配置Docker镜像加速
去云服务器对应的服务商申请一个镜像加速地址。如果不是云服务器,可以去华为云申请一个专属的加速地址:华为云镜像
bash
# 创建或编辑daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"registry-mirrors": [
"镜像加速地址"
]
}
EOF
# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证配置
docker info | grep -A 10 "Registry Mirrors"
三、Gitlab私有仓库搭建(Docker方式)
3.1 创建Gitlab数据目录
bash
# 创建数据存储目录
sudo mkdir -p /srv/gitlab/config
sudo mkdir -p /srv/gitlab/data
sudo mkdir -p /srv/gitlab/logs
3.2 创建Docker Compose配置文件
创建/srv/gitlab/docker-compose.yml文件:
bash
sudo tee /srv/gitlab/docker-compose.yml > /dev/null <<EOF
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: '服务器ip' # 修改为你的域名或IP
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://服务器ip'
ports:
- '80:80'
- '443:443'
- '2222:22'
volumes:
- /srv/gitlab/config:/etc/gitlab
- /srv/gitlab/data:/var/opt/gitlab
- /srv/gitlab/logs:/var/log/gitlab
shm_size: '256m'
EOF
3.3 启动Gitlab容器
bash
cd /srv/gitlab
sudo docker compose up -d

查看容器状态
bash
sudo docker ps | grep gitlab
查看启动日志(首次启动需要几分钟)
bash
sudo docker logs -f gitlab
⚠️ 注意:如果内存不足会导致容器起不来,此时需要进入容器修改gitlab配置
bash
docker exec -it gitlab /bin/sh
bash
vi /etc/gitlab/gitlab.rb
bash
puma['worker_processes'] = 0
sidekiq['concurrency'] = 10
prometheus_monitoring['enable'] = false
gitlab_rails['env'] = {
'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
gitaly['configuration'] = {
concurrency: [
{
'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
'max_per_repo' => 3,
}, {
'rpc' => "/gitaly.SSHService/SSHUploadPack",
'max_per_repo' => 3,
},
],
cgroups: {
repositories: {
count: 2,
},
mountpoint: '/sys/fs/cgroup',
hierarchy_root: 'gitaly',
memory_bytes: 500000,
cpu_shares: 512,
},
}
gitaly['env'] = {
'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000',
'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2'
}
bash
gitlab-ctl reconfigure
gitlab-ctl restart
💡 提示:出现远程访问网页超时,可能是端口没有放开,记得去修改云服务器的安全组
3.4 获取初始管理员密码
等待Gitlab完全启动后(大约2-5分钟),获取初始密码:
bash
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
3.5 访问Gitlab
- 在浏览器中访问:
http://你的服务器IP - 使用用户名
root和上面获取的密码登录 - 首次登录会要求修改密码
3.6 创建项目
- 登录后点击"New project"创建新项目
- 上传测试代码到仓库
✅ 此时私有化部署代码仓库已完成
四、Jenkins持续集成配置(Docker方式)
4.1 创建Jenkins数据目录
bash
sudo mkdir -p /srv/jenkins/data
4.2 创建Docker Compose配置文件
创建/srv/jenkins/docker-compose.yml文件:
bash
sudo tee /srv/jenkins/docker-compose.yml > /dev/null <<EOF
services:
jenkins:
image: jenkinsci/blueocean:latest
container_name: jenkins
restart: always
user: root
ports:
- '8080:8080'
- '50000:50000'
volumes:
- /srv/jenkins/data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
environment:
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false
EOF
4.3 启动Jenkins容器
bash
cd /srv/jenkins
sudo docker compose up -d
查看容器状态
bash
sudo docker ps | grep jenkins
查看初始管理员密码
bash
sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
4.4 配置Jenkins
- 访问Jenkins:
http://你的服务器IP:8080 - 输入上面获取的初始密码
- 选择"安装推荐的插件"或"选择插件来安装"
更换插件下载源
-
进入:Manage Jenkins → Manage Plugins → Advanced
-
在"Update Site"中,将URL改为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json -
点击"Submit"保存

安装必要插件
在"Available plugins"中搜索并安装插件:
- Gitlab
- NodeJS
- Publish Over SSH
- Docker
- Docker Pipeline
4.5 配置Node.js环境
在Jenkins中配置Node.js
- 进入:Manage Jenkins → Tools → Global Tool Configuration
- 找到"NodeJS"部分,点击"Add NodeJS"
- 配置如下:
- Name:
node:lastest - 勾选"Install automatically"
- Version: 自动选择最新的

- Name:
4.6 创建并配置Jenkins项目
- 点击"New Item"创建新项目
- 选择"Freestyle project"
- 配置项目:
连接Git仓库
- Source Code Management: 选择"Git"
- Repository URL: 输入你的Gitlab仓库地址
- Credentials: 添加Gitlab的用户名和密码或SSH密钥

触发器配置
- Build Triggers: 勾选"Build when a change is pushed to GitLab"
- 配置Gitlab连接信息

构建环境
- 勾选"Provide Node & npm bin/ folder to PATH"
- 选择之前配置的Node.js版本

构建脚本
在"Build"部分添加"Execute shell":
bash
if [ -d "node_modules" ]; then
echo "✅ 依赖已安装"
else
echo "➡️ 正在安装依赖..."
npm install && echo "✅ 依赖安装完成" || echo "❌ 安装失败,请检查网络或package.json"
fi
git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT | grep package.json && npm install
npm run build
echo 'build success'

测试构建
点击"Build Now"测试构建是否成功

五、CD持续交付配置
5.1 准备Web服务器(Docker方式)
创建Web服务器目录结构
bash
sudo mkdir -p /srv/web/app
sudo mkdir -p /srv/web/nginx
创建Nginx配置文件
创建/srv/web/nginx/nginx.conf:
bash
sudo tee /srv/web/nginx/nginx.conf > /dev/null <<EOF
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files \$uri \$uri/ /index.html;
}
}
EOF
创建Docker Compose配置文件
创建/srv/web/docker-compose.yml:
bash
sudo tee /srv/web/docker-compose.yml > /dev/null <<EOF
services:
nginx:
image: nginx:latest
container_name: web-nginx
restart: always
ports:
- '80:80'
volumes:
- /srv/web/app:/usr/share/nginx/html
- /srv/web/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
EOF
启动Web服务器
bash
cd /srv/web
sudo docker compose up -d
使用Docker方式部署
在jenkins构建脚本末尾添加
bash
docker cp dist/. web-nginx:/usr/share/nginx/html/
docker restart web-nginx

重新构建一下,构建成功!

六、配置推送代码时触发构建
6.1 Jenkins中生成API Token
- 进入:Manage Jenkins → Manage Users → 选择你的用户
- 点击"Configure"
- 在"API Token"部分,点击"Add new Token"
- 生成Token并保存(只显示一次)

6.2 Gitlab配置Webhooks
- 进入Gitlab项目:Settings → Webhooks
- 添加Webhook:
- URL:
http://用户名:API token@IP:端口/job/项目名称/build - Trigger: 勾选"Push events"
- 点击"Add webhook"
- URL:
测试Webhook
点击"Test" → "Push events",如果返回200状态码,说明配置成功

6.3 验证完整流程
- 在本地修改代码并推送到Gitlab
- Gitlab自动触发Webhook
- Jenkins自动开始构建
- 构建完成后自动部署到Web服务器
- 访问Web服务器验证部署结果
删除页面中的图片,验证成功


七、Docker Compose完整编排
如果你的服务器配置较高,也可以直接创建统一的docker-compose.yml:
yaml
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://服务器ip'
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- gitlab_config:/etc/gitlab
- gitlab_data:/var/opt/gitlab
- gitlab_logs:/var/log/gitlab
shm_size: '256m'
jenkins:
image: jenkinsci/blueocean:latest
container_name: jenkins
restart: always
user: root
ports:
- '8080:8080'
- '50000:50000'
volumes:
- jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- gitlab
web:
image: nginx:latest
container_name: web-nginx
restart: always
ports:
- '8000:80'
volumes:
- web_data:/usr/share/nginx/html
depends_on:
- jenkins
volumes:
gitlab_config:
gitlab_data:
gitlab_logs:
jenkins_data:
web_data:
八、故障排查
Gitlab无法访问
bash
# 检查容器状态
sudo docker ps | grep gitlab
# 查看日志
sudo docker logs gitlab
# 检查端口占用
sudo netstat -tunlp | grep 80
Jenkins构建失败
bash
# 查看Jenkins日志
sudo docker logs jenkins
# 检查Jenkins数据目录权限
sudo ls -la /srv/jenkins/data
Docker命令权限问题
bash
# 将用户添加到docker组
sudo usermod -aG docker $USER
# 重新登录
🎉 至此,基于Docker的CI/CD流程就完成了!