使用Docker-Compose私有化部署GitLab:从配置到运维的完整指南

一、为什么选择Docker-Compose部署GitLab?

在容器化技术普及的今天,Docker-Compose凭借其声明式配置和一键部署能力,成为私有化部署GitLab的首选方案。相较于传统虚拟机部署,Docker-Compose具有三大核心优势:

  1. 资源隔离与轻量化:每个服务(如GitLab主进程、PostgreSQL数据库、Redis缓存)运行在独立容器中,通过cgroups和namespace实现资源隔离,避免服务间冲突。典型部署场景下,GitLab容器仅占用2-4GB内存,显著低于虚拟机方案。
  2. 配置可复用性:通过docker-compose.yml文件定义服务依赖关系和网络拓扑,实现配置即代码(Configuration as Code)。例如,以下配置片段展示了如何定义GitLab与数据库的连接:
    1. services:
    2. gitlab:
    3. image: gitlab/gitlab-ee:latest
    4. environment:
    5. DB_HOST: postgres
    6. DB_USER: gitlab
    7. DB_PASSWORD: secure_password
    8. depends_on:
    9. - postgres
    10. postgres:
    11. image: postgres:14
    12. environment:
    13. POSTGRES_USER: gitlab
    14. POSTGRES_PASSWORD: secure_password
  3. 快速迭代与回滚:基于镜像的部署方式支持版本化管理,通过修改image标签即可完成版本升级。结合GitLab内置的备份机制,可实现分钟级的服务回滚。

二、部署前环境准备

1. 硬件资源要求

组件 最小配置 推荐配置
CPU 2核 4核(支持并发100+用户)
内存 4GB 8GB(含缓存)
存储 40GB(SSD) 100GB+(SSD)
网络带宽 10Mbps 100Mbps(跨地域访问)

2. 软件依赖安装

  • Docker引擎:建议使用最新稳定版(如24.0.x),通过官方脚本安装:
    1. curl -fsSL https://get.docker.com | sh
  • Docker-Compose:推荐v2.20+版本,支持插件化扩展:
    1. sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    2. sudo chmod +x /usr/local/bin/docker-compose

3. 网络规划要点

  • 端口映射策略:默认需暴露80(HTTP)、443(HTTPS)、22(SSH)端口,建议通过反向代理(如Nginx)统一管理。
  • 子网划分:使用172.18.0.0/16等私有地址段,避免与宿主机网络冲突。
  • DNS解析:配置GITLAB_HOST环境变量指向实际域名,确保邮件通知和Webhook功能正常。

三、核心配置文件解析

1. 基础配置模板

  1. version: '3.8'
  2. services:
  3. gitlab:
  4. image: gitlab/gitlab-ee:16.5.0-ee.0
  5. container_name: gitlab
  6. restart: unless-stopped
  7. hostname: 'gitlab.example.com'
  8. environment:
  9. GITLAB_ROOT_PASSWORD: 'StrongPassword123!'
  10. GITLAB_OMNIBUS_CONFIG: |
  11. external_url 'https://gitlab.example.com'
  12. gitlab_rails['ldap_enabled'] = false
  13. postgresql['enable'] = false
  14. ports:
  15. - '80:80'
  16. - '443:443'
  17. - '2222:22'
  18. volumes:
  19. - './config:/etc/gitlab'
  20. - './logs:/var/log/gitlab'
  21. - './data:/var/opt/gitlab'
  22. depends_on:
  23. - redis
  24. - postgres
  25. postgres:
  26. image: postgres:14-alpine
  27. environment:
  28. POSTGRES_USER: gitlab
  29. POSTGRES_PASSWORD: 'PostgresPassword123!'
  30. POSTGRES_DB: gitlabdb
  31. volumes:
  32. - './postgres:/var/lib/postgresql/data'
  33. redis:
  34. image: redis:7-alpine
  35. command: redis-server --requirepass RedisPassword123!
  36. volumes:
  37. - './redis:/data'

