Pycharm Docker Unix / TCP套接字(带有unix:///var/run/docker.sock):权限被拒绝

时间:2018-07-05 12:16:37

标签: sockets docker pycharm

尝试在PyCharm Professional版中设置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套接字(引擎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中运行容器。由于您是根用户,因此这意味着您可以像对待根用户一样操作主机系统。在将用户添加到docker组中之前,请考虑这一点。

3 个答案:

答案 0 :(得分:9)

我认为,您的用户名已经在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中没有显示任何错误。 enter image description here

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

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

泊坞窗停止sudo systemctl stop docker

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

启动docker: sudo systemctl start docker

并且,请参阅下面的PyCharm中成功的TCP docker套接字连接。 enter image description here

答案 1 :(得分:1)

另一个值得尝试的选择是通过localhost tcp接口公开您的docker守护进程-ref

相对于文档,您可以编写/etc/docker/daemon.json,如下所示:

{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}

通过该设置,您可以尝试重新启动docker并在PyCharm首选项中配置TCP socket

答案 2 :(得分:0)

似乎我的第一次尝试(将自己添加到docker组中)是正确的。但是需要重新启动。

确实,我很惊讶没有在groups命令的输出中看到“ docker”。重新启动后,它现在显示“ docker”。

我将套接字权限重置为以前的权限:sudo chmod o-rw /var/run/docker.sock

PyCharm能够成功连接到套接字。