RockyLinux 8上Docker部署GitLab与备份恢复实践

RockyLinux 8上Docker部署GitLab与备份恢复实践
1. 项目概述在RockyLinux 8上使用Docker部署GitLab并实现数据备份恢复是当前企业级代码托管和CI/CD实践的典型解决方案。作为RHEL的替代品RockyLinux 8以其稳定性和长期支持特性成为生产环境的首选而Docker容器化部署则提供了环境隔离和快速部署的优势。我最近在客户现场实施了一套完整的GitLab容器化方案从最初的Docker环境配置到最终的定时备份策略建立整个过程涉及到不少值得分享的技术细节。特别是当客户要求在不中断服务的情况下完成数据迁移时备份恢复方案的设计就显得尤为重要。2. 环境准备与依赖安装2.1 RockyLinux 8基础配置在开始之前我们需要确保系统满足GitLab运行的基本要求。RockyLinux 8默认使用podman而不是docker所以需要先移除冲突的软件包sudo dnf remove -y podman buildah然后更新系统并安装必要的工具链sudo dnf update -y sudo dnf install -y yum-utils device-mapper-persistent-data lvm2注意RockyLinux 8默认的防火墙规则会阻止Docker和GitLab的端口访问建议提前配置好防火墙或暂时关闭它sudo systemctl stop firewalld sudo systemctl disable firewalld2.2 Docker引擎安装添加Docker官方仓库并安装最新稳定版sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io启动Docker服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker验证Docker安装是否成功sudo docker run hello-world3. GitLab容器化部署3.1 单容器部署方案对于中小型团队使用单个容器运行所有GitLab服务是最简单的方案。以下是启动命令sudo 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 \ gitlab/gitlab-ce:latest这个命令做了以下几件事映射了HTTP(80)、HTTPS(443)和SSH(22)端口设置了三个持久化卷分别用于配置、日志和数据存储使用最新版的GitLab社区版镜像设置容器自动重启3.2 配置调优首次启动后需要编辑配置文件以适应生产环境需求sudo docker exec -it gitlab vi /etc/gitlab/gitlab.rb关键配置项包括external_url http://gitlab.example.com gitlab_rails[time_zone] Asia/Shanghai gitlab_rails[gitlab_shell_ssh_port] 22 nginx[listen_port] 80 nginx[listen_https] false # 如果不用HTTPS则设为false修改配置后需要重新加载sudo docker exec -it gitlab gitlab-ctl reconfigure4. 备份策略实施4.1 手动备份操作GitLab提供了简单的备份命令可以创建包含所有数据的tar包sudo docker exec -it gitlab gitlab-backup create备份文件默认存储在/var/opt/gitlab/backups目录下文件名类似1638291600_2021_11_30_13.1.0_gitlab_backup.tar。重要提示备份不包括配置文件需要单独备份/etc/gitlab目录sudo tar -czvf gitlab_config_backup.tar.gz /srv/gitlab/config4.2 自动备份方案创建每日自动备份脚本/usr/local/bin/gitlab_backup.sh#!/bin/bash BACKUP_DIR/srv/gitlab/backups CONFIG_DIR/srv/gitlab/config LOG_FILE/var/log/gitlab_backup.log # 创建备份目录 mkdir -p $BACKUP_DIR # 执行GitLab备份 docker exec -t gitlab gitlab-backup create $LOG_FILE 21 # 备份配置文件 tar -czf $BACKUP_DIR/$(date %Y-%m-%d)_gitlab_config.tar.gz $CONFIG_DIR $LOG_FILE 21 # 删除7天前的备份 find $BACKUP_DIR -type f -name *.tar* -mtime 7 -delete $LOG_FILE 21然后添加cron任务sudo crontab -e添加以下内容实现每天凌晨2点自动备份0 2 * * * /usr/local/bin/gitlab_backup.sh5. 数据恢复操作5.1 准备恢复环境恢复前需要确保GitLab版本与备份时一致有足够的磁盘空间服务可以暂时停止停止相关服务sudo docker exec -it gitlab gitlab-ctl stop unicorn sudo docker exec -it gitlab gitlab-ctl stop sidekiq5.2 执行恢复操作将备份文件复制到容器内sudo docker cp 1638291600_2021_11_30_13.1.0_gitlab_backup.tar gitlab:/var/opt/gitlab/backups/执行恢复命令注意去掉时间戳和后缀sudo docker exec -it gitlab gitlab-backup restore BACKUP1638291600_2021_11_30_13.1.0恢复配置文件sudo tar -xzvf gitlab_config_backup.tar.gz -C /5.3 恢复后检查重新配置并启动服务sudo docker exec -it gitlab gitlab-ctl reconfigure sudo docker exec -it gitlab gitlab-ctl restart检查服务状态sudo docker exec -it gitlab gitlab-rake gitlab:check SANITIZEtrue6. 常见问题与解决方案6.1 容器启动失败排查如果GitLab容器无法启动首先检查日志sudo docker logs gitlab常见问题包括端口冲突确保80、443、22端口未被占用权限问题确保/srv/gitlab目录对docker用户可写磁盘空间不足df -h检查磁盘使用情况6.2 备份恢复失败处理恢复过程中可能遇到的错误版本不匹配GitLab version mismatch: Your current GitLab version (13.2.0) differs from the GitLab version in the backup!解决方案使用相同版本的GitLab镜像重新创建容器权限问题Errno::EACCES: Permission denied解决方案确保备份文件对git用户可读6.3 性能优化建议对于资源有限的服务器可以调整GitLab的资源使用# /etc/gitlab/gitlab.rb unicorn[worker_processes] 2 sidekiq[concurrency] 5 postgresql[shared_buffers] 256MB修改后重新配置sudo docker exec -it gitlab gitlab-ctl reconfigure7. 高可用方案扩展7.1 分离式部署对于生产环境建议将不同服务分开部署# PostgreSQL容器 docker run --name gitlab-postgresql -d \ --volume /srv/gitlab/postgresql:/var/lib/postgresql \ -e POSTGRES_PASSWORDyourpassword \ postgres:12 # Redis容器 docker run --name gitlab-redis -d \ --volume /srv/gitlab/redis:/var/lib/redis \ redis:latest # GitLab主容器 docker run --detach \ --link gitlab-postgresql:postgresql --link gitlab-redis:redis \ --publish 10022:22 --publish 10080:80 --publish 10443:443 \ --name gitlab \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest7.2 负载均衡配置在gitlab.rb中配置负载均衡nginx[enable] true nginx[listen_addresses] [0.0.0.0] nginx[listen_port] 80 nginx[listen_https] false gitlab_rails[trusted_proxies] [负载均衡IP]8. 监控与维护8.1 健康检查设置创建健康检查脚本/usr/local/bin/gitlab_healthcheck.sh#!/bin/bash RESPONSE$(curl -s -o /dev/null -w %{http_code} http://localhost/-/health) if [ $RESPONSE -ne 200 ]; then docker restart gitlab echo $(date) - GitLab restarted /var/log/gitlab_healthcheck.log fi添加到cron每5分钟检查一次*/5 * * * * /usr/local/bin/gitlab_healthcheck.sh8.2 日志管理配置日志轮转创建/etc/logrotate.d/gitlab/srv/gitlab/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty copytruncate }在RockyLinux 8上通过Docker部署GitLab并建立完善的备份恢复机制可以为企业提供稳定可靠的代码托管服务。实际部署中我发现定期测试恢复流程和监控磁盘空间是两个最容易被忽视但至关重要的环节。建议至少每季度进行一次完整的恢复演练确保在真正需要时备份确实可用。