解决尝试连接到 Docker 守护进程套接字时 Docker 权限被拒绝
问题:
你正在尝试运行 docker 容器或做 docker 教程,但你只收到类似这样的错误消息:
docker_permission_error.txt
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.解决方案
错误消息告诉你当前用户无法访问 docker 引擎,因为你缺少访问 unix 套接字以与引擎通信的权限。
作为临时解决方案,你可以使用 sudo 以 root 身份运行失败的命令(例如 sudo docker ps)。
但是建议通过将当前用户添加到 docker 组来修复问题:
在你喜欢的 shell 中运行此命令,然后完全登出你的帐户并重新登录(或退出你的 SSH 会话并重新连接,如果不确定,重启你尝试运行 docker 的计算机!):
usermod_add_docker.sh
sudo usermod -a -G docker $USER这样做后,你应该能够毫无问题地运行命令。以普通用户身份运行 docker run hello-world 以检查它是否工作。如果问题仍然存在,请重启。
请参见sudo usermod -a -G group $USER 在 Linux 上做什么?了解此命令在你的系统上更改什么以及参数的含义。
需要登出并重新登录,因为除非你的会话关闭,否则组更改不会生效。
背景信息
在 Linux 上,当你运行任何 docker 命令时,docker 二进制文件将尝试连接到 /var/run/docker.sock。如其 .sock 扩展名所示,此文件是 Unix 域套接字 - 基本上是一种让多个进程在本地计算机上通信的方式(也称为 IPC 机制 - IPC = “进程间通信”)。
在 Docker 的情况下,使用套接字的主要原因是属于 docker 组的任何用户都可以连接到套接字,而 Docker 守护进程本身可以以 root 运行。本质上,它是一个便利功能,允许多个 docker 客户端命令在内部与同一守护进程通信。
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow