☰
Docker部署GitLab全家桶:环境一致性与高效CI/CD实践
2026/10/28 14:59:46 网站建设 项目流程

1. 为什么选择Docker部署GitLab全家桶?

在团队协作开发中,代码管理平台如同空气般不可或缺。传统物理机部署GitLab需要处理Ruby环境、数据库依赖、服务进程管理等复杂问题,而Docker化部署就像把整个生态系统打包进标准化集装箱。我亲历过从源码编译安装到Docker化迁移的全过程,后者将部署时间从4小时压缩到15分钟。

Docker部署的核心优势在于:

  • 环境一致性:开发、测试、生产环境使用完全相同的镜像,杜绝"在我机器上能跑"的问题
  • 资源隔离:CPU、内存限制避免GitLab吃光服务器资源(实测默认配置下单个Runner会占用1.5GB内存)
  • 快速回滚:通过镜像版本控制,出现问题时可立即回退到上个稳定版本
  • 扩展灵活:需要升级时只需替换镜像文件,无需重新配置环境变量

重要提示:生产环境务必配置数据卷挂载,否则容器重建时所有代码和配置都会丢失。我曾因此丢失过客户仓库数据,血的教训!

2. 部署前的关键准备工作

2.1 硬件资源规划建议

根据GitLab官方文档和实测数据,不同规模团队的建议配置:

团队规模CPU核心内存存储空间预期响应速度
5人以下2核4GB50GB<500ms
5-20人4核8GB100GB<300ms
20-50人8核16GB500GB<200ms

我的踩坑记录:内存不足会导致GitLab频繁502错误。曾用4GB内存服务器支撑15人团队,每天早会时必崩,后来发现是Sidekiq进程OOM(内存溢出)被杀。

2.2 网络与域名配置

假设我们使用gitlab.example.com作为访问域名,需要提前准备:

# /etc/hosts 测试配置 192.168.1.100 gitlab.example.com

如果使用HTTPS(强烈建议),需要准备:

  • 域名证书(Let's Encrypt免费证书就够用)
  • 证书私钥
  • 中间证书链

我曾因为没配置SSL导致Runner注册失败,错误信息是"x509: certificate signed by unknown authority",调试了整整一下午。

3. 使用Docker Compose编排GitLab服务

3.1 编写docker-compose.yml

这是经过生产验证的配置模板,包含性能调优参数:

version: '3.6' services: gitlab: image: gitlab/gitlab-ce:15.11.0-ce.0 container_name: gitlab hostname: 'gitlab.example.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.example.com' gitlab_rails['gitlab_shell_ssh_port'] = 2222 nginx['listen_port'] = 80 nginx['listen_https'] = false nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "https", "X-Forwarded-Ssl" => "on" } postgresql['shared_buffers'] = "256MB" # 根据内存调整 prometheus_monitoring['enable'] = false # 小规模部署可关闭 ports: - "80:80" - "443:443" - "2222:22" volumes: - gitlab_config:/etc/gitlab - gitlab_logs:/var/log/gitlab - gitlab_data:/var/opt/gitlab restart: always shm_size: '256m' networks: - gitlab_net volumes: gitlab_config: gitlab_logs: gitlab_data: networks: gitlab_net: driver: bridge

关键参数解析:

  • shm_size:解决Unicorn worker内存不足问题
  • postgresql['shared_buffers']:数据库性能调优
  • 2222:22:避免与宿主机SSH端口冲突
  • 三个数据卷分别存储配置、日志和应用数据

3.2 启动与初始化

执行部署命令:

docker-compose up -d

首次启动需要3-5分钟初始化,通过日志观察进度:

docker logs -f gitlab

当看到以下日志时表示启动完成:

gitlab Reconfigured!

4. GitLab Runner的容器化部署

4.1 Runner容器配置

创建runner-compose.yml:

