Pycharm中Docker使用Unix/TCP套接字(with unix:///var/run/docker.sock): Permission Denied

22

在尝试在PyCharm专业版中设置Docker时,我遇到了权限被拒绝的错误。我使用的是Debian Jessie(BunsenLabs)。

Cannot connect: io.netty.channel.AbstractChannel$AnnotatedConnectException: connect(..) failed: Permission denied: /var/run/docker.sock
caused by: java.net.ConnectException: connect(..) failed: Permission denied

使用默认设置(使用Unix套接字)和TCP套接字时都会发生这种情况,Engine API URL = unix:///var/run/docker.sock(有意义吗?)。

如果我们查看套接字的权限:

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul  5 11:18 /var/run/docker.sock

我们可以看到它是由root和docker组拥有的。

因此,我尝试将我的用户添加到docker组中(使用sudo usermod -a -G docker USERNAME),并重新启动Docker服务(使用sudo service docker restart),但仍然无法正常工作。

允许PyCharm使用套接字的一种方法是以root权限运行它,即sudo pycharm,但我想避免这样做。我还能够通过在套接字上设置其他人的读写权限(sudo chmod o+rw /var/run/docker.sock)来解决这个问题,但现在每个人都可以在该机器上使用Docker而无需管理员权限。

最安全的允许PyCharm连接到Docker套接字的方法是什么?

此外,请注意,在命令行上Docker可以正常工作。在采取快速且不安全的修复方法(chmod o+rw)之前,我必须使用sudo docker并更新了/etc/sudoers以便在执行此命令时无需输入密码。现在即使没有sudo也可以运行。感觉不安全,但这是开发机器,如果没有其他解决方案,我会这么做。

编辑:我正在添加其他重要信息。

首先,将我的用户添加到Docker组中确实是正确的方法。问题在于,当使用sudo usermod时,更改不会立即反映在您正在使用的用户帐户上。 您需要注销并重新登录以刷新系统。 有关更多信息,请参见此帖子和答案:Add user to group but not reflected when run "id"

其次,将自己添加到Docker组中允许提升权限! 任何能够运行docker而无需sudo(因此无需输入密码)的用户还将能够使用挂载在卷中的系统根的容器运行:docker run -v /:/host_root -it --rm ubuntu /bin/bash。由于您是容器中的root,因此这意味着您可以像在主机上一样操作主机系统 。在将用户添加到docker组之前,请考虑这一点。


你的Docker在PyCharm之外正常工作吗?这意味着当尝试从bash访问Docker守护程序时,是否没有权限问题? - trust512
我之前在我的问题中提到并删除了它,但是没错,在命令行中Docker运行得非常好!我会把这个加回去。 - pawamoy
3个回答

57

我假设你的用户名已经在docker组中。要检查这一点,请发出以下命令。

id -nG
如果没有,则需要通过以下命令将您的用户添加到docker组中。
sudo groupadd docker
sudo usermod -aG docker $USER
当您执行命令sudo systemctl start docker时,它会创建一个Docker进程。该Docker进程包含dockerd守护线程。该命令还会创建默认的docker.sock Unix套接字。docker.sock套接字会被dockerd守护线程持续监听。这使您可以与docker.pid进程进行内核级别的IPC。要能够使用此Docker套接字,您需要从进程级别(docker.pid)和文件级别(docker.sock)获得适当的权限。因此,执行以下两个命令应解决您的问题。
sudo chmod a+rwx /var/run/docker.sock
sudo chmod a+rwx /var/run/docker.pid

正如您所看到的,在 PyCharm 中并没有显示任何错误。 输入图片说明

注意:运行 sudo dockerd -H unix:///var/run/docker.sock 也会执行与上述相同的操作。

此外,您可以创建 TCP 套接字,以便您可以将此 TCP 套接字用于自己的主机以及任何远程主机。

停止 Docker:sudo systemctl stop docker

dockerd -H tcp://127.0.0.1:2375 -H// 在执行此命令之前,您应该先停止 Docker

启动 Docker:sudo systemctl start docker

然后在 PyCharm 中查看下面的成功 TCP Docker 套接字连接。 输入图片说明


1
接受了这个答案而不是我的,它更完整。我的只是一个更新。我在我的帖子中添加了两个注释作为编辑。 - pawamoy
这个救了我,非常感谢!我都快抓狂了。 - ViaTech

2
另一个值得尝试的选项是通过本地tcp接口公开docker守护程序 - 参考 参考文档,您可以编写/etc/docker/daemon.json,使其看起来像:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}

有了这个设置,您可以尝试重新启动docker并在PyCharm首选项中配置TCP套接字


1
我之前没有 /etc/docker/daemon.json 文件,所以我创建了它并写入了完全相同的内容,但现在 Docker 无法启动。日志中显示类似于 docker.service start request repeated too quickly, refusing to start. 的消息...也许是因为 conky 尝试运行 docker 命令造成的。重启后再尝试。 - pawamoy
1
所以!我转而进行了systemd服务的配置:https://docs.docker.com/install/linux/linux-postinstall/#configuring-remote-access-with-systemd-unit-file。在重新启动之前,我仍然需要等待一分钟以上:`let time=5; until service docker start; do sleep $time; echo slept $time; let time+=$time; done。在time=40后工作正常。但是!实际上现在它使用的是srw-rw---- 1 root docker /var/run/docker.sock`,并且我的用户属于docker组。我认为它需要重新启动。在重启之前,“groups”没有显示“docker”。现在它有了。今天我学到了很多! - pawamoy
无论如何,感谢您的建议,我已经测试过了,它也起作用了! - pawamoy
请注意,这样做将为本地系统上的每个用户和进程提供无限制的 root 访问权限。chmod 0777 /var/run/docker.sock 并不更加危险,但至少不会打开 TCP 套接字。 - David Maze

1
似乎我的第一次尝试(将自己添加到“docker”组中)是正确的。但需要重新启动计算机。
实际上,我很惊讶在“groups”命令的输出中没有看到“docker”。重新启动后,现在显示“docker”。
我将套接字权限重置为以前的状态:sudo chmod o-rw /var/run/docker.sock
PyCharm能够成功连接到套接字。

很高兴终于成功了。不过奇怪的是,在我按照你描述的这些安装后步骤之后,我在Debian/Ubuntu上从未需要重新启动。这就是为什么我认为我们需要找到一个新的解决方案的原因 ;) - trust512
啊!在这里找到了一个解释:https://dev59.com/wGsz5IYBdhLWcg3w9s2r :) - pawamoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接