6

我正在尝试通过 TCP 将 docker 守护程序从客户端连接到远程主机,但出现此错误:

docker -H tcp://{{HOST_IP}}:2375 ps

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

这可能是什么原因?寻找解决方案的正确调试方法是什么?

  • 系统:Ubuntu 18.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

重启泊坞窗:

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
4

1 回答 1

4

您有 Docker 守护程序在 localhost 地址上侦听,127.0.0.1. 您将无法从远程主机连接到它。唯一可以连接到该地址的主机是……本地主机。

要让 Docker 守护进程接受来自远程主机的连接,您可能需要:

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

这意味着,“侦听来自所有主机的连接”。但是您并不真正想要这样,因为这将授予root能够连接到该端口的任何人对您的系统的未经身份验证的访问权限。您可以使用它iptables来限制对特定远程主机的访问,但这仍然是一个问题,因为任何能够访问任何这些主机的人都将拥有root对您的 Docker 主机的未经身份验证的访问权限。

真正想做的是通读“保护 Docker 守护程序套接字”,其中讨论了如何为与 Docker 守护程序的远程连接设置基于证书的身份验证。与您问题中的示例不同,该文档中讨论的配置要求客户端使用 SSL 证书进行身份验证。

这比允许从任何地方进行未经身份验证的访问要安全得多,并且比允许来自特定主机的未经身份验证的访问要安全得多(因为文件系统所有权和权限可用于限制对授予 docker 守护程序访问权限所需的 SSL 私钥的访问)。

于 2020-01-06T01:53:20.027 回答