version: '3.6' services: gitlab-runner: image: gitlab/gitlab-runner:alpine-v15.11.0 container_name: gitlab-runner volumes: - /var/run/docker.sock:/var/run/docker.sock - gitlab-runner-config:/etc/gitlab-runner restart: always networks: - gitlab_net volumes: gitlab-runner-config: networks: gitlab_net: external: true

4.2 Runner注册流程

  1. 获取注册Token:

    • 访问GitLab网页 -> Admin Area -> Overview -> Runners
    • 复制"Set up a shared Runner manually"下的token
  2. 执行交互式注册:

docker exec -it gitlab-runner gitlab-runner register

按提示输入:

Runtime: docker Executor: docker Default Image: alpine:latest
  1. 高级配置建议:
[[runners]] name = "docker-runner" url = "https://gitlab.example.com" token = "xxxxxxxx" executor = "docker" [runners.docker] tls_verify = false image = "alpine:latest" privileged = true disable_cache = false volumes = ["/cache", "/builds:/builds"] shm_size = "256m" [runners.cache] [runners.cache.s3] [runners.cache.gcs]

5. 生产环境调优指南

5.1 性能优化参数

在gitlab.rb中增加:

unicorn['worker_timeout'] = 60 unicorn['worker_processes'] = 3 # 建议每1GB内存分配1个worker sidekiq['concurrency'] = 10 postgresql['max_worker_processes'] = 8 nginx['worker_processes'] = 4

5.2 备份与恢复方案

每日备份脚本示例:

docker exec -t gitlab gitlab-backup create docker exec -t gitlab sh -c 'gitlab-ctl backup-etc'

恢复步骤:

docker cp gitlab-backup.tar gitlab:/var/opt/gitlab/backups/ docker exec -it gitlab gitlab-ctl stop unicorn docker exec -it gitlab gitlab-ctl stop sidekiq docker exec -it gitlab gitlab-rake gitlab:backup:restore

5.3 监控与日志收集

推荐配置:

docker run -d --name=grafana \ -v grafana-data:/var/lib/grafana \ --network=gitlab_net \ -p 3000:3000 \ grafana/grafana docker run -d --name=prometheus \ -v prometheus-data:/etc/prometheus \ --network=gitlab_net \ -p 9090:9090 \ prom/prometheus

6. 常见问题排雷手册

6.1 502错误排查流程

  1. 检查内存使用:
docker stats gitlab
  1. 查看OOM日志:
docker exec -it gitlab grep -i oom /var/log/syslog
  1. 临时解决方案:
docker exec -it gitlab gitlab-ctl restart unicorn

6.2 Runner任务卡死处理

典型表现:Pipeline一直显示"pending"

解决步骤:

  1. 检查Runner连接:
docker exec -it gitlab-runner gitlab-runner verify
  1. 清理僵尸进程:
docker exec -it gitlab-runner gitlab-runner stop docker exec -it gitlab-runner gitlab-runner start

6.3 容器时区同步问题

在docker-compose.yml中添加:

environment: TZ: Asia/Shanghai

验证方法:

docker exec -it gitlab date

7. 进阶:CI/CD流水线实战

7.1 基础流水线示例

.gitlab-ci.yml模板:

