← 返回

Ubuntu 使用 Docker 部署 GitLab(自定义端口 + 中文版)

前言

自建 GitLab 的理由其实很简单:代码不想放公有云,团队又不想花大价钱买私有化方案。Docker 一把梭,半小时就能跑起来一台属于自己的 GitLab 服务器。

本文记录了我在 Ubuntu 18.04 上用 Docker Compose 部署 GitLab 中文版的完整过程,包括自定义端口映射、初始化配置、备份策略,以及踩过的几个坑。

环境准备

安装 Docker

如果服务器上还没有 Docker,用官方脚本一键安装:

curl -fsSL https://get.docker.com | bash
sudo usermod -aG docker $USER

国内网络不好的话,可以配置镜像加速。编辑 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://mirrors.tuna.tsinghua.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

安装 Docker Compose

sudo apt install docker-compose -y

验证安装:

docker-compose --version

创建项目目录

mkdir -p /opt/gitlab/{config,data,logs}
cd /opt/gitlab

编写 docker-compose.yml

这是核心配置文件:

version: '3'

services:
  gitlab:
    image: fjcanyue/gitlab-ce-zh:latest
    container_name: gitlab
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # 外部访问地址(必须与实际访问地址一致)
        external_url 'http://192.168.1.100:9001'
        # SSH 端口配置
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        # 关闭内置 Nginx 的 HTTPS(自签证书场景可按需开启)
        nginx['redirect_http_to_https'] = false
        # Puma 配置(GitLab 13+ 默认 Puma)
        puma['worker_processes'] = 2
    ports:
      - "9001:9001"    # HTTP 访问端口
      - "2222:22"      # SSH 克隆端口
    volumes:
      - ./config:/etc/gitlab
      - ./data:/var/opt/gitlab
      - ./logs:/var/log/gitlab
    shm_size: '256m'

关键配置说明

配置项说明
external_urlGitLab 对外暴露的访问地址,必须包含端口号,否则内部路由会出问题
gitlab_shell_ssh_portSSH 克隆使用的端口,和宿主机映射的 2222 对应
ports: 9001:9001容器内外端口必须一致,不能写成 81:80 这种
shm_size建议至少 256m,不然数据库操作可能报错

端口映射的坑

这里有一个很重要的点:GitLab 的 external_url 端口必须和 ports 映射的容器端口一致

比如你不能这样写:

# ❌ 错误示例
ports:
  - "81:80"
environment:
  GITLAB_OMNIBUS_CONFIG: |
    external_url 'http://192.168.1.100:81'

GitLab 内部的 Nginx 监听的是容器内的端口(由 external_url 决定),如果 external_url 写的是 81,但容器内 Nginx 监听的还是 80,请求就会打不通。所以正确做法是让容器内外端口保持一致:

# ✅ 正确示例
ports:
  - "9001:9001"
environment:
  GITLAB_OMNIBUS_CONFIG: |
    external_url 'http://192.168.1.100:9001'

启动服务

cd /opt/gitlab
docker-compose up -d

首次启动会比较慢,GitLab 需要初始化数据库、生成配置文件,大约需要 5-10 分钟。可以通过日志观察进度:

docker logs -f gitlab

等到出现 gitlab Reconfigured! 字样,就说明启动成功了。

首次登录

浏览器访问 http://你的IP:9001,首次登录需要设置 root 密码。

初始密码在这个文件里:

sudo cat /opt/gitlab/config/initial_root_password

root 用户名 + 这个密码登录,登录后建议马上修改密码。

注意initial_root_password 文件会在 24 小时后自动删除,拿到密码后记得保存。

备份策略

GitLab 自带备份工具,一行命令搞定:

docker exec gitlab gitlab-backup create

备份文件默认存放在 /var/opt/gitlab/backups/,也就是宿主机的 /opt/gitlab/data/backups/

自动备份(Cron)

编辑 crontab:

crontab -e

添加每天凌晨 3 点执行备份:

0 3 * * * docker exec gitlab gitlab-backup create CRON=1 >> /var/log/gitlab-backup.log 2>&1

备份保留策略

docker-compose.ymlGITLAB_OMNIBUS_CONFIG 中加上:

gitlab_rails['backup_keep_time'] = 604800  # 保留 7 天(秒)

恢复备份

# 把备份文件放到备份目录
docker exec gitlab gitlab-backup restore BACKUP=备份文件时间戳
docker restart gitlab

常见问题排查

1. 无法通过 HTTP 克隆代码

症状:SSH 克隆正常,但 HTTP 克隆报错 Could not resolve host 或连接超时。

原因external_url 配置的地址和实际访问地址不一致,或者防火墙没有放行对应端口。

解决

# 检查防火墙
sudo ufw allow 9001/tcp
sudo ufw allow 2222/tcp

# 检查 GitLab 配置
docker exec gitlab cat /etc/gitlab/gitlab.rb | grep external_url

2. 启动后页面 502

原因:GitLab 还没完全初始化完成,或者内存不足。

解决:耐心等几分钟。如果持续 502,检查服务器内存,GitLab 更低建议 4GB 内存。可以用 htop 看看内存占用。

3. SSH 克隆报端口错误

症状git clone git@192.168.1.100:namespace/project.git 报错。

原因:默认 SSH 走 22 端口,但你映射的是 2222。

解决:克隆时指定端口:

git clone ssh://git@192.168.1.100:2222/namespace/project.git

或者在 ~/.ssh/config 中配置:

Host 192.168.1.100
    Port 2222

4. 配置修改后不生效

修改 docker-compose.yml 后需要重新配置并重启:

docker-compose down
docker-compose up -d
docker exec gitlab gitlab-ctl reconfigure

总结

Docker 部署 GitLab 整体来说非常省心,几个关键点:

  • 端口映射:容器内外端口保持一致,避免踩坑
  • 内存:至少 4GB,不然会频繁 502
  • 备份:一定要定期备份,crontab 配起来
  • external_url:配准了,不然后续各种奇怪问题

对于小团队来说,自建 GitLab 是个不错的方案。代码在自己手里,心里踏实。