如何修复 docker 'Got permission denied while trying to connect to the Docker daemon socket'

问题:

你正在运行类似 docker ps 的命令,但你收到此错误消息:

docker_permission_error.txt
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 组,运行

add_user_to_docker.sh
sudo usermod -a -G docker $USER

运行该命令后,你需要注销并重新登录到计算机(或终止你的 SSH 会话并重新连接,如果你使用 SSH 登录) - 否则,组更改不会生效。

运行 groups 应该显示你现在属于 docker 组:

check_groups.sh
$ 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_docker_sock.sh
$ 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 身份运行,你可以使用以下命令检查

check_dockerd_process.sh
$ ps aux | grep dockerd
root      2680  0.1  0.3 1247872 19828 ?       Ssl  Apr24   7:44 /usr/bin/dockerd -H fd://

有关 docker 守护进程的更多信息,请参见官方 Docker 守护进程指南


Check out similar posts by category: Container, Docker, Linux