stages: - build - test - deploy build_job: stage: build script: - echo "Compiling the code..." - make artifacts: paths: - build/ test_job: stage: test script: - echo "Running tests" - ./test.sh deploy_job: stage: deploy only: - master script: - echo "Deploying to production" - scp build/* deploy@server:/app

7.2 多阶段Docker构建

优化后的Docker构建方案:

build_image: stage: build script: - docker build -t app:${CI_COMMIT_SHA} . - docker tag app:${CI_COMMIT_SHA} registry.example.com/app:latest - docker push registry.example.com/app:latest

配合Docker-in-Docker配置:

[runners.docker] privileged = true volumes = ["/cache", "/builds:/builds", "/var/run/docker.sock:/var/run/docker.sock"]

8. 安全加固措施清单

8.1 必做安全配置

  1. 修改默认root密码:
docker exec -it gitlab gitlab-rake "gitlab:password:reset[root]"
  1. 开启HTTPS强制跳转:
nginx['redirect_http_to_https'] = true
  1. 设置账户锁定策略:
gitlab_rails['max_login_attempts'] = 5 gitlab_rails['unlock_in'] = '10 minutes'

8.2 网络隔离方案

推荐网络架构:

networks: frontend: driver: bridge internal: false backend: driver: bridge internal: true

只暴露必要端口:

ports: - "443:443" - "2222:22"

9. 版本升级操作指南

9.1 小版本升级步骤

  1. 修改docker-compose.yml中的镜像版本号
  2. 执行滚动更新:
docker-compose pull docker-compose up -d docker image prune # 清理旧镜像

9.2 大版本迁移方案

  1. 创建完整备份
  2. 搭建新版本测试环境
  3. 使用GitLab官方迁移工具:
docker run --rm -v gitlab_data:/var/opt/gitlab \ gitlab/gitlab-ce:15.11.0-ce.0 \ gitlab-ctl upgrade

10. 成本优化技巧

10.1 资源限制配置

在docker-compose.yml中设置:

deploy: resources: limits: cpus: '2' memory: 4G reservations: memory: 2G

10.2 缓存策略优化

Runner配置示例:

[runners.cache] Type = "s3" Path = "gitlab-runner-cache" Shared = true [runners.cache.s3] ServerAddress = "s3.example.com" AccessKey = "AKIAxxxxxxxx" SecretKey = "xxxxxxxxxxxx" BucketName = "gitlab-cache" Insecure = false

11. 混合架构部署方案

11.1 多Runner协同工作

注册不同标签的Runner:

docker exec -it gitlab-runner gitlab-runner register \ --tag-list "docker,aws" \ --executor "docker+machine" \ --docker-image "alpine:latest"

在.gitlab-ci.yml中指定Runner:

build: tags: - docker deploy: tags: - aws

11.2 Kubernetes集成

GitLab Kubernetes Agent配置:

gitlab_kas: enabled: true listen_address: "0.0.0.0:8150"

Helm Chart部署示例:

helm upgrade --install gitlab gitlab/gitlab \ --set global.hosts.domain=example.com \ --set certmanager-issuer.email=admin@example.com

12. 终极排错工具箱

12.1 诊断命令合集

检查服务状态:

docker exec -it gitlab gitlab-ctl status

查看实时日志:

docker exec -it gitlab tail -f /var/log/gitlab/nginx/gitlab_access.log

数据库连接测试:

docker exec -it gitlab gitlab-rails dbconsole

12.2 紧急恢复流程

  1. 停止所有写操作
  2. 创建数据快照
  3. 回滚到上个版本:
docker-compose down docker-compose up -d gitlab=gitlab/gitlab-ce:15.10.0-ce.0
  1. 从备份恢复数据

13. 扩展:集成第三方服务

13.1 邮件服务配置

在gitlab.rb中添加:

gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.example.com" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "gitlab@example.com" gitlab_rails['smtp_password'] = "password" gitlab_rails['smtp_domain'] = "example.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['gitlab_email_from'] = "gitlab@example.com"

测试邮件发送:

docker exec -it gitlab gitlab-rails console Notify.test_email('test@example.com', 'Test', 'Body').deliver_now

13.2 LDAP集成方案

配置示例:

gitlab_rails['ldap_enabled'] = true gitlab_rails['ldap_servers'] = { 'main' => { 'label' => 'LDAP', 'host' => 'ldap.example.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'verify_certificates' => true, 'bind_dn' => 'CN=GitLab,OU=Service Accounts,DC=example,DC=com', 'password' => 'password', 'active_directory' => true, 'base' => 'OU=Users,DC=example,DC=com' } }

14. 监控与告警配置

14.1 Prometheus监控指标

关键监控项:

  • gitlab_unicorn_workers: 活跃Worker数量
  • gitlab_sidekiq_jobs_processed_total: 后台任务吞吐量
  • gitlab_transaction_seconds_bucket: API响应时间分布

告警规则示例:

groups: - name: gitlab rules: - alert: HighUnicornMemory expr: sum by(instance) (gitlab_unicorn_memory_bytes) / 1024 / 1024 > 2048 for: 5m labels: severity: warning annotations: summary: "High memory usage on {{ $labels.instance }}"

14.2 日志收集方案

Fluentd配置示例:

<source> @type tail path /var/log/gitlab/nginx/gitlab_access.log pos_file /var/log/fluentd/gitlab-access.log.pos tag gitlab.access format nginx </source> <match gitlab.*> @type elasticsearch host elasticsearch port 9200 logstash_format true </match>

15. 备份策略进阶

15.1 增量备份方案

使用btrfs文件系统实现快照:

docker exec -it gitlab sh -c 'btrfs subvolume snapshot /var/opt/gitlab /var/opt/gitlab_snap_$(date +%Y%m%d)'

15.2 异地备份脚本

#!/bin/bash # 本地备份 docker exec -t gitlab gitlab-backup create # 同步到S3 aws s3 sync /var/lib/docker/volumes/gitlab_data/_data/backups s3://gitlab-backups # 保留最近7天 find /var/lib/docker/volumes/gitlab_data/_data/backups -type f -mtime +7 -delete

16. 性能基准测试

16.1 压测方法

使用ab工具测试API:

ab -n 1000 -c 10 -H "PRIVATE-TOKEN: your_token" https://gitlab.example.com/api/v4/projects

16.2 优化前后对比

优化前:

  • 平均响应时间:1200ms
  • 最大并发连接:50

优化后(调整PostgreSQL缓存和Unicorn workers后):

  • 平均响应时间:350ms
  • 最大并发连接:200

17. 容器网络深度配置

17.1 自定义DNS设置

在docker-compose.yml中添加:

dns: - 8.8.8.8 - 114.114.114.114 dns_search: - example.com

17.2 网络隔离策略

创建独立网络:

docker network create --internal gitlab-internal

仅允许特定容器访问:

networks: gitlab-internal: internal: true labels: - "com.docker.network.bridge.enable_icc=false"

18. 存储驱动选型指南

18.1 性能对比测试

驱动类型随机读IOPS顺序写吞吐量适用场景
overlay28500220MB/s通用场景
btrfs9200240MB/s需要快照功能
zfs8800210MB/s大数据量存储

18.2 配置方法

修改/etc/docker/daemon.json:

{ "storage-driver": "btrfs", "storage-opts": [ "btrfs.min_space=1G" ] }

19. 高可用架构设计

19.1 多节点部署方案

version: '3.8' services: gitlab1: image: gitlab/gitlab-ce:15.11.0-ce.0 deploy: replicas: 2 networks: - gitlab_net gitlab2: image: gitlab/gitlab-ce:15.11.0-ce.0 deploy: replicas: 2 networks: - gitlab_net haproxy: image: haproxy:2.6 ports: - "80:80" - "443:443" depends_on: - gitlab1 - gitlab2

19.2 共享存储配置

使用NFS共享数据:

volumes: gitlab_data: driver_opts: type: "nfs" o: "addr=nas.example.com,rw,nolock,soft,rsize=8192,wsize=8192" device: ":/mnt/gitlab"

20. 终极配置检查清单

部署完成后必查项:

  1. [ ] 备份功能测试通过
  2. [ ] HTTPS访问无证书警告
  3. [ ] Runner成功注册并执行测试任务
  4. [ ] 管理员密码已修改
  5. [ ] 邮件服务测试发送成功
  6. [ ] 监控系统数据采集正常
  7. [ ] 资源使用率在安全阈值内
  8. [ ] 定时任务配置完成

最后建议:首次部署完成后,用docker system prune清理构建缓存,可节省20%-30%磁盘空间。定期执行gitlab-rake gitlab:cleanup:orphan_job_artifact_files清理构建产物,这是很多团队忽略的存储黑洞。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询