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

paw*_*moy 8 sockets pycharm docker

尝试在PyCharm Professional版本中设置Docker时出现Permission Denied错误.我在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
Run Code Online (Sandbox Code Playgroud)

它既有默认设置(使用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
Run Code Online (Sandbox Code Playgroud)

我们看到它由root和docker组拥有.

所以我尝试将我的用户添加到docker组(with sudo usermod -a -G docker USERNAME),然后重新启动Docker服务(with sudo service docker restart),但它仍然无效.

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

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

此外,请注意Docker在命令行上运行正常.在quick-and-dirty-fix(chmod o+rw)之前,我不得不使用sudo docker,并且已更新/etc/sudoers为不输入​​此命令的密码.现在它甚至没有工作sudo.它感觉不安全,但它是一台开发机器,所以如果没有其他解决方案,我会保持这样.

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

首先,在Docker组中添加我的用户确实是要走的路.问题是,在使用时  sudo usermod,您所使用的用户帐户不会立即反映更改.您需要注销并再次登录才能刷新系统.本帖和答案中的更多信息:将用户添加到组但在运行"id"时不反映.

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

Udd*_*tam 17

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

id -nG
Run Code Online (Sandbox Code Playgroud)

如果没有,则需要通过下面的命令将用户添加到docker组中.

sudo groupadd docker
sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)

执行命令时sudo systemctl start docker,它会创建一个docker进程.该docker进程包含dockerd守护程序线程.该命令还会创建默认的docker.sockUnix套接字.该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
Run Code Online (Sandbox Code Playgroud)

如您所见,它在PyCharm中没有显示任何错误. 在此输入图像描述

注意:运行sudo dockerd -H unix:///var/run/docker.sock也与上面解释的相同.

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

码头停止: sudo systemctl stop docker

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

启动码头工具: sudo systemctl start docker

并且,请参阅下面PyCharm中成功的TCP docker socket连接. 在此输入图像描述