使用 Docker 部署 GitLab 并持久化数据
本文将详细介绍如何使用 Docker 部署 GitLab,并将数据(如仓库、配置、日志等)持久化到主机磁盘。我们还将解决常见的端口冲突问题,并介绍如何从另一台 GitLab 恢复数据到新的 GitLab 实例。
环境准备
- 一台 Linux 服务器(本文以 CentOS 为例)。
- 已安装 Docker 和 Docker Compose。
- 确保服务器有足够资源(建议至少 4GB 内存和 2 核 CPU)。
步骤 1:创建目录
在主机上创建用于存储 GitLab 数据的目录:
mkdir -p /home/middleware/gitlab/{
config,data,logs}
config
:用于存储 GitLab 配置文件。data
:用于存储 GitLab 仓库数据。logs
:用于存储 GitLab 日志。
步骤 2:运行 GitLab 容器
使用以下命令启动 GitLab 容器,并将数据目录映射到主机:
docker run -d \
--hostname 192.168.1.1 \ # 替换为你的域名或 IP
--publish 443:443 --publish 80:80 --publish 2222:22 \ # 映射 HTTP、HTTPS 和 SSH 端口
--name gitlab \
--restart always \
--volume /home/middleware/gitlab/config:/etc/gitlab \ # 映射配置文件
--volume /home/middleware/gitlab/logs:/var/log/gitlab \ # 映射日志
--volume /home/middleware/gitlab/data:/var/opt/gitlab \ # 映射数据
gitlab/gitlab-ce:latest
参数说明:
--hostname
:设置 GitLab 的域名或 IP 地址。--publish
:映射端口:80
:HTTP 端口。443
:HTTPS 端口。2222
:SSH 端口(避免与主机 SSH 端口冲突)。
--volume
:将主机目录映射到容器内目录,确保数据持久化。--restart always
:设置容器随 Docker 自动启动。
步骤 3:修改 GitLab 配置
GitLab 容器启动后,会自动生成配置文件。我们需要修改配置以使用新的 SSH 端口。
-
编辑配置文件:
vi /home/middleware/gitlab/config/gitlab.rb
-
找到以下行并修改(如果不存在,可以手动添加):
gitlab_rails['gitlab_shell_ssh_port'] = 2222
-
保存并退出。
-
重新配置 GitLab 以使更改生效:
docker exec -it gitlab gitlab-ctl reconfigure
-
重启 GitLab 容器:
docker restart gitlab
步骤 4:访问 GitLab
- 等待 GitLab 初始化完成(可能需要几分钟)。
- 打开浏览器,访问
http://192.168.1.1
。 - 默认用户名:
root
,初始密码可以通过以下命令获取:docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
步骤 5:验证 GitLab SSH 访问
如果 GitLab 的 SSH 端口已修改为 2222
,克隆 Git 仓库时需要指定端口。例如:
git clone ssh://[email protected]:2222/username/repo.git
步骤 6:从另一台 GitLab 恢复数据
如果你有另一台 GitLab 的备份数据,可以将其恢复到新的 GitLab 实例中。
1. 备份旧 GitLab 数据
在旧 GitLab 服务器上运行以下命令创建备份:(如果没有旧数据恢复跳过当前步骤)
docker exec -it <旧GitLab容器名> gitlab-backup create
备份成功
备份文件会存储在旧 GitLab 容器的 /var/opt/gitlab/backups
目录中(如果你做了映射管理则备份文件在/home/middleware/gitlab/backups/ 文件夹,复制出去即可不用使用命令)。将其复制到本地:
docker cp 指令的作用是 将 Docker 容器内部的文件复制到宿主机的指定目录
docker cp <旧GitLab容器名>:/var/opt/gitlab/backups/<备份文件名>.tar /home/middleware/gitlab/backups/
2. 将备份文件复制到新 GitLab
将备份文件从旧服务器复制到新服务器的 /home/middleware/gitlab/data/backups
目录:
scp /home/middleware/gitlab/backups/<备份文件名>.tar [email protected]:/home/middleware/gitlab/data/backups/
3. 恢复备份
在新 GitLab 服务器上运行以下命令恢复备份:
-
停止 GitLab 服务:
docker exec -it gitlab gitlab-ctl stop
-
恢复备份:
docker exec -it gitlab gitlab-backup restore BACKUP=<备份文件名>
-
重新启动 GitLab 服务:
docker exec -it gitlab gitlab-ctl start
-
检查恢复是否成功:
- 访问 GitLab,确认项目和用户数据已恢复。
- 运行以下命令检查日志:
docker logs -f gitlab
手动恢复另一台备份gitlab数据,先下载到本地电脑,再复制到目标服务器
我的目标服务器备份文件夹位于/home/middleware/gitlab/data/backups
,那么我
手动上传已下载的备份文件到该目录再执行还原备份操作:5.确认备份文件是否存在
- 首先,确保备份文件1741245298_2025_03_06_14.6.1_gitlab_backup.tar
确实存在于/home/middleware/gitlab/data/backups
目录中。
- 你可以通过以下命令检查:
bash ls -l /home/middleware/gitlab/data/backups/1741245298_2025_03_06_14.6.1_gitlab_backup.tar
-
将备份文件复制到 GitLab 容器的默认备份目录
- GitLab 容器默认会从
/var/opt/gitlab/backups
目录读取备份文件。你需要将备份文件复制到容器内的这个目录。 - 使用
docker cp
命令将备份文件复制到容器中:docker cp /home/middleware/gitlab/data/backups/1741245298_2025_03_06_14.6.1_gitlab_backup.tar gitlab:/var/opt/gitlab/backups/
- 确认文件已成功复制:
docker exec -it gitlab ls -l /var/opt/gitlab/backups/
- GitLab 容器默认会从
-
设置正确的文件权限
- 确保备份文件在容器内的权限正确,GitLab 需要以
git
用户的身份访问该文件。 - 运行以下命令修改文件权限:
docker exec -it gitlab chown git:git /var/opt/gitlab/backups/1741245298_2025_03_06_14.6.1_gitlab_backup.tar docker exec -it gitlab chmod 600 /var/opt/gitlab/backups/1741245298_2025_03_06_14.6.1_gitlab_backup.tar
- 确保备份文件在容器内的权限正确,GitLab 需要以
-
运行恢复命令
- 现在可以尝试运行恢复命令:
docker exec -it gitlab gitlab-backup restore BACKUP=1741245298_2025_03_06_14.6.1
- 注意:
BACKUP=
参数只需要指定备份文件的基本名称(即1741245298_2025_03_06_14.6.1
),不需要包含_gitlab_backup.tar
后缀。
- 现在可以尝试运行恢复命令:
-
如果报错
- 如果恢复过程中报错,可能是备份文件本身有问题。你可以手动解压备份文件,检查其内容:
docker exec -it gitlab mkdir -p /tmp/gitlab_backup docker exec -it gitlab tar -xf /var/opt/gitlab/backups/1741245298_2025_03_06_14.6.1_gitlab_backup.tar -C /tmp/gitlab_backup docker exec -it gitlab ls -l /tmp/gitlab_backup
- 检查是否存在
backup_information.yml
文件:docker exec -it gitlab cat /tmp/gitlab_backup/backup_information.yml
- 如果文件缺失或损坏,说明备份文件可能有问题,需要重新获取备份。
- 如果恢复过程中报错,可能是备份文件本身有问题。你可以手动解压备份文件,检查其内容:
-
修改 GitLab 备份目录(可选)
- 如果你希望 GitLab 直接从/home/middleware/gitlab/data/backups
目录读取备份文件,可以通过挂载卷的方式实现。
- 在启动 GitLab 容器时,将主机目录挂载到容器的/var/opt/gitlab/backups
目录:docker run -d \ --name gitlab \ -v /home/middleware/gitlab/data/backups:/var/opt/gitlab/backups \ -v /home/middleware/gitlab/config:/etc/gitlab \ -v /home/middleware/gitlab/logs:/var/log/gitlab \ -v /home/middleware/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
- 这样,GitLab 会直接从 `/home/middleware/gitlab/data/backups` 目录读取备份文件。
总结
- 将备份文件复制到 GitLab 容器的默认备份目录
/var/opt/gitlab/backups/
。 - 确保文件权限正确。
- 运行恢复命令。
- 如果问题仍然存在,检查备份文件是否完整。
步骤 7:备份与恢复
备份
GitLab 提供了备份命令,可以备份所有数据(包括仓库、数据库等):
docker exec -it gitlab gitlab-backup create
备份文件会存储在 /home/middleware/gitlab/data/backups
目录中。
恢复
如果需要恢复备份,可以运行以下命令:
docker exec -it gitlab gitlab-backup restore BACKUP=<备份文件名>
步骤 8:升级 GitLab
如果需要升级 GitLab 版本,可以按照以下步骤操作:
- 停止并删除当前容器:
docker stop gitlab docker rm gitlab
- 拉取最新版本的 GitLab 镜像:
docker pull gitlab/gitlab-ce:latest
- 重新运行容器(使用相同的卷映射):
docker run -d \ --hostname 192.168.1.1 \ --publish 443:443 --publish 80:80 --publish 2222:22 \ --name gitlab \ --restart always \ --volume /home/middleware/gitlab/config:/etc/gitlab \ --volume /home/middleware/gitlab/logs:/var/log/gitlab \ --volume /home/middleware/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
常见问题
1. 端口冲突
如果主机的 22
端口已被占用,可以将 GitLab 的 SSH 端口映射到其他端口(如 2222
),并修改 gitlab.rb
配置文件。
2. 配置文件未生成
如果 /home/middleware/gitlab/config/gitlab.rb
文件未生成,可能是容器初始化失败。可以尝试手动生成配置文件:
docker exec -it gitlab gitlab-ctl reconfigure
总结
通过以上步骤,你可以成功使用 Docker 部署 GitLab,并将数据持久化到主机磁盘。同时,我们还介绍了如何从另一台 GitLab 恢复数据到新的 GitLab 实例。这种方法不仅简单高效,还能确保数据安全。如果你在部署过程中遇到问题,欢迎在评论区留言讨论!