docker搭建jenkins環境執行宿主機的docker時會出現permission denied的情況
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
…………………………………………………………
dial unix /var/run/docker.sock: connect: permission denied
網上[1]的解決方法是在容器所在的宿主機上直接給 docker.sock
777權限,命令 chmod 777 docker.sock,但是這樣能使所有用戶都能訪問docker,降低了系統安全性,所以本文從用戶組[2]方面入手解決這一問題。
根據[3]所示,容器在內外訪問的uid和gid是相同的,也就是容器在訪問外部掛載文件的用戶和組的唯一標識是完全一樣的,如下圖所示,根據[4]所示的掛載情況(
-v /var/run/docker.sock:/var/run/docker.sock ),我們來找到屬組的id。
宿主機docker文件屬組情況:
宿主機屬組id:
jenkins容器內的文件情況:
從圖中可知,docker.sock的屬組是998,由於容器內部沒有組id爲998的組,所以顯示998,而jenkins容器內的默認用戶是jenkins用戶,所以我們需要創建組id爲998的組,把jenkins用戶添加到id爲998的組,就能滿足jenkins容器訪問容器外的docker。
首先以root權限進去jenkins容器:
docker exec -it -u root jenkins bash
然後創建組id爲998的組:
groupadd -g 998 docker
這時, jenkins容器內的文件情況:
然後把jenkins用戶加入到docker組中[5]:
退出容器,以jenkins用戶進入容器,輸入docker version,如果沒有權限的話不能看到服務端:
重啓jenkins容器,就能在jenkins頁面上使用容器外的docker了
參考資料:
[1] https://blog.csdn.net/catoop/article/details/91042007
[2] https://www.cnblogs.com/informatics/p/8276172.html
[3] https://www.cnblogs.com/sparkdev/p/9614164.html