1. 环境准备与前置条件检查

在RockyLinux 8上通过Docker部署GitLab前,需要确保系统满足以下基础条件。我遇到过不少因环境配置不当导致的部署失败案例,这里特别强调几个关键点:

操作系统要求

  • 确认系统版本为RockyLinux 8.5或更高( cat /etc/redhat-release
  • 内核版本需≥4.18( uname -r
  • 建议最小4核CPU/8GB内存/100GB存储空间(实测2GB内存会导致频繁OOM)

Docker环境配置

# 官方推荐安装方式
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

# 验证安装
docker --version  # 要求≥20.10
docker-compose --version  # 要求≥1.29

存储规划建议

  • /var/lib/docker 建议单独挂载XFS格式分区(GitLab容器会产生大量小文件)
  • 提前创建持久化目录:
sudo mkdir -p /srv/gitlab/{config,logs,data}
sudo chmod -R 777 /srv/gitlab  # 解决权限问题

防火墙配置

sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=22/tcp  # 如果使用SSH协议
sudo firewall-cmd --reload

重要提示:RockyLinux 8默认的firewalld会阻止容器网络,若遇到网络连通性问题,可临时关闭测试: sudo systemctl stop firewalld

2. Docker化GitLab部署详解

2.1 镜像选择策略

官方提供多个GitLab Docker镜像变体:

  • gitlab/gitlab-ce:latest - 最新CE版(生产慎用)
  • gitlab/gitlab-ce:15.11.0-ce.0 - 特定版本(推荐)
  • gitlab/gitlab-ee:latest - 企业版

建议使用固定版本号而非latest标签,避免意外升级。我通常从GitLab官方镜像仓库获取版本列表:

curl -s "https://registry.hub.docker.com/v2/repositories/gitlab/gitlab-ce/tags/?page_size=50" | jq -r '.results[].name'

2.2 单容器部署方案

这是最简单的部署方式,适合中小团队:

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:15.11.0-ce.0

关键参数说明:

  • --shm-size :解决Sidekiq内存不足问题
  • 端口映射:Web(80/443)和SSH(22)必须暴露
  • 卷挂载:确保配置、日志、数据持久化

2.3 容器启动后初始化

首次启动需要约5-10分钟完成初始化,可通过以下命令监控进度:

docker logs -f gitlab  # 实时查看日志
docker exec -it gitlab gitlab-ctl status  # 检查服务状态

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

gitlab Reconfigured!
gitlab Running handlers complete

2.4 常见启动问题排查

问题1:502错误 通常是内存不足导致,解决方案:

  1. 增加容器内存限制: docker update --memory 8G gitlab
  2. 调整Unicorn workers数量:
docker exec -it gitlab editor /etc/gitlab/gitlab.rb
# 添加:unicorn['worker_processes'] = 2
docker exec -it gitlab gitlab-ctl reconfigure

问题2:SMTP配置错误 修改配置后必须重新加载:

docker exec -it gitlab gitlab-ctl stop
docker exec -it gitlab gitlab-ctl start postfix
docker exec -it gitlab gitlab-ctl restart

3. 备份策略设计与实施

3.1 备份类型对比

备份类型 命令 特点 恢复粒度
全量备份 gitlab-rake gitlab:backup:create 包含所有数据 完整实例
增量备份 第三方工具如BorgBackup 只备份变化部分 文件级别
配置备份 手动备份/etc/gitlab 仅配置文件 需手动恢复

3.2 自动化备份方案

创建每日凌晨2点执行的cron任务:

docker exec -it gitlab bash -c 'echo "0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1" >> /etc/crontab'

备份文件默认存储在/var/opt/gitlab/backups,建议增加远程存储:

# /etc/gitlab/gitlab.rb
gitlab_rails['backup_upload_connection'] = {
  'provider' => 'AWS',
  'region' => 'us-east-1',
  'aws_access_key_id' => 'AKIAxxx',
  'aws_secret_access_key' => 'secret'
}
gitlab_rails['backup_upload_remote_directory'] = 'gitlab-backups'

3.3 备份内容详解

GitLab备份包含以下关键部分:

  • 数据库(PostgreSQL)
  • 仓库数据(/var/opt/gitlab/git-data)
  • 附件(/var/opt/gitlab/gitlab-rails/uploads)
  • CI/CD流水线日志
  • 注册表数据(如果启用)

排除项(需单独备份):

  • SSL证书(/etc/gitlab/ssl)
  • SSH主机密钥(/etc/gitlab/ssh_host_*)
  • 配置文件(/etc/gitlab/gitlab.rb)

4. 恢复操作全流程指南

4.1 恢复前提条件

  1. 确保新环境版本与备份时一致:
docker run --rm gitlab/gitlab-ce:15.11.0-ce.0 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
  1. 准备同名备份文件(如 1652345678_2022_05_12_15.11.0_gitlab_backup.tar
  2. 停止相关服务:
docker exec -it gitlab gitlab-ctl stop unicorn
docker exec -it gitlab gitlab-ctl stop sidekiq

4.2 分步恢复过程

  1. 将备份文件放入容器:
docker cp 1652345678_gitlab_backup.tar gitlab:/var/opt/gitlab/backups/
  1. 执行恢复(注意去掉时间戳和后缀):
docker exec -it gitlab gitlab-rake gitlab:backup:restore BACKUP=1652345678
  1. 重建配置:
docker exec -it gitlab gitlab-ctl reconfigure
docker exec -it gitlab gitlab-ctl restart

4.3 恢复后验证

  1. 检查项目完整性:
docker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true
  1. 测试仓库推送:
git clone http://gitlab.example.com/root/test.git
cd test && touch testfile && git add . && git commit -m "test" && git push
  1. 验证CI/CD流水线是否能正常触发

5. 生产环境优化建议

5.1 性能调优参数

# /etc/gitlab/gitlab.rb
unicorn['worker_timeout'] = 60
sidekiq['concurrency'] = 10
postgresql['shared_buffers'] = "256MB"
nginx['worker_processes'] = 4
prometheus_monitoring['enable'] = false  # 监控数据量大的可关闭

5.2 高可用方案

对于关键业务系统,建议采用:

  • Docker Swarm/Kubernetes集群部署
  • 外部PostgreSQL数据库(RDS或自建集群)
  • 对象存储(如S3)替代本地存储
  • GitLab Runner独立部署

5.3 监控与维护

  1. 健康检查脚本:
#!/bin/bash
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost/-/health)
[ "$HTTP_CODE" == "200" ] || docker restart gitlab
  1. 日志轮转配置:
# /etc/gitlab/gitlab.rb
logging['logrotate']['rotate'] = 30
logging['logrotate']['dateext'] = true

6. 故障处理经验分享

6.1 典型问题案例

案例1:备份文件损坏 症状:恢复时报"Backup failed"错误 解决方案:

# 尝试解压验证
docker exec -it gitlab tar -tf /var/opt/gitlab/backups/1652345678_gitlab_backup.tar
# 使用--force选项强制恢复
docker exec -it gitlab gitlab-rake gitlab:backup:restore BACKUP=1652345678 force=yes

案例2:仓库无法访问 症状:HTTP 500错误,日志显示"Failed to open repository" 修复步骤:

docker exec -it gitlab gitlab-rake cache:clear
docker exec -it gitlab gitlab-rake gitlab:check
docker exec -it gitlab gitlab-rake gitlab:storage:cleanup

6.2 升级注意事项

  1. 必须按顺序升级(如14.x→15.0→15.11)
  2. 每次升级前执行完整备份
  3. 测试升级流程:
docker stop gitlab
docker run --rm -v /srv/gitlab/config:/etc/gitlab gitlab/gitlab-ce:15.11.0-ce.0 \
  bash -c "gitlab-ctl reconfigure && gitlab-ctl upgrade"

更多推荐