Docker Compose 编排 GitLab CE 16.7.2:1个文件管理3大服务配置

在现代化开发流程中,GitLab 已成为 DevOps 团队不可或缺的一站式平台。本文将展示如何通过 Docker Compose 声明式编排 GitLab CE 16.7.2 版本,实现跨平台部署(支持 ARM64/AMD64 架构),并通过单文件管理 Web、SSH 和 Sidekiq 三大核心服务。

1. 环境准备与架构设计

GitLab 作为资源密集型应用,建议部署主机满足以下最低配置:

  • CPU :4 核(ARM64 或 x86_64)
  • 内存 :4GB(生产环境推荐 8GB+)
  • 存储 :至少 20GB 可用空间

传统单容器部署方式存在配置分散、难以版本控制的痛点。我们采用 Docker Compose 方案具有三大优势:

  1. 服务定义集中化 :所有服务、网络、卷配置在单个 YAML 文件中
  2. 跨平台一致性 :通过多阶段构建支持不同 CPU 架构
  3. 配置即代码 :docker-compose.yml 可纳入版本控制系统管理

提示:若使用 Apple Silicon 或树莓派等 ARM 设备,需确认 Docker 已启用 buildx 多平台构建支持

2. 编排文件深度解析

以下是完整的 docker-compose.yml 文件,包含关键配置注释:

version: '3.8'

services:
  gitlab:
    image: gitlab/gitlab-ce:16.7.2-ce.0
    container_name: gitlab-ce
    restart: unless-stopped
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com'
        gitlab_rails['initial_root_password'] = '${GITLAB_ROOT_PASSWORD}'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        redis['bind'] = '127.0.0.1'
        postgresql['shared_buffers'] = '256MB'
    ports:
      - "80:80"
      - "443:443"
      - "2222:22"
    volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_data:/var/opt/gitlab
      - gitlab_logs:/var/log/gitlab
    healthcheck:
      test: ["CMD", "/opt/gitlab/bin/gitlab-healthcheck", "--fail"]
      interval: 1m
      timeout: 10s
      retries: 3

volumes:
  gitlab_config:
  gitlab_data:
  gitlab_logs:

networks:
  default:
    name: gitlab_network

关键配置说明:

配置项 说明 推荐值
GITLAB_OMNIBUS_CONFIG 内嵌 Ruby 配置语法 需包含 external_url
gitlab_shell_ssh_port SSH 克隆端口映射 避免与主机 22 端口冲突
postgresql['shared_buffers'] 数据库缓存大小 内存的 1/4
healthcheck 容器健康监测 使用官方检查脚本

3. 跨平台构建实践

针对 ARM64 设备(如 Mac M1/M2、树莓派 4),我们需要自定义 Dockerfile:

# 多阶段构建 - 同时支持 x86_64 和 arm64
FROM --platform=$BUILDPLATFORM alpine as builder
ARG TARGETARCH
RUN apk add --no-cache curl
RUN case ${TARGETARCH} in \
      "amd64") DL_ARCH="x86_64" ;; \
      "arm64") DL_ARCH="aarch64" ;; \
    esac && \
    curl -L -o /gitlab.deb "https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/jammy/gitlab-ce_16.7.2-ce.0_${DL_ARCH}.deb/download.deb"

FROM ubuntu:22.04
COPY --from=builder /gitlab.deb /tmp/
RUN apt-get update && \
    apt-get install -y /tmp/gitlab.deb && \
    rm -f /tmp/gitlab.deb && \
    apt-get clean
CMD ["/assets/wrapper"]

构建命令示例:

# 启用 buildx 多平台构建
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t yourrepo/gitlab-ce:16.7.2 .

4. 初始化与故障排查

首次启动后执行以下操作:

  1. 获取 root 密码
docker exec -it gitlab-ce \
  grep 'Password:' /etc/gitlab/initial_root_password
  1. 检查服务状态
docker exec gitlab-ce gitlab-ctl status

常见问题解决方案:

  • 502 错误 :通常因内存不足导致,增加容器内存限制
  • SSH 连接失败 :检查 gitlab.rb gitlab_shell_ssh_port 配置
  • ARM64 性能问题 :在 docker-compose.yml 中添加资源限制:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
    

5. 高级配置技巧

5.1 邮件服务集成

GITLAB_OMNIBUS_CONFIG 中添加 SMTP 配置:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "user@example.com"
gitlab_rails['smtp_password'] = "${SMTP_PASSWORD}"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true

5.2 定期备份方案

创建备份脚本 gitlab-backup.sh

#!/bin/bash
docker exec -t gitlab-ce gitlab-backup create
cp /var/lib/docker/volumes/gitlab_config/_data/*.rb ./config-backups/

添加到 crontab:

0 2 * * * /path/to/gitlab-backup.sh

5.3 性能调优参数

针对 8GB 内存主机的优化建议:

unicorn['worker_processes'] = 3
postgresql['shared_buffers'] = "1GB"
sidekiq['concurrency'] = 5
prometheus_monitoring['enable'] = false  # 资源紧张时可关闭

6. 安全加固措施

  1. HTTPS 强制跳转
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"
  1. 容器安全限制
cap_drop:
  - ALL
security_opt:
  - no-new-privileges:true
read_only: true
  1. 定期更新策略
watchtower:
  image: containrrr/watchtower
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  command: --interval 3600 --cleanup
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