【问题标题】:Docker remote daemon (TCP): Cannot connect to the Docker daemonDocker 远程守护进程 (TCP):无法连接到 Docker 守护进程
【发布时间】:2020-01-05 23:32:04
【问题描述】:

我正在尝试通过 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

【问题讨论】:

  • 因此,您已经完成了对当前主机上任何进程的不受限制的根级别访问,而您要做的是将其开放给整个网络。 (如果你成功了,你可以运行docker -H ... -v /:/host busybox cat /host/etc/shadow 来读回该主机上的加密用户密码,这是你可以做的最小破坏性的事情。)立即删除dockerd -H 选项并考虑是否可能需要重新安装系统。
  • 感谢您的回答。澄清一下,最终目标是与远程 docker 守护进程建立安全的 TCP 连接。这在第一次尝试时不起作用。为了调试,我使用了来自 digitalocean 的两个完全空的 ubuntu 液滴。什么是更好的调试方法?

标签: docker tcp ubuntu-18.04 docker-daemon


【解决方案1】:

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

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

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

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

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

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

【讨论】: