soarli

生产环境实战:基于 Docker 部署与平滑升级企业级 GitLab
在生产环境中部署代码托管平台,稳定、可控和易于维护是核心诉求。相比于传统的包管理器安装,基于 Docker 部署 ...
扫描右侧二维码阅读全文
22
2026/04

生产环境实战:基于 Docker 部署与平滑升级企业级 GitLab

在生产环境中部署代码托管平台,稳定、可控和易于维护是核心诉求。相比于传统的包管理器安装,基于 Docker 部署 GitLab 能够实现极佳的环境隔离与数据迁移便利性。本文将完整记录如何在服务器上基于 Docker 部署 GitLab 企业版,配置公网 HTTPS 访问,并实现版本的安全平滑升级。

一、 生产环境的避坑指南与版本策略

在动手之前,有几个生产环境的“铁律”需要遵守:

  1. 坚决弃用 latest 标签latest 会在每次容器重建时拉取最新版,极易导致跨版本带来的数据库不兼容或系统崩溃。务必锁定具体的补丁版本(如 18.10.3-ee.0)。
  2. 首选企业版 (EE) 镜像:拉取 gitlab-ee 镜像而非社区版 gitlab-ce。在不输入许可证的情况下,EE 版本完全等同于免费社区版功能;但未来若业务扩张需要高级功能,EE 版本只需输入激活码即可原地升级,免去了从 CE 迁移到 EE 的高风险停机折腾。
  3. 硬件资源底线:GitLab 是一个包含 PostgreSQL、Redis、Sidekiq 等众多组件的庞然大物。请确保宿主机至少拥有 4核 CPU 与 8GB 内存

二、 准备持久化存储目录

为了保障数据安全并在日后能够随意销毁和重建容器,我们必须将 GitLab 的核心数据挂载到宿主机(例如单独的机械硬盘或数据盘 /mnt/gitlabdata)。

无需手动创建子文件夹,Docker 运行时会自动生成。我们要映射的三个核心目录是:

  • /var/opt/gitlab:存储仓库数据和数据库
  • /etc/gitlab:存储核心配置文件
  • /var/log/gitlab:存储系统日志

三、 配置 SSL 证书并启动容器

我们这里的架构方案是由 GitLab 容器原生处理 HTTPS。这种方案非常干净,不需要在宿主机额外部署 Nginx。

1. 放置 SSL 证书

GitLab 内部拥有严格的证书命名规范。我们需要提前在配置目录中创建 ssl 文件夹,并将你的域名(假设为 git.weforn.cn)对应的证书放进去,并严格按域名命名:

sudo mkdir -p /mnt/gitlabdata/config/ssl
# 将公钥和私钥按如下格式放入该目录:
# 公钥:/mnt/gitlabdata/config/ssl/git.weforn.cn.crt
# 私钥:/mnt/gitlabdata/config/ssl/git.weforn.cn.key

2. 启动 GitLab 容器

执行以下单行命令,将宿主机的标准 Web 端口(80/443)以及自定义的 SSH 端口(222)映射到容器内部:

sudo docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /mnt/gitlabdata/config:/etc/gitlab -v /mnt/gitlabdata/logs:/var/log/gitlab -v /mnt/gitlabdata/data:/var/opt/gitlab gitlab/gitlab-ee:18.10.3-ee.0

四、 核心配置:修改 gitlab.rb

容器启动后,我们需要修改配置文件,让 GitLab 知道自己被映射到了哪个公网域名,从而正确生成各类项目克隆链接。

sudo vim /mnt/gitlabdata/config/gitlab.rb

在文件中修改或增加以下配置:

# 1. 设置公网访问的外部链接(使用 https,自动关联我们在 ssl 文件夹下放入的证书)
external_url 'https://git.weforn.cn'

# 2. 设置 SSH 协议所使用的域名和映射后的 222 端口
gitlab_rails['gitlab_ssh_host'] = 'git.weforn.cn'
gitlab_rails['gitlab_shell_ssh_port'] = 222

保存退出后,重启容器使配置生效:

sudo docker restart gitlab

等待初始化:首次启动或重启时,GitLab 需要较长时间进行组件加载。如果网页提示 502 Bad Gateway,属于正常现象,请耐心等待 2-5 分钟再刷新。

初始密码获取

如果需要查看初始的管理员 root 密码,可以通过以下命令获取(该文件在启动 24 小时后会自动销毁,请及时登录并修改密码):

sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

五、 如何进行平滑的版本升级?

官方经常会发布补丁版本(如从 18.10.3 升级到 18.10.4)以修复安全漏洞。得益于 Docker 的数据分离机制,升级过程只需几分钟且非常安全。

Step 1:执行全量备份(关键保底操作)

sudo docker exec -t gitlab gitlab-backup create

(注意:此命令备份了核心数据,但 /mnt/gitlabdata/config 目录下的 gitlab.rb 与证书建议手动复制一份留存。)

Step 2:拉取新版本镜像
提前拉取以缩短停机时间:

sudo docker pull gitlab/gitlab-ee:18.10.4-ee.0

Step 3:停止并销毁旧容器
不用担心,数据都在你的 /mnt/gitlabdata 硬盘里:

sudo docker stop gitlab
sudo docker rm gitlab

Step 4:使用新镜像重新启动
使用完全相同的挂载和端口映射参数,仅仅将末尾的版本号改为新的:

sudo docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /mnt/gitlabdata/config:/etc/gitlab -v /mnt/gitlabdata/logs:/var/log/gitlab -v /mnt/gitlabdata/data:/var/opt/gitlab gitlab/gitlab-ee:18.10.4-ee.0

Step 5:查看升级日志
启动后,GitLab 内部会自动处理新老版本的数据库差异迁移。可以实时监控日志:

sudo docker logs -f gitlab

当日志流趋于平稳,且可以通过浏览器正常访问 https://git.weforn.cn 时,恭喜你,系统已经成功完成了无缝升级!

最后修改:2026 年 04 月 23 日 12 : 00 AM

发表评论