背景:
在同一个OS下通过docker安装了Jenkins和Gitlab(其实还有更多),通过不同的端口映射进行区分。进入Jenkins内部,产生SSH秘钥,将公钥添加进Gitlab,无法clone。
验证过程:
- 从Gitlab上(不特殊指定端口)Clone, 命令为
git clone git@gitlab_ip:username/page/repository.git
因为我们需要特殊指定端口,所以命令改为git clone ssh://git@gitlab_ip:port/username/page/reposiroty.git
- 在第二台Server上进行Clone(也需要产生秘钥,将公钥传至Gitlab),可以正常克隆。
- 进入Jenkins内部,执行克隆,这个时候提示fatal: could not create work tree dir 'directory': Permission denied,查询后得知这是目录权限的问题,通过
whoami && id
可以看到当前的用户是Jenkins(我安装的是Jenkins的官方版),我在创建容器的时候,映射了/var/jenkins_home到/home/jenkins_home下,于是修改/home/jenkins的所属者为Jenkins。在/var/jenkins_home/下执行git clone ssh://git@gitlab_ip:port/username/page/reposiroty.git
,这个时候提示ssh: connect to host 10.128.128.164 port 2222: No route to host。在第一步的时候,我们已经在第二台Server对其进行过clone,所以Server端配置没问题。 - 这个时候产生了一个疑问,同一个IP的不同端口间能够互相通信吗?通过查询,得知可以用
telnet -pPORT IP
进行验证。通过验证发现,可以连接。 - 在查询的过程中,发现了一篇关于docker通信的文章,里面分析了同一个OS下两个不同docker容器是如何通信的。docker会创建一个bridge docker0,可以通过
brctl show
看到,docker0绑定了多个接口。通过docker network inspect bridge
可以看到每个容器都分配了一个172.17.0.1/16网段的IP,分别获取到Jenkins与Gitlab容器的IP,在Jenkins内部ping gitlab,可以ping通。在Jenkins内部执行git clone git@172.17.0.3:username/page/repository.git
,可以clone。 -
将Jenkins内部产生的秘钥,添加在Jenkins页面(公钥已经添加在Gitlab页面),可以clone。(看网上好几个show的Jenkins截图,可以在Web页面看到一个选择本机.ssh文件的选项,但我下载的版本里没有,不清楚是不是Jenkins后来撤销了)
docker network
docker container IP
处理git clone命令的非标准SSH端口连接
Jenkins Docker and Gitlab
docker容器网络 - 同一个host下的容器间通信
How To Set Up SSH Keys on CentOS 7
fatal: could not create work tree dir 'kivy'
网友评论