使用 Docker 部署 GitLab 并持久化数据的实例步骤

 更新时间:2025年05月07日 09:40:49   作者:码上有潜  
本文将详细介绍如何使用 Docker 部署 GitLab,并将数据(如仓库、配置、日志等)持久化到主机磁盘,我们还将解决常见的端口冲突问题,并介绍如何从另一台 GitLab 恢复数据到新的 GitLab 实例,感兴趣的朋友一起看看吧

使用 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://git@192.168.1.1: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 root@192.168.1.1:/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

4.检查恢复是否成功:

  • 访问 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

6.将备份文件复制到 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 需要以 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

8.运行恢复命令

现在可以尝试运行恢复命令:

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 后缀。

9.如果报错

如果恢复过程中报错,可能是备份文件本身有问题。你可以手动解压备份文件,检查其内容:

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

如果文件缺失或损坏,说明备份文件可能有问题,需要重新获取备份。

10.修改 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 实例。这种方法不仅简单高效,还能确保数据安全。如果你在部署过程中遇到问题,欢迎在评论区留言讨论!

相关文章

  • Docker连接mongodb实现过程及代码案例

    Docker连接mongodb实现过程及代码案例

    这篇文章主要介绍了Docker连接mongodb实现过程及代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • docker+Nginx部署前端项目的详细过程记录

    docker+Nginx部署前端项目的详细过程记录

    docker的出现解决了我们很多问题,让我们避免陷入各种依赖安装的痛苦中,下面这篇文章主要给大家介绍了关于docker+Nginx部署前端项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Docker安装和基础用法 Docker入门教程第二篇

    Docker安装和基础用法 Docker入门教程第二篇

    这篇文章主要介绍了Docker安装和基础用法,Docker入门教程第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • docker部署fastapi的实现步骤

    docker部署fastapi的实现步骤

    本文主要介绍了docker部署fastapi的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • SQL Server 简介与 Docker Compose 部署SQL Server 容器

    SQL Server 简介与 Docker Compose 部署SQL Server 容器

    SQL Server 是一个功能强大的关系型数据库管理系统,适用于各种规模的应用程序和数据存储需求,在本文中,我将简要介绍 SQL Server 的基本概念,并详细阐述如何使用 Docker Compose 部署 SQL Server 容器,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Docker通过容器生成镜像提交DockerCommit详解

    Docker通过容器生成镜像提交DockerCommit详解

    这篇文章主要介绍了Docker通过容器生成镜像提交DockerCommit的详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-09-09
  • docker安装mysql、redis镜像方式

    docker安装mysql、redis镜像方式

    这篇文章主要介绍了docker安装mysql、redis镜像方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解docker搭建redis集群的环境搭建

    详解docker搭建redis集群的环境搭建

    本篇文章主要介绍了详解docker搭建redis集群的环境搭建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Docker如何挂载mysql

    Docker如何挂载mysql

    这篇文章主要介绍了Docker如何挂载mysql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker下安装Nginx的方法

    docker下安装Nginx的方法

    这篇文章主要介绍了docker下安装Nginx的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07

最新评论