3、环境准备:安装Docker、Docker Compose、Jenkins、GitLab、Prometheus、Alertmanager

本章节将完成事件触发Runbook联动Jenkins管道工程所需的基础环境搭建。所有组件均采用容器化部署,确保环境一致性、可移植性与快速恢复能力。部署顺序遵循依赖关系:先安装容器运行时(Docker),再安装编排工具(Docker Compose),最后依次部署GitLab、Jenkins、Prometheus与Alertmanager。

环境概览:本课程使用单台Linux服务器(Ubuntu 22.04 LTS,4 vCPU,16 GB RAM,100 GB SSD)作为实验主机。所有服务通过Docker Compose统一管理,数据卷持久化存储,网络桥接互通。
事件触发Runbook实验环境架构 实验环境容器化部署架构 Linux 主机 (Ubuntu 22.04) Docker Engine + Docker Compose GitLab 代码仓库 / Webhook 端口: 80, 443, 22 Jenkins 管道引擎 / Runbook 端口: 8080, 50000 Prometheus 指标采集 / 告警规则 端口: 9090 Alertmanager 告警路由 / 通知 端口: 9093 Webhook 触发 GitLab → Jenkins 告警 → Alertmanager

3.1 安装 Docker 与 Docker Compose

Docker 是容器化基础,Docker Compose 用于定义和运行多容器应用。以下步骤在 Ubuntu 22.04 上完成安装。

3.1.1 安装 Docker Engine

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新包索引并安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker --version
sudo docker run hello-world

3.1.2 安装 Docker Compose

Docker Compose v2 已作为 Docker 插件集成,通过 docker compose 命令使用。若需独立二进制版本,可执行以下命令:

# 下载最新稳定版 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version
版本确认:本课程使用 Docker 24.0.7 与 Docker Compose v2.24.0。生产环境建议锁定版本,避免因升级导致兼容性问题。

3.2 部署 GitLab

GitLab 作为代码仓库与 Webhook 事件源,采用 Docker 单容器部署。数据持久化至宿主机目录,映射 SSH、HTTP 与 HTTPS 端口。

# 创建 GitLab 数据目录
sudo mkdir -p /srv/gitlab/{config,logs,data}

# 启动 GitLab 容器
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  --shm-size 256m \
  gitlab/gitlab-ce:16.6.0-ce.0
资源注意:GitLab 首次启动需 3-5 分钟初始化,期间 CPU 与内存占用较高。建议分配至少 4 GB 内存给 GitLab 容器。可通过 sudo docker logs -f gitlab 监控启动进度。

3.2.1 获取初始 root 密码

# 等待 GitLab 完全启动后,获取初始密码
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

访问 http://<宿主机IP>,使用用户名 root 与上述密码登录。首次登录后建议立即修改密码。

3.3 部署 Jenkins

Jenkins 作为管道引擎与 Runbook 执行器,同样采用容器化部署。需映射 8080(Web UI)与 50000(代理节点)端口。

# 创建 Jenkins 数据目录
sudo mkdir -p /srv/jenkins

# 启动 Jenkins 容器
sudo docker run --detach \
  --name jenkins \
  --restart always \
  --publish 8080:8080 \
  --publish 50000:50000 \
  --volume /srv/jenkins:/var/jenkins_home \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --group-add $(stat -c '%g' /var/run/docker.sock) \
  jenkins/jenkins:lts-jdk17
关键挂载:挂载宿主机 Docker 套接字 (/var/run/docker.sock) 使 Jenkins 容器内可直接执行 Docker 命令,实现“容器内运行容器”(DooD)模式,便于管道中构建镜像。

3.3.1 获取初始管理员密码

# 查看 Jenkins 初始密码
sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

浏览器访问 http://<宿主机IP>:8080,输入初始密码后,选择“安装推荐的插件”完成初始化。创建第一个管理员用户后,进入系统管理页面。

3.4 部署 Prometheus 与 Alertmanager

Prometheus 负责采集指标与评估告警规则,Alertmanager 处理告警去重、分组与通知。两者通过 Docker Compose 统一管理,便于配置联动。

3.4.1 创建目录与配置文件

# 创建 Prometheus 与 Alertmanager 数据目录
sudo mkdir -p /srv/monitoring/{prometheus,alertmanager}

# 创建 Prometheus 配置文件
sudo tee /srv/monitoring/prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

rule_files:
  - "alert_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'jenkins'
    metrics_path: '/prometheus'
    static_configs:
      - targets: ['jenkins:8080']

  - job_name: 'gitlab'
    static_configs:
      - targets: ['gitlab:9090']
