Docker启动gitlab后22端口被占用如何解决

前言

这两天一直在研究Docker启动gitlab的问题,邮件问题暂时告一段落,当真正开始使用gitlab克隆的时候发现,之前22端口被占用无法启动,我就用2022端口做了一个映射,但是在gitab界面上提供的克隆地址类似这样 git@gitlab.gameup.com:games/xxx.git,丝毫没有端口 2022 的影子,执行 git clone git@gitlab.gameup.com:games/xxx.git 果然不可下载,所以搜索了一圈解决方案总结在此,方便日后查找。

Docker启动参数

docker run --detach \
  --hostname gitlab.gameup.com \
  --publish 443:443 --publish 80:80 --publish 2022:22 \
  --name gitlab \
  --restart always \
  --volume /export/docker/gitlab/config:/etc/gitlab \
  --volume /export/docker/gitlab/logs:/var/log/gitlab \
  --volume /export/docker/gitlab/data:/var/opt/gitlab \
  registry.cn-hangzhou.aliyuncs.com/z5z/gitlab-ce:latest

这个在之前的文章中提到过,因为 80 和 443端口正常可用,所有采用HTTP方式的下载 git clone http://gitlab.gameup.com/games/xxx.git 是正常的,而 SSH下载的这种方式,因为修改了默认端口,导致提供的链接无法下载,即使我像这样 git clone git@gitlab.gameup.com:2022/games/xxx.git 加上了端口也无法正常克隆。

用一种比较笨的方法就是,关闭SSH服务或者将宿主机的SSH服务改个端口,但这是一台远程服务器,一般都通过SSH协议访问,关闭不太现实,修改端口的话倒是可行,可是之前这台机器上运行着多个任务,这意味着很多服务脚本都得修改,所以也不是很好的办法,不能因为加了个新服务就把原来的老脚本统统改一遍吧,尝试多次终于找到一个可以接收的方法。

解决方案

  1. 进入gitlab容器 docker exec -it gitlab

  2. 修改配置文件 /etc/gitlab/gitlab.rb 中的内容

    gitlab_rails['gitlab_shell_ssh_port'] = 2022
    

    注意这个设置只是修改了 GitLab 的显示信息,不会更改 GitLab 容器内的 SSH 服务端口

  3. 执行 gitlab-ctl reconfigure 即可

    修改执行之后,再次查看gitlab下载地址发现改成了 ssh://git@gitlab.gameup.com:2022/games/xxx.git,不仅加了端口号,还在前面加上了 ssh://,怪不得我自己加端口号不能能用呢,关于这一点我也查到了相关解释:

GitLab 提供的 SSH 克隆地址(如 git@gitlab.gameup.com:2022/games/xxx.git)是一种简化格式,它没有指定协议前缀 ssh:// 和端口号。这是因为默认情况下,Git 使用 SSH 协议连接,并默认通过端口 22 来克隆和操作仓库。因此,这种简化格式省略了 ssh:// 前缀和端口号

对于标准端口(22),简化格式的地址是有效的,因为 Git 客户端会默认使用 SSH 协议并连接到 22 端口,但是,当你的 SSH 端口不同于 22(如使用 2022 时),Git 默认的简化格式就不适用了,需要显式指定端口号或配置 SSH,也就是写成 ssh://git@gitlab.gameup.com:2022/games/xxx.git 的形式

总结

  • 使用docker启动gitlab遭遇22端口占用时可以选择其他端口映射 --publish 2022:22
  • 修改映射端口后为了让下载地址显示正确,需要修改gitlab配置文件 gitlab_rails['gitlab_shell_ssh_port'] = 2022
  • git@gitlab.gameup.com:games/xxx.git 是一种ssh协议的简化形式,完整的地址应该为 ssh://git@gitlab.gameup.com:22/games/xxx.git

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

不要再抑郁下去了孩子,你要像一个,神经病一样活泼开朗,不要太在乎别人的目光,因为没人会注意你。

### 解决 Docker 容器运行时端口冲突的方法 当多个应用程序尝试绑定相同的主机端口时会发生端口冲突。Docker 提供了几种机制来处理这种情况。 #### 方法一:使用不同宿主端口映射同一容器内部端口 可以通过指定不同的宿主端口来避免冲突。例如,在一台机器上同时运行两个需要访问相同内部端口的服务,可以这样做: ```bash docker run -d -p 8080:8080 container1 docker run -d -p 9090:8080 container2 ``` 这里 `-p` 参数指定了外部端口到内部端口的映射关系,从而解决了潜在的端口竞争[^1]。 #### 方法二:调整系统动态端口范围(针对 Windows) 在某些情况下,特别是Windows环境下启用Hyper-V之后,由于其预留了一部分TCP动态端口给虚拟交换机使用,可能导致实际可用端口减少而引发冲突。此时可通过修改注册表增大动态端口池大小或者更改起始编号以避开常用业务端口区间[^2]。 #### 方法三:改变目标服务监听的默认端口 对于特定应用如GitLab,默认SSH服务可能工作于22端口;如果该端口已被占用,则可以在启动命令中通过 `--publish` 或者简称 `-p` 来重新定义对外暴露的新端口号,并相应更新配置文件中的设置项以便客户端能够正确连接新地址[^3]。 #### 检查和释放被占用端口的方式 要查看当前哪些进程占用了某个具体端口,Linux 用户可利用如下命令查询: ```bash sudo lsof -i :<port_number> # 或者 netstat -tulnp | grep <port_number> ``` 而在 Windows 上则有多种工具可供选择,比如PowerShell内置指令: ```powershell Get-Process -Id (Get-NetTCPConnection -LocalPort <port_number>).OwningProcess ``` 一旦确认了具体的程序实例,就可以考虑终止不必要的进程或是按照上述建议采取措施绕过已有的端口分配限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值