RockyLinux 8上Docker部署GitLab与数据备份方案

发布时间:2026/11/5 4:37:16
RockyLinux 8上Docker部署GitLab与数据备份方案

1. 项目概述

在RockyLinux 8系统上通过Docker部署GitLab并实现数据备份恢复,是当前企业级代码托管和CI/CD实践的典型方案。作为RHEL兼容发行版,RockyLinux 8提供了稳定的基础环境,而Docker容器化部署则大幅简化了GitLab的安装和维护流程。本文将详细记录从环境准备到日常运维的全套操作流程,特别针对数据安全这个企业最关心的核心需求,给出完整的备份恢复方案。

我曾在三个不同规模的企业环境中实施过这套方案,最大的实例管理着超过500个活跃代码仓库。相比传统安装方式,Docker部署的优势主要体现在三个方面:一是依赖隔离彻底,不会污染主机环境;二是版本升级可控,能精确回滚到任意版本;三是资源利用率高,单台服务器可承载更多用户。下面就从最基础的Docker环境配置开始,逐步拆解每个关键环节。

2. 环境准备与依赖安装

2.1 RockyLinux 8基础配置

首先确保系统为最新状态:

sudo dnf update -y && sudo reboot

安装必要工具集:

sudo dnf install -y curl vim wget git lsof

调整系统参数以适应容器运行:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p

注意:max_map_count参数对Elasticsearch等组件至关重要,过低会导致服务启动失败。生产环境建议设置为262144以上。

2.2 Docker引擎安装

添加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 mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } EOF

启动并设置开机自启:

sudo systemctl enable --now docker

验证安装:

sudo docker run hello-world

3. GitLab容器化部署

3.1 目录结构规划

建议采用以下目录结构,便于后续维护:

/opt/gitlab/ ├── config/ # 配置文件 ├── data/ # 应用数据 ├── logs/ # 日志文件 └── backup/ # 备份文件

创建目录并设置权限:

sudo mkdir -p /opt/gitlab/{config,data,logs,backup} sudo chmod -R 775 /opt/gitlab

3.2 容器启动命令

使用官方GitLab CE镜像:

sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /opt/gitlab/config:/etc/gitlab \ --volume /opt/gitlab/logs:/var/log/gitlab \ --volume /opt/gitlab/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ce:latest

关键参数说明:

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

首次启动约需5-10分钟完成初始化,可通过日志监控进度:

sudo docker logs -f gitlab

3.3 初始配置调整

修改配置文件:

sudo vim /opt/gitlab/config/gitlab.rb

关键配置项:

external_url 'https://gitlab.example.com' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 # 保留7天

应用配置:

sudo docker exec -it gitlab gitlab-ctl reconfigure

4. 备份恢复方案

4.1 手动备份实施

执行完整备份(包含数据库、仓库、附件等):

sudo docker exec -t gitlab gitlab-backup create

备份文件命名格式:

TIMESTAMP_gitlab_backup.tar

重要:备份文件默认存储在/var/opt/gitlab/backups目录(即宿主机的/opt/gitlab/data/backups)

4.2 自动备份配置

创建定时任务:

sudo crontab -e

添加每日凌晨2点执行:

0 2 * * * /usr/bin/docker exec -t gitlab gitlab-backup create CRON=1

验证cron服务状态:

sudo systemctl enable crond && sudo systemctl start crond

4.3 恢复操作流程

假设需要恢复的备份文件为:1651824000_gitlab_backup.tar

停止相关服务:

sudo docker exec -it gitlab gitlab-ctl stop unicorn sudo docker exec -it gitlab gitlab-ctl stop sidekiq

执行恢复(注意备份文件名不带_TIMESTAMP前缀):

sudo docker exec -it gitlab gitlab-backup restore BACKUP=1651824000

启动服务并检查:

sudo docker exec -it gitlab gitlab-ctl restart sudo docker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true

5. 运维监控与优化

5.1 健康检查方案

内置检查命令:

sudo docker exec -it gitlab gitlab-rake gitlab:check

监控关键指标:

  • 磁盘空间:df -h /opt/gitlab
  • 内存使用:docker stats gitlab
  • 服务状态:docker ps --filter "name=gitlab"

5.2 性能调优建议

调整工作线程数(根据CPU核心数):

unicorn['worker_processes'] = 4 sidekiq['concurrency'] = 10

数据库连接池优化:

postgresql['max_worker_processes'] = 8

调整后需重新加载配置:

sudo docker exec -it gitlab gitlab-ctl reconfigure

6. 故障排查记录

6.1 常见问题速查表

现象可能原因解决方案
502错误Unicorn崩溃查看/var/log/gitlab/unicorn/current
备份失败磁盘空间不足清理旧备份或扩展存储
SSH连接超时容器22端口未映射检查docker run的-p 22:22参数
内存溢出Sidekiq占用过高增加--shm-size参数值

6.2 日志分析技巧

关键日志路径:

  • GitLab主日志:/var/log/gitlab/gitlab-rails/production.log
  • PostgreSQL日志:/var/log/gitlab/postgresql/current
  • Nginx访问日志:/var/log/gitlab/nginx/gitlab_access.log

高效排查命令:

# 实时查看错误日志 sudo docker exec -it gitlab tail -f /var/log/gitlab/gitlab-rails/production.log | grep -i error # 统计HTTP状态码 sudo docker exec -it gitlab awk '{print $9}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq -c

7. 升级与迁移方案

7.1 版本升级步骤

  1. 停止当前容器:
sudo docker stop gitlab
  1. 拉取新版本镜像:
sudo docker pull gitlab/gitlab-ce:latest
  1. 重新创建容器(使用原有参数):
sudo docker run ... # 与初始安装相同的参数

重要:必须保持所有卷挂载参数与原来完全一致

7.2 服务器迁移流程

  1. 在新服务器重复安装步骤
  2. 复制整个/opt/gitlab目录到新主机
  3. 确保目录权限一致:
sudo chown -R 998:998 /opt/gitlab/data sudo chown -R 998:998 /opt/gitlab/config
  1. 使用相同参数启动容器

8. 安全加固建议

8.1 基础安全配置

修改SSH默认端口:

gitlab_rails['gitlab_shell_ssh_port'] = 2222

强制HTTPS:

external_url 'https://gitlab.example.com' nginx['redirect_http_to_https'] = true

密码复杂度策略:

gitlab_rails['password_compLEXity'] = 2 # 需要大小写+数字

8.2 防火墙规则示例

sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --permanent --add-port=2222/tcp # 修改后的SSH端口 sudo firewall-cmd --reload

9. 扩展功能集成

9.1 SMTP邮件配置

以腾讯企业邮箱为例:

gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "gitlab@yourdomain.com" gitlab_rails['smtp_password'] = "yourpassword" gitlab_rails['smtp_domain'] = "yourdomain.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true

测试邮件发送:

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

9.2 LDAP集成示例

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

10. 性能监控方案

10.1 Prometheus监控配置

GitLab内置Prometheus,启用配置:

prometheus['enable'] = true prometheus_monitor['enable'] = true node_exporter['enable'] = true redis_exporter['enable'] = true postgres_exporter['enable'] = true

访问监控面板:

http://gitlab.example.com/-/metrics

10.2 资源告警设置

示例:当内存使用超过80%时触发告警

gitlab_rails['monitoring_whitelist'] = ['127.0.0.1/8', '192.168.0.0/16'] alertmanager['flags'] = { 'cluster.advertise-address' => "0.0.0.0:9093", 'config.file' => "/var/opt/gitlab/alertmanager/alertmanager.yml" }

配置告警规则后,可以通过邮件或Webhook接收通知。