Docker 远程守护进程(TCP):无法连接到 Docker 守护进程

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

重新启动 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 -H ... -v /:/host busybox cat /host/etc/shadow 命令来读取该主机上加密的用户密码,这是你可能做的最小伤害。立即删除 dockerd -H 选项,并考虑是否需要重新安装系统。 - David Maze
感谢您的回答。为了澄清,最终目标是与远程Docker守护程序建立安全的TCP连接。第一次尝试没有成功。为了调试,我使用了两个完全空的DigitalOcean Ubuntu droplets。有什么更好的调试方法吗? - danieljacky
1个回答

4
您的Docker守护程序正在侦听本地主机地址127.0.0.1。您将无法从远程主机连接到该地址。唯一能够连接到该地址的主机是...本地主机。
要使Docker守护程序接受来自远程主机的连接,您可能需要:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

那意味着,“监听来自所有主机的连接”。但你不是真的想要这样,因为这将授予任何能够连接到该端口的人未经身份验证的root访问权限。你可以使用iptables将访问限制为仅特定远程主机,但问题仍然存在,因为能够访问这些主机中的任何一个的任何人都将具有未经身份验证的root访问权限。
你真正想做的是阅读“保护Docker守护程序套接字”,其中讨论了如何为对Docker守护程序的远程连接设置基于证书的身份验证。与你的问题中的示例不同,该文档中讨论的配置要求客户端使用SSL证书进行身份验证。
这比允许从任何地方进行未经身份验证的访问更加安全,并且比允许来自特定主机的未经身份验证的访问更为安全(因为可以使用文件系统所有权和权限来限制访问所需的SSL私钥,以授予对docker守护程序的访问权限)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接