Docker搭建gitlab之端口映射
一、背景
通过前面的文章docker搭建gitlab,我们已经完成了初始环境的搭建。然后在具体的使用过程中,会发现有坑。
例如在创建完毕用户以及项目之后,我们发现通过ssh来推拉项目文件时,会提示要求输入密码,而我们先前是配置过ssh的密钥的。
二、问题分析
在docker容器中,ssh端口是22,但是我们在启动容器时,会指定容器与宿主机之间的端口映射
例如:有坑的端口映射
sudo docker run --detach --publish 8443:443 --publish 8080:80 --publish 8022:22 --name gitlab --restart unless-stopped --volume /home/s/gitlab/etc:/etc/gitlab --volume /home/s/gitlab/log:/var/log/gitlab --volume /home/s/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
我们这里将宿主机的8022端口作为gitlab的ssh端口,所以在进行git clone时,需要改变参数。
在未映射端口的情况下,命令为:我们通过gitlab页面直接复制clone的链接是这样的,没有展示映射的端口,因为它不知道自己在宿主机里面
git clone git@ipxxxx:group/project.git ###直接复制会得到这个地址 :git@ipxxxx:group/project.git
如果指定端口,不能够想当然的设置为ip:port
错误: git clone git@10.10.10.10:8022:group/project.git
而需要改变协议方式:正确的clone地址应该是如下,所以我们要改变配置文件,使得直接复制得到的地址正确
git clone ssh://git@10.10.10.10:8022/group/project.git
三、解决方案
这里的坑在于,我们的gitlab是运行在容器中的,通过gitlab的web服务,我们获取到的clone地址,是没有考虑过宿主机与容器之间的端口映射的,所以我们在启动容器时,需要把映射使用的端口考虑进去,最理想的是宿主机端口与容器端口完全对应。因此使用如下命令来运行容器:
理想的端口映射:
80端口映射宿主机80端口,
ssh 8022:22 docker容器内部还是使用22端口
sudo docker run --detach --publish 8443:443 --publish 80:80 --publish 8022:8022 --name gitlab --restart unless-stopped --volume /home/s/gitlab/etc:/etc/gitlab --volume /home/s/gitlab/log:/var/log/gitlab --volume /home/s/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
上面的命令将8022端口作为gitlab的ssh映射端口,当我们通过git clone命令下载文件时,要指明使用8022端口。
另外,如果需要在项目工程的clone链接地址使用ip或者域名,可以显示的增加参数:
--hostname '域名' 或者ip
在容器启动之后,我们需要进入容器,然后修改gitlab所默认配置的ssh端口:
docker exec -it 容器id /bin/bash
修改配置文件
vim /etc/gitlab/gitlab.rb
配置项增加:这一项的主要作用是在gitlab上展示8022端口
gitlab_rails['gitlab_shell_ssh_port'] = 8022
另外一种方法是端口完全映射 22:22 ,80:80,宿主机的ssh端口我们改为非22的其它端口
方法参考