一、背景
通過前面的文章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的其它端口
方法參考