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:

bash 复制代码
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: always
    hostname: '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 端口

启动容器:

bash 复制代码
docker-compose up -d

3. 常见问题排查

3.1 发现 GitLab 占用了 127.0.0.1:2222

进入容器检查端口:

bash 复制代码
docker exec -it gitlab bash netstat -lnt

在 BusyBox 或精简 Linux 环境中,netstat 可能只有 -lnt 选项,没有 -p。结果可能类似:

bash 复制代码
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 配置在:

bash 复制代码
/etc/gitlab/gitlab.rb

找到以下配置(默认为注释状态):

bash 复制代码
# gitlab_rails['gitlab_shell_ssh_port'] = 22

取消注释并修改为宿主机映射的端口(例如 2222):


gitlab_rails['gitlab_shell_ssh_port'] = 2222

保存后,重新加载 GitLab 配置:

bash 复制代码
gitlab-ctl reconfigure

4.2 修改 SSH 服务配置

进入容器,编辑 sshd 配置文件:

复制代码
/etc/ssh/sshd_config 

确保包含以下内容:

bash 复制代码
Port 22
ListenAddress 0.0.0.0
PasswordAuthentication no
PubkeyAuthentication yes

注意:如果之前绑定成了 127.0.0.1,请改为 0.0.0.0

修改完成后重启 sshd:

bash 复制代码
gitlab-ctl restart sshd

5. 验证 SSH 服务

5.1 容器内部检查

bash 复制代码
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 页面中:

  1. 打开你想要克隆的项目(例如 flow)。

  2. 点击 CloneSSH

  3. 会看到类似地址:

    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 注意事项

  1. SSH Key 已配置

    确保本地私钥对应 GitLab Web 的 SSH Key,否则会提示权限拒绝。

  2. 端口映射

    如果宿主机端口修改,需要更新 ~/.ssh/configGIT_SSH_COMMAND

  3. 防火墙

    确保宿主机允许外部访问 SSH 端口(例:2222)。


7. 总结

  • GitLab Docker 默认 SSH 可能只监听在容器内 127.0.0.1:2222,外部无法访问。

  • 正确做法:

    1. docker-compose.yml 中映射端口,例如 2222:22

    2. gitlab.rb 配置 gitlab_shell_ssh_port = 2222

    3. 确保 sshd 配置 ListenAddress 0.0.0.0,并重启服务。

  • SSH 克隆项目时可以通过 ~/.ssh/configGIT_SSH_COMMAND 指定端口。

这样,你就可以在 Docker 中完整部署 GitLab,并使用 SSH 拉取和推送项目啦 🚀