如何修复 docker 'Got permission denied while trying to connect to the Docker daemon socket'
问题:
你正在运行类似 docker ps 的命令,但你收到此错误消息:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied解决方案
作为快速修复,使用 sudo 以 root 身份运行命令(例如 sudo docker ps)将暂时解决问题。
这里的问题是你运行命令的用户不是 docker 组的成员。要将其添加到 docker 组,运行
sudo usermod -a -G docker $USER运行该命令后,你需要注销并重新登录到计算机(或终止你的 SSH 会话并重新连接,如果你使用 SSH 登录) - 否则,组更改不会生效。
运行 groups 应该显示你现在属于 docker 组:
$ groups
uli sudo www-data lxd docker # 检查 docker 是否出现在这里!之后,重试运行命令(例如 docker ps) - 错误现在应该已消失。
请参见在 Linux 上 sudo usermod -a -G group $USER 做什么?了解此命令在你的系统上更改了什么以及参数的含义。
背景信息
当你在 Linux 上运行任何 docker 命令时,docker 二进制文件将尝试连接到 /var/run/docker.sock。这允许你作为非 root 用户运行 docker 命令,而无需一直使用 sudo。
当你启动 docker 守护进程时,它将创建 /var/run/docker.sock 作为客户端应用程序连接的 unix 套接字。
你可以通过在命令行上使用 stat /var/run/docker.sock 查看 docker 套接字的所有者、组和权限:
$ stat /var/run/docker.sock
File: /var/run/docker.sock
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 16h/22d Inode: 677 Links: 1
Access: (0660/srw-rw----) Uid: ( 0/ root) Gid: ( 999/ docker)
Access: 2019-04-30 01:32:21.718150679 +0200
Modify: 2019-04-24 18:37:39.236357175 +0200
Change: 2019-04-24 18:37:39.240357175 +0200
Birth: -对于我们的目的,有趣的信息是 Uid: ( 0/ root) Gid: ( 999/ docker),它告诉你 docker 套接字由用户 root 和组 docker 拥有。组 ID 在你的计算机上可能不同,但只有组名是相关的。
鉴于权限 Access: (0660/srw-rw----),所有者(root)和组(docker)都可以对 docker 套接字进行读写(rw)。这意味着如果你是用户 root(你可以使用 sudo 暂时成为)或者你是 docker 组的成员,你将能够连接到该套接字并与 docker 守护进程通信。
注意 docker 守护进程本身(dockerd)以 root 身份运行,你可以使用以下命令检查
$ ps aux | grep dockerd
root 2680 0.1 0.3 1247872 19828 ? Ssl Apr24 7:44 /usr/bin/dockerd -H fd://有关 docker 守护进程的更多信息,请参见官方 Docker 守护进程指南。