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

时间:2020-01-05 23:32:04

标签: docker tcp ubuntu-18.04 docker-daemon

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

systemctl edit docker.service

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

  • 系统:Ubuntu 18.04(客户端和主机)
  • ufw:已启用所有传入和传出(出于测试目的)
  • 访问权限:在客户端和主机上使用root用户

我要做什么

在主机上:

[Service]
 ExecStart=
 ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375

添加并保存以下行:

systemctl daemon-reload

重新加载守护程序:

systemctl restart docker.service

重启docker:

netstat -lntp | grep dockerd

检查是否有效:

tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

结果:

docker -H tcp://127.0.0.1:2375 ps

使用docker测试:

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

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

一切都在主机上进行。但是,当我尝试从客户端连接到远程主机时,出现错误。

在客户端上

docker -H ssh://root@{{HOST_IP}} ps

通过ssh连接可以正常工作:

{{1}}

1 个答案:

答案 0 :(得分:2)

您有Docker守护程序在本地地址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守护进程)。