【自动化部署】基于Docker构建CI/CD流水线

基于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

  1. 在浏览器中访问:http://你的服务器IP
  2. 使用用户名root和上面获取的密码登录
  3. 首次登录会要求修改密码

3.6 创建项目

  1. 登录后点击"New project"创建新项目
  2. 上传测试代码到仓库

✅ 此时私有化部署代码仓库已完成

四、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

  1. 访问Jenkins:http://你的服务器IP:8080
  2. 输入上面获取的初始密码
  3. 选择"安装推荐的插件"或"选择插件来安装"

更换插件下载源

  1. 进入:Manage Jenkins → Manage Plugins → Advanced

  2. 在"Update Site"中,将URL改为:

    复制代码
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  3. 点击"Submit"保存

安装必要插件

在"Available plugins"中搜索并安装插件:

  • Gitlab
  • NodeJS
  • Publish Over SSH
  • Docker
  • Docker Pipeline

4.5 配置Node.js环境

在Jenkins中配置Node.js

  1. 进入:Manage Jenkins → Tools → Global Tool Configuration
  2. 找到"NodeJS"部分,点击"Add NodeJS"
  3. 配置如下:
    • Name: node:lastest
    • 勾选"Install automatically"
    • Version: 自动选择最新的

4.6 创建并配置Jenkins项目

  1. 点击"New Item"创建新项目
  2. 选择"Freestyle project"
  3. 配置项目:

连接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

  1. 进入:Manage Jenkins → Manage Users → 选择你的用户
  2. 点击"Configure"
  3. 在"API Token"部分,点击"Add new Token"
  4. 生成Token并保存(只显示一次)

6.2 Gitlab配置Webhooks

  1. 进入Gitlab项目:Settings → Webhooks
  2. 添加Webhook:
    • URL: http://用户名:API token@IP:端口/job/项目名称/build
    • Trigger: 勾选"Push events"
    • 点击"Add webhook"

测试Webhook

点击"Test" → "Push events",如果返回200状态码,说明配置成功

6.3 验证完整流程

  1. 在本地修改代码并推送到Gitlab
  2. Gitlab自动触发Webhook
  3. Jenkins自动开始构建
  4. 构建完成后自动部署到Web服务器
  5. 访问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流程就完成了!

相关推荐
weixin_46681 小时前
K8S-高可用集群
java·docker·kubernetes
虎头金猫1 小时前
从杂乱到有序,Paperless-ngx 加个cpolar更好用
linux·运维·人工智能·docker·开源·beautifulsoup·pandas
一个很帅的帅哥2 小时前
webpack开发极简指南
前端·webpack·node.js
赵 XiaoQin12 小时前
【无标题】
docker
may_一一14 小时前
docker安装的redis状态一直是restarting
java·redis·docker
cike_y14 小时前
浅谈用docker搭建一个ctf镜像
运维·安全·网络安全·docker·容器·ctf
自己的九又四分之三站台15 小时前
Docker容器启动中需要增加一个端口
docker·容器·eureka
cqsztech16 小时前
docker环境下 Oracle 19c 标准版如何转换为19c 企业版
docker·oracle·容器