当前位置: 首页 > news >正文

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 页面中:

  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 拉取和推送项目啦 🚀

http://www.dtcms.com/a/349515.html

相关文章:

  • 【Java后端】Java 多线程:从原理到实战,再到高频面试题
  • Claude Code 使用及配置智能体
  • 【科研绘图系列】R语言绘制代谢物与临床表型相关性的森林图
  • 从零到一:现代化充电桩App的React前端参考
  • 将FGUI的Shader全部预热后,WebGL平台没有加载成功
  • 基于MalConv的恶意软件检测系统设计与实现
  • 大模型 transformer 步骤
  • 《拉康精神分析学中的欲望辩证法:能指的拓扑学与主体的解构性重构》
  • 计算机大数据技术不会?医院体检数据可视化分析系统Django+Vue全栈方案
  • 不止效率工具:AI 在文化创作中如何重构 “灵感逻辑”?
  • 【DFS 或 BFS 或拓扑排序 - LeetCode】329. 矩阵中的最长递增路径
  • 【图像算法 - 23】工业应用:基于深度学习YOLO12与OpenCV的仪器仪表智能识别系统
  • 基于视觉的果园无人机导航:一种基于干预模仿学习与VAE控制器的真实世界验证
  • 机器人中的李代数是什么
  • 抖音多账号运营新范式:巨推AI如何解锁流量矩阵的商业密码
  • 量子计算驱动的Python医疗诊断编程前沿展望(下)
  • 数据结构:单向链表的逆置;双向循环链表;栈,输出栈,销毁栈;顺序表和链表的区别和优缺点;0825
  • 平安产险青海分公司启动2025年“乡风文明100行动” 首站落地海东市乐都区土官沟村
  • 【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍
  • Redis缓存雪崩缓存击穿缓存穿透的处理方式
  • [React]Antd Upload组件上传多个文件
  • 阿里云安装postgre数据库
  • Vim 的 :term命令:终端集成的终极指南
  • 中介者模式及优化
  • Flink 状态 RocksDBListState(写入时的Merge优化)
  • 元宇宙与个人生活:重构日常体验的数字新维度
  • 技术攻坚与安全兜底——消防智能仓储立库管理系统的国产化硬核实力
  • ADB 调试工具的学习[特殊字符]
  • 性能优化:首屏加载速度的优化
  • Seaborn数据可视化实战:Seaborn高级使用与性能优化教程