docker.sock 权限被拒绝
- 2024-10-14 08:40:00
- admin 原创
- 118
问题描述:
当我尝试运行简单的docker命令时,例如:
$ docker ps -a
我收到一条错误消息:
权限被拒绝.../var/run/docker.sock:connect:权限被拒绝
当我使用检查权限时
$ ls -al /var/run/
我看到这一行:
srw-rw---- root docker docker.sock
因此,我遵循许多论坛的建议,将本地用户添加到 docker 组:
$ sudo usermod -aG docker $USER
但它没有帮助。我仍然收到相同的错误消息。我该如何修复它?
解决方案 1:
对于刚接触 shell 的人来说,命令如下:
$ sudo usermod -aG docker $USER
需要$USER
在 shell 中定义。通常默认情况下会存在,但在某些 shell 中您可能需要将该值设置为您的登录 ID。
更改用户的组不会更改用户已打开的现有登录名、终端和 shell。为了避免再次执行登录,您只需运行:
$ newgrp docker
以便在当前 shell 中访问该组。
一旦完成此操作,用户实际上就拥有了服务器上的 root 访问权限,因此只对具有不受限制的 sudo 访问权限的受信任用户执行此操作。
解决方案 2:
原因:错误信息意味着当前用户无法访问docker引擎,因为用户没有足够的权限访问UNIX套接字来与引擎通信。
快速修复:
使用 sudo 以 root 身份运行该命令。
sudo docker ps
更改当前用户的 /var/run/docker.sock 权限。
sudo chown $USER /var/run/docker.sock
注意:运行sudo chmod 777 /var/run/docker.sock可以解决您的问题,但它会为所有人打开 docker 套接字,这是一个安全漏洞,正如 @AaylaSecura 指出的那样。因此,除非在本地系统上进行测试,否则不应使用它。
永久解决方案:
将当前用户添加到docker组。
sudo usermod -a -G docker $USER
注意:您必须注销并重新登录才能使更改生效。
请参阅此博客来了解有关以非 root 用户身份管理 Docker 的更多信息。
解决方案 3:
确保你的
$USER
变量已设置
$ echo $USER
$ sudo usermod -aG docker $USER
登出
登录后,重新启动docker服务
$ sudo systemctl restart docker
$ docker ps
解决方案 4:
输入命令并探索 docker,无需 sudo 命令
sudo chmod 666 /var/run/docker.sock
解决方案 5:
正如评论中前面提到的,更改只有在您重新登录后才会生效。如果您正在执行 SSH 并打开新终端,它将在新终端中运行
但由于您使用的是 GUI 并打开了新终端,因此更改未应用。这就是错误没有消失的原因
因此下面的命令确实完成了它的工作,只是错过了重新登录
sudo usermod -aG docker $USER
解决方案 6:
您需要以非 root 用户身份管理 docker。要创建 docker 组并添加您的用户:
创建 docker 组。
$ sudo groupadd docker
将您的用户添加到 docker 组。
$ sudo usermod -aG docker $USER
注销并重新登录,以便重新评估您的群组成员身份。
如果在虚拟机上测试,可能需要重新启动虚拟机才能使更改生效。
在桌面 Linux 环境(如 X Windows)上,完全注销您的会话,然后重新登录。
在 Linux 上,您还可以运行以下命令来激活对组的更改:
$ newgrp docker
验证您是否可以在没有 sudo 的情况下运行 docker 命令。
$ docker run hello-world
解决方案 7:
*关于这些答案的重要说明:docker 组并不总是“docker”,有时它是“dockerroot”,例如 Centos 7 安装的情况
sudo yum install -y docker
安装 Docker 后你应该做的第一件事是
sudo tail /etc/group
它应该说类似
......
sshd:x:74:
postdrop:x:90:
postfix:x:89:
yourusername:x:1000:yourusername
cgred:x:996:
dockerroot:x:995:
在这种情况下,它是“dockerroot”而不是“docker”。因此,
sudo usermod -aG dockerroot yourusername
logout
解决方案 8:
当我尝试运行简单的docker命令时,例如:
$ docker ps -a
我收到一条错误消息:
Got permission denied ... /var/run/docker.sock: connect: permission denied
。[…] 我该如何修复它?
TL;DR:有两种方法(第一种方法,也在问题本身中提到,已被其他答案广泛解决,但存在安全问题;所以我将详细阐述这个问题,并开发第二种解决方案,它也适用于这个相当合理的用例)。
回顾一下上下文,Docker 守护进程套接字归以下人员所有root:docker
:
$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 janv. 28 14:23 /var/run/docker.sock
因此,使用此默认设置,需要在所有 docker CLI 命令前面加上sudo
。
为了避免这种情况,可以:
将某人的用户帐户(
$USER
)添加到docker
组 - 但在个人工作站上这样做相当危险,因为这相当于为用户运行的所有程序提供 root 权限,而无需任何sudo
密码提示或审核。
参见:
* Docker 官方文档中的此页面:
https://docs.docker.com/engine/security/#docker-daemon-attack-surface
* 记录相关*漏洞*的此页面:
https://fosterelli.co/privilege-escalation-via-docker.html
否则,可以
sudo
自动添加而无需sudo docker
手动输入:为此,解决方案是在中添加以下别名~/.bashrc
(有关详细信息,请参阅此线程):
__docker() {
if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
docker "$@"
else
sudo docker "$@"
fi
}
alias docker=__docker
然后可以通过打开一个新终端并输入以下内容来测试:
docker run --pul〈TAB〉 # → docker run --pull
# autocompletion works
docker run --pull always --rm -it debian:11 # ask one's password
docker run --help # bypass the alias (thanks to the ) and ask no password
解决方案 9:
由于我的用户是 AD 用户,因此我必须通过手动编辑 /etc/group 文件将 AD 用户添加到本地组。遗憾的是,adduser 命令似乎不支持 nsswitch,在将某人添加到组时无法识别未在本地定义的用户。
然后重启或者刷新 /etc/group。现在,你就可以在不添加 sudo 的情况下使用 docker 了。
问候。
解决方案 10:
借助以下命令,我能够在没有 sudo 的情况下执行 docker 命令
sudo setfacl -m 用户:$USER:rw /var/run/docker.sock
解决方案 11:
我做了所有的事情,但仍然有错误。要解决这个问题,你的用户必须读/写/var/run/docker.sock
:
$ ls -al /var/run/ |grep docker
srw-rw---- 1 root docker 0 Mar 3 10:07 docker.sock
因此,您可以进行编辑/etc/sudoers
以授予您的用户 root 权限,或者您可以修改组/var/run/docker.sock
以更改为 docker 组:
$ chgrp docker /var/run/docker.sock
$ ls -al /var/run/ |grep docker
srw-rw---- 1 root docker 0 Mar 3 10:07 docker.sock
现在你可以docker ps
不用 sudo 了。不建议更改 docker.sock 权限
解决方案 12:
如果您正在使用任何触发 docker run 命令的 node.js 进程,那么您可以使用:
sudo node index.js
如果您使用 pm2 启动 node.js 进程/服务器,进而触发 docker run 命令,则使用:
sudo pm2 start index.js
解决方案 13:
您必须使用 pns 执行程序而不是 docker。运行以下修改 configmap 的补丁,然后一切就绪了。
kubectl -n argo patch cm workflow-controller-configmap -p '{"data": {"containerRuntimeExecutor": "pns"}}' ;
参考: https: //www.youtube.com/watch? v=XySJb-WmL3Q&list=PLGHfqDpnXFXLHfeapfvtt9URtUF1geuBo&index=2&t=3996s
解决方案 14:
在docker服务器中运行下面的命令,你的问题就解决了
sudo chmod 777 /var/run/docker.sock
解决方案 15:
以 root 用户身份进入容器docker exec -it --user root <dc5> bash
如果尚未创建,请创建 docker 组groupadd -g 999 docker
将用户添加到docker组usermod -aG docker jenkins
更改权限chmod 777 /var/run/docker.sock
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件