EOF

# 创建告警规则文件(示例)
sudo tee /srv/monitoring/prometheus/alert_rules.yml << 'EOF'
groups:
  - name: jenkins_alerts
    rules:
      - alert: JenkinsDown
        expr: up{job="jenkins"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Jenkins 服务不可用"
  - name: gitlab_alerts
    rules:
      - alert: GitLabDown
        expr: up{job="gitlab"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "GitLab 服务不可用"
EOF

# 创建 Alertmanager 配置文件
sudo tee /srv/monitoring/alertmanager/alertmanager.yml << 'EOF'
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 1m
  repeat_interval: 3h
  receiver: 'webhook'

receivers:
  - name: 'webhook'
    webhook_configs:
      - url: 'http://jenkins:8080/generic-webhook-trigger/invoke'
        send_resolved: true
EOF

3.4.2 编写 Docker Compose 文件

# 创建 Docker Compose 文件
sudo tee /srv/monitoring/docker-compose.yml << 'EOF'
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.48.0
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'

  alertmanager:
    image: prom/alertmanager:v0.26.0
    container_name: alertmanager
    restart: always
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager:/etc/alertmanager
      - alertmanager_data:/alertmanager
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'

volumes:
  prometheus_data:
  alertmanager_data:
EOF

3.4.3 启动监控栈

# 进入监控目录并启动
cd /srv/monitoring
sudo docker compose up -d

# 验证服务状态
sudo docker compose ps

# 查看日志
sudo docker compose logs -f prometheus
sudo docker compose logs -f alertmanager
访问验证:Prometheus UI 地址 http://<宿主机IP>:9090,Alertmanager UI 地址 http://<宿主机IP>:9093。在 Prometheus 的“Status → Targets”页面确认所有采集目标均为 UP 状态。

3.5 环境验证清单

完成所有组件部署后,执行以下验证步骤确保环境就绪:

组件 验证命令 / 操作 预期结果
Docker sudo docker info 显示 Server Version ≥ 24.0
Docker Compose docker compose version 显示 v2.24.0 或更高
GitLab 浏览器访问 http://<IP> 显示 GitLab 登录页面
Jenkins 浏览器访问 http://<IP>:8080 显示 Jenkins 登录页面
Prometheus 浏览器访问 http://<IP>:9090 显示 Prometheus UI,Targets 全部 UP
Alertmanager 浏览器访问 http://<IP>:9093 显示 Alertmanager UI,无告警
容器网络与端口映射关系 容器网络与端口映射关系 宿主机 (192.168.1.100) GitLab 80 → 80 22 → 22 Jenkins 8080 → 8080 50000 → 50000 Prometheus 9090 → 9090 Alertmanager 9093 → 9093 容器间通过 Docker 内部网络通信(默认 bridge) 宿主机端口映射使外部可访问各服务 UI

3.6 配置 Jenkins 插件与 GitLab 集成

环境基础就绪后,需在 Jenkins 中安装必要插件并配置 GitLab 连接,为后续事件触发管道做准备。

3.6.1 安装 Jenkins 插件

在 Jenkins 管理页面中,进入“系统管理 → 插件管理 → 可选插件”,搜索并安装以下插件:

插件名称 用途
GitLab Plugin 集成 GitLab Webhook 与 MR/Commit 触发
Generic Webhook Trigger Plugin 接收任意 Webhook 请求并解析参数触发管道
Pipeline: Stage View Plugin 可视化管道阶段执行状态
Docker Pipeline Plugin 在管道中构建与推送 Docker 镜像
Prometheus Metrics Plugin 暴露 Jenkins 指标供 Prometheus 采集

3.6.2 配置 GitLab API

# 在 GitLab 中生成 Personal Access 
# 路径:User Settings → Access Tokens → 勾选 api, read_repository, write_repository
# 复制生成的 

# 在 Jenkins 中添加 GitLab 凭据
# 路径:系统管理 → 凭据 → 系统 → 全局凭据 → 添加凭据
# 类型:GitLab API 
# API :粘贴上述 
# ID:gitlab-api-

3.6.3 配置 Prometheus 采集 Jenkins 指标

在 Jenkins 系统管理中找到“Prometheus”配置项,确保“Path”设置为 /prometheus,与 Prometheus 配置文件中 metrics_path 一致。重启 Jenkins 后,Prometheus 即可采集 Jenkins 指标。

环境就绪标志:至此,所有核心组件已部署并完成基础集成。下一阶段将进入 GitLab Webhook 配置与 Jenkins 管道创建,实现“事件触发 → Runbook 联动”的核心链路。