我正在尝试通过TCP将docker守护程序从客户端连接到远程主机,但出现此错误:
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
重启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}}
答案 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守护进程)。