Docker 远程守护进程 (TCP):无法连接到 Docker 守护进程
Docker remote daemon (TCP): Cannot connect to the Docker daemon
我正在尝试通过 TCP 将 docker 守护程序从客户端连接到远程主机,但出现此错误:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
这可能是什么原因?找到解决方案的正确调试方法是什么?
- 系统:Ubuntu18.04(客户端和主机)
- ufw:为所有传入和传出启用(用于测试目的)
- 访问权限:在客户端和主机上使用 root 权限
我做了什么
在主机上:
systemctl edit docker.service
添加并保存这些行:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
重新加载守护进程:
systemctl daemon-reload
重启docker:
systemctl restart docker.service
检查是否有效:
netstat -lntp | grep dockerd
结果:
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
测试 docker:
docker -H tcp://127.0.0.1:2375 ps
主机上一切正常。但是,当我尝试从客户端连接远程主机时出现错误。
客户端:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
通过 ssh 连接有效:
docker -H ssh://root@{{HOST_IP}} ps
您有 Docker 守护程序侦听本地主机地址 127.0.0.1
。您将无法从远程主机连接到它。唯一可以连接到该地址的主机是...本地主机。
要让 Docker 守护程序接受来自远程主机的连接,您可能需要:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
也就是说,"listen for connections from all hosts"。但是您 真的 不想要那个,因为这会向能够连接到该端口的任何人授予未经身份验证的 root
对您系统的访问权限。您可以使用 iptables
来限制对特定远程主机的访问,但这 仍然是一个问题 ,因为任何能够访问任何这些主机的人都会再次未经身份验证 root
访问您的 Docker 主机。
您真正想做的是通读“Protect the Docker daemon socket”,其中讨论了如何为远程连接设置基于证书的身份验证Docker守护进程。与您问题中的示例不同,该文档中讨论的配置要求客户端使用 SSL 证书进行身份验证。
这比允许从任何地方进行未经身份验证的访问要安全得多,并且比允许从特定主机进行未经身份验证的访问要安全得多(因为文件系统所有权和权限可用于限制对授权所需的 SSL 私钥的访问访问 docker 守护进程)。
我正在尝试通过 TCP 将 docker 守护程序从客户端连接到远程主机,但出现此错误:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
这可能是什么原因?找到解决方案的正确调试方法是什么?
- 系统:Ubuntu18.04(客户端和主机)
- ufw:为所有传入和传出启用(用于测试目的)
- 访问权限:在客户端和主机上使用 root 权限
我做了什么
在主机上:
systemctl edit docker.service
添加并保存这些行:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
重新加载守护进程:
systemctl daemon-reload
重启docker:
systemctl restart docker.service
检查是否有效:
netstat -lntp | grep dockerd
结果:
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
测试 docker:
docker -H tcp://127.0.0.1:2375 ps
主机上一切正常。但是,当我尝试从客户端连接远程主机时出现错误。
客户端:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
通过 ssh 连接有效:
docker -H ssh://root@{{HOST_IP}} ps
您有 Docker 守护程序侦听本地主机地址 127.0.0.1
。您将无法从远程主机连接到它。唯一可以连接到该地址的主机是...本地主机。
要让 Docker 守护程序接受来自远程主机的连接,您可能需要:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
也就是说,"listen for connections from all hosts"。但是您 真的 不想要那个,因为这会向能够连接到该端口的任何人授予未经身份验证的 root
对您系统的访问权限。您可以使用 iptables
来限制对特定远程主机的访问,但这 仍然是一个问题 ,因为任何能够访问任何这些主机的人都会再次未经身份验证 root
访问您的 Docker 主机。
您真正想做的是通读“Protect the Docker daemon socket”,其中讨论了如何为远程连接设置基于证书的身份验证Docker守护进程。与您问题中的示例不同,该文档中讨论的配置要求客户端使用 SSL 证书进行身份验证。
这比允许从任何地方进行未经身份验证的访问要安全得多,并且比允许从特定主机进行未经身份验证的访问要安全得多(因为文件系统所有权和权限可用于限制对授权所需的 SSL 私钥的访问访问 docker 守护进程)。