2. 关键配置项说明

  • 持久化存储:通过volumes挂载三个核心目录:
    • config:存储服务器配置(如gitlab.rb
    • logs:包含应用日志和审计日志
    • data:存储仓库数据、构建缓存等
  • 安全配置
    • 禁用默认管理员账户创建:设置GITLAB_ROOT_PASSWORD环境变量
    • 强制HTTPS:在external_url中指定https://协议
    • SSH端口映射:将容器22端口映射到宿主机非标准端口(如2222)

四、部署后优化实践

1. 性能调优策略

  • 数据库优化:在PostgreSQL容器中添加shared_buffers = 256MB配置,提升并发查询能力。
  • Git垃圾回收:配置每周自动执行:
    1. docker exec -it gitlab gitlab-rake gitlab:gc
  • 对象存储集成:将LFS大文件存储至S3兼容对象存储,减少本地磁盘I/O压力。

2. 安全加固方案

  • 防火墙规则:仅允许管理IP访问22/80/443端口:
    1. iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
    2. iptables -A INPUT -p tcp --dport 80 -j DROP
  • 双因素认证:在Admin面板启用Enforce two-factor authentication策略。
  • 定期安全扫描:集成Clair或Trivy进行容器镜像漏洞扫描。

3. 监控告警体系

  • Prometheus集成:通过gitlab_exporter暴露监控指标:
    1. services:
    2. gitlab:
    3. environment:
    4. GITLAB_OMNIBUS_CONFIG: |
    5. prometheus_monitoring['enable'] = true
  • 自定义告警规则:设置磁盘空间阈值告警(如剩余空间<10%时触发)。

五、常见问题解决方案

1. 502 Bad Gateway错误

  • 原因:Unicorn工作进程崩溃或Puma超时
  • 排查步骤
    1. 检查/var/log/gitlab/gitlab-rails/production.log
    2. 调整unicorn['worker_timeout'] = 60配置
    3. 增加容器内存限制

2. 邮件发送失败

  • 配置示例
    1. environment:
    2. GITLAB_OMNIBUS_CONFIG: |
    3. gitlab_rails['smtp_enable'] = true
    4. gitlab_rails['smtp_address'] = "smtp.example.com"
    5. gitlab_rails['smtp_port'] = 587
    6. gitlab_rails['smtp_user'] = "user@example.com"
    7. gitlab_rails['smtp_password'] = "password"
  • 验证命令
    1. docker exec -it gitlab gitlab-rails runner "Notify.test_email('recipient@example.com', 'Test Subject', 'Test Body').deliver_now"

3. 备份恢复流程

  • 备份命令
    1. docker exec -it gitlab gitlab-rake gitlab:backup:create
  • 恢复步骤
    1. 停止服务:docker-compose down
    2. 删除数据目录:rm -rf ./data/*
    3. 放置备份文件至/var/opt/gitlab/backups/
    4. 执行恢复:docker exec -it gitlab gitlab-rake gitlab:backup:restore BACKUP=1689876543_2023_07_20_16.5.0

六、进阶运维技巧

1. 高可用架构设计

  • 主从复制:配置PostgreSQL流复制,设置primary_conninfo = 'host=postgres_slave port=5432'
  • 负载均衡:使用HAProxy实现GitLab Web服务的活性检测:
    1. backend gitlab_servers
    2. server gitlab1 172.18.0.2:80 check
    3. server gitlab2 172.18.0.3:80 check backup

2. 自动化运维脚本

  1. #!/bin/bash
  2. # 每日维护脚本
  3. docker-compose exec gitlab gitlab-rake gitlab:check
  4. docker-compose exec gitlab gitlab-rake gitlab:cleanup:repos
  5. find /var/opt/gitlab/backups/ -name "*.tar" -mtime +30 -delete

3. 升级策略

  • 分阶段升级
    1. 备份当前数据
    2. 修改docker-compose.yml中的镜像标签
    3. 执行docker-compose pull && docker-compose up -d
    4. 验证gitlab-rake gitlab:env:info输出版本

通过以上系统化的部署与运维方案,企业可在4小时内完成从零到一的GitLab私有化部署,并建立可持续的运维体系。实际案例显示,某300人研发团队采用此方案后,代码提交响应时间缩短60%,年度IT成本降低45%。