Docker run -v /var/run/docker.sock:/var/run/docker.sock 报错 拒绝权限
最编程
2024-03-25 22:25:59
...
今天在使用 Dozzle 给 docker 装日志服务
$ docker pull amir20/dozzle:latest
$ docker run --name dozzle -d --volume=/var/run/docker.sock:/var/run/docker.sock -p 8888:8080 amir20/dozzle:latest
结果报错
$ Could not connect to Docker Engine: 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/containers/json?all=1&limit=0\": dial unix /var/run/docker.sock: connect: permission denied
网上找了半天解决方案:
方案一:使用sudo获取管理员权限,运行docker命令
方案二:将docker加入用户组
$ sudo groupadd docker #添加docker用户组
$ sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
$ newgrp docker #更新用户组
$ docker ps #测试docker命令是否可以使用sudo正常使用
依然没有解决问题,还是报一样的错
后来在一篇博客上查到,Docker -v 对挂载的目录没有权限 Permission denied 的解决办法中找到答案
方案一:在运行时加 --privileged=true
$ docker run --name dozzle -d --volume=/var/run/docker.sock:/var/run/docker.sock --privileged=true -p 8888:8080 amir20/dozzle:latest
方案二:临时关闭selinux然后再打开
$ setenforce 0
$ docker run ...
$ setenforce 1
方案三:添加linux规则,把要挂载的目录添加到selinux白名单
更改安全性文本的格式如下
chcon [-R] [-t
type
] [-u user] [-r role] 文件或者目录 选顷不参数:-R :该目录下的所有目录也同时修改;
-t :后面接安全性本文的类型字段,例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u;
-r :后面街觇色,例如 system_r
执行
$ chcon -Rt svirt_sandbox_file_t /var/run/docker.sock
出于安全考虑,建议将挂载的权限设为 : read-only
最后我使用
$ docker run --name dozzle -d --volume=/var/run/docker.sock:/var/run/docker.sock:ro --privileged=true -p 8888:8080 amir20/dozzle:latest
完美!