摘要:docker
,linux
問題復(fù)現(xiàn)
一般都是用root用戶啟動和操作docker班利,當(dāng)是普通用戶運行容器啟動項目時報錯沒有權(quán)限
(base) ubuntu@VM-16-11-ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
原因分析
docker守護(hù)進(jìn)程后臺啟動時饥漫,需要讀取Unix套接字/var/run/docker.sock
,這個文件root所有罗标,docker用戶組可操作庸队,因此普通非docker組的用戶沒有權(quán)限訪問
ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Oct 29 22:20 /var/run/docker.sock=
類似的MySQL客戶端也可以使用socket進(jìn)行連接,文件在/var/run/mysqld/mysqld.sock
root@ubuntu:~$ ll /var/run/mysqld/mysqld.sock
srwxrwxrwx 1 mysql mysql 0 12月 12 21:48 /var/run/mysqld/mysqld.sock=
默認(rèn)是777權(quán)限闯割,如果改成770彻消,則非root用戶或者非mysql組用戶也將無法連接MySQL
root@ubuntu:~# chmod 770 /var/run/mysqld/mysqld.sock
root@ubuntu:~# ll /var/run/mysqld/mysqld.sock
srwxrwx--- 1 mysql mysql 0 12月 12 21:48 /var/run/mysqld/mysqld.sock=
退出root用戶,普通用戶無法報錯無法通過socket連接
root@ubuntu:~# exit
exit
xiaogp@ubuntu:~$
xiaogp@ubuntu:~$ mysql -u -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (13)
解決方案
(1)使用sudo免密碼運行
本質(zhì)上還是使用root運行docker纽谒,只是在啟動的時候可以以root用戶啟動docker证膨,為了避免每次啟動需要輸入密碼如输,需要給普通用戶sudo權(quán)限以及可以免密碼方式登錄鼓黔。
在/etc/sudoers文件中設(shè)置免密碼
(base) test@VM-16-11-ubuntu:~$ sudo vim /etc/sudoers
test ALL=(ALL:ALL) NOPASSWD: ALL
此時再使用sudo運行docker即可,在其他shell腳本中docker run前面增加sudo
(base) test@VM-16-11-ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3.7 0b3f272343d3 6 weeks ago 903MB
mysql latest ecac195d15af 7 weeks ago 516MB
如果不使用sudo則無權(quán)限操作docker
(base) test@VM-16-11-ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
(2)將用戶添加到docker組
docker安裝之后默認(rèn)會創(chuàng)建docker組不见,docker組擁有讀取套接字權(quán)限澳化,因此將該普通用戶加入docker組,該組下所有用戶有訪問unix套接字權(quán)限稳吮,最后刷新用戶的初始組即可缎谷。
先查看是否有docker用戶,如果沒有需要手動增加
(base) test@VM-16-11-ubuntu:~$ sudo cat /etc/group |grep docker
docker:x:999:
sudo groupadd docker
如果/var/run/docker.sock的用戶組不是docker而是root需要使用chgrp
修改一下
# ll /var/run/docker.sock
srw-rw---- 1 root root 0 Oct 29 22:20 /var/run/docker.sock=
chgrp docker /var/run/docker.sock=
將普通用戶添加到docker組
(base) test@VM-16-11-ubuntu:~$ sudo gpasswd -a test docker
Adding user test to group docker
此時查看test用戶所在的組
(base) test@VM-16-11-ubuntu:~$ id
uid=1002(test) gid=1002(test) groups=1002(test)
發(fā)現(xiàn)還是沒有docker組灶似,使用newgrp
刷新以下用戶的初始組
(base) test@VM-16-11-ubuntu:~$ newgrp docker
此時再次查看用戶的組以已經(jīng)出現(xiàn)docker
(base) test@VM-16-11-ubuntu:~$ id
uid=1002(test) gid=1002(test) groups=1002(test),999(docker)
然后直接以用戶操作docker即可
(base) test@VM-16-11-ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3.7 0b3f272343d3 6 weeks ago 903MB
mysql latest ecac195d15af 7 weeks ago 516MB
或者不使用newgrp直接重新登錄即可
gpasswd和newgrp
gpasswd是linux下組管理工具列林,用戶添加用戶到組和從組中刪除用戶,必須是sudo執(zhí)行
(base) test@VM-16-11-ubuntu:~$ gpasswd --help
Usage: gpasswd [option] GROUP
Options:
-a, --add USER add USER to GROUP
-d, --delete USER remove USER from GROUP
...
測試刪除和添加test用戶于docker組
(base) test@VM-16-11-ubuntu:~$ sudo gpasswd -d test docker
Removing user test from group docker
此時退出終端重新登錄則test的docker組消失酪惭,再添加進(jìn)來
(base) test@VM-16-11-ubuntu:~$ sudo gpasswd -a test docker
Adding user test to group docker
添加之后在當(dāng)前終端不能立刻生效希痴,需要使用newgrp將新增加的組添加到用戶組的集合中刷新,立即生效
(base) test@VM-16-11-ubuntu:~$ newgrp docker
以后退出登錄后新登錄進(jìn)來用戶的用戶組都會更新生效