Docker 部署 GitLab 并开启 SSH 使用详解
在日常使用 GitLab 时,很多人习惯通过 SSH 协议 而不是 HTTPS 来拉取与推送代码。但是在使用 Docker 部署 GitLab 的过程中,经常遇到 SSH 端口未开放、只能本地访问、客户端无法连接 等问题。本文将从零开始,详细讲解如何在 Docker 中正确开启 GitLab 的 SSH 服务,并通过 SSH 克隆项目。
1. 环境准备
操作系统:Linux (如 CentOS / Ubuntu)
已安装 Docker & Docker Compose
GitLab Docker 镜像(例如
gitlab/gitlab-ce:latest
)
2. 基础部署
编写 docker-compose.yml
,启动 GitLab:
version: '3'
services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: 'gitlab.example.com'ports:- "8080:80" # Web 页面访问- "8443:443" # HTTPS- "2222:22" # SSH(宿主机 2222 -> 容器 22)volumes:- ./gitlab/config:/etc/gitlab- ./gitlab/logs:/var/log/gitlab- ./gitlab/data:/var/opt/gitlab
注意:
2222:22
表示将宿主机的 2222 端口 映射到容器的 22 端口。宿主机端口可以自定义,但容器内部 SSH 必须运行在 22 端口。
启动容器:
docker-compose up -d
3. 常见问题排查
3.1 发现 GitLab 占用了 127.0.0.1:2222
进入容器检查端口:
docker exec -it gitlab bash netstat -lnt
在 BusyBox 或精简 Linux 环境中,netstat
可能只有 -lnt
选项,没有 -p
。结果可能类似:
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
此时说明端口只监听在 127.0.0.1
,外部无法访问。
3.2 没看到 0.0.0.0:22
如果 netstat
中看不到 22 端口,说明容器内 sshd
没有启动,或者被 GitLab 内部的配置覆盖。
4. 修改 SSH 配置
4.1 修改 GitLab 配置文件
容器内的 GitLab SSH 配置在:
/etc/gitlab/gitlab.rb
找到以下配置(默认为注释状态):
# gitlab_rails['gitlab_shell_ssh_port'] = 22取消注释并修改为宿主机映射的端口(例如 2222):gitlab_rails['gitlab_shell_ssh_port'] = 2222
保存后,重新加载 GitLab 配置:
gitlab-ctl reconfigure
4.2 修改 SSH 服务配置
进入容器,编辑 sshd 配置文件:
/etc/ssh/sshd_config
确保包含以下内容:
Port 22
ListenAddress 0.0.0.0
PasswordAuthentication no
PubkeyAuthentication yes
注意:如果之前绑定成了
127.0.0.1
,请改为0.0.0.0
。
修改完成后重启 sshd:
gitlab-ctl restart sshd
5. 验证 SSH 服务
5.1 容器内部检查
netstat -lnt | grep 22
正确的结果应为:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
5.2 宿主机检查
telnet 127.0.0.1 2222
5.3 客户端访问
从客户端 PC 执行:
ssh -T -p 2222 git@gitlab.example.com
如果配置正确,应能看到 GitLab 欢迎提示:
Welcome to GitLab, @yourusername!
6. 使用 SSH 克隆项目
6.1 获取项目的 SSH 地址
在 GitLab Web 页面中:
打开你想要克隆的项目(例如
flow
)。点击 Clone → SSH。
会看到类似地址:
git@172.16.18.47:flow.git
注意:因为 GitLab SSH 端口修改为 2222,需要在 git clone 时指定端口。
6.2 方法 A:使用 ~/.ssh/config
配置端口
编辑本地 SSH 配置文件:
vi ~/.ssh/config
添加:
Host gitlab-local HostName 172.16.18.47 User git Port 2222
然后直接克隆:
git clone gitlab-local:flow.git
Git 会自动使用配置里的端口。
6.3 方法 B:临时指定端口
无需修改 ~/.ssh/config
,直接使用:
GIT_SSH_COMMAND="ssh -p 2222" git clone git@172.16.18.47:flow.git
6.4 注意事项
SSH Key 已配置
确保本地私钥对应 GitLab Web 的 SSH Key,否则会提示权限拒绝。端口映射
如果宿主机端口修改,需要更新~/.ssh/config
或GIT_SSH_COMMAND
。防火墙
确保宿主机允许外部访问 SSH 端口(例:2222)。
7. 总结
GitLab Docker 默认 SSH 可能只监听在容器内
127.0.0.1:2222
,外部无法访问。正确做法:
在
docker-compose.yml
中映射端口,例如2222:22
。在
gitlab.rb
配置gitlab_shell_ssh_port = 2222
。确保 sshd 配置
ListenAddress 0.0.0.0
,并重启服务。
SSH 克隆项目时可以通过
~/.ssh/config
或GIT_SSH_COMMAND
指定端口。
这样,你就可以在 Docker 中完整部署 GitLab,并使用 SSH 拉取和推送项目啦 🚀