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_url | GitLab 对外暴露的访问地址,必须包含端口号,否则内部路由会出问题 |
gitlab_shell_ssh_port | SSH 克隆使用的端口,和宿主机映射的 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.yml 的 GITLAB_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_url2. 启动后页面 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 22224. 配置修改后不生效
修改 docker-compose.yml 后需要重新配置并重启:
docker-compose down
docker-compose up -d
docker exec gitlab gitlab-ctl reconfigure总结
Docker 部署 GitLab 整体来说非常省心,几个关键点:
- 端口映射:容器内外端口保持一致,避免踩坑
- 内存:至少 4GB,不然会频繁 502
- 备份:一定要定期备份,crontab 配起来
- external_url:配准了,不然后续各种奇怪问题
对于小团队来说,自建 GitLab 是个不错的方案。代码在自己手里,心里踏实。