我在the official directions之后的Ubuntu 16.04上安装了docker,并成功运行了注册表作为容器。我想远程连接到另一个容器,所以我尝试:
docker -H tcp://1.2.3.4:2375 exec -it 19f36d1bdfaf /bin/bash
我收到错误:
连接期间出现错误:发布 http://1.2.3.4:2375/v1.29/containers/19f36d1bdfaf/exec:拨打tcp 1.2.3.4:2375:connectex:无法建立连接,因为目标机器主动拒绝它。
经过数小时的谷歌搜索没有解决方案我被迫向StackOverflow提出这个问题:为什么我会收到此错误,我该如何解决?
docker.json文件包含内容:
{
"hosts": [
"tcp://0.0.0.0:2375",
"npipe://"
]
}
当我查看服务时,看起来守护进程没有像我期望的那样在tcp://0.0.0.0:2375上进行监听(这仅用于测试,一旦我能得到,我就会保护它它实际上工作):
更新
通过创建daemon.json文件(docker.json的副本),然后运行:
来部分工作sudo dockerd
问题在于现在客户端不起作用:docker info
导致错误:
无法在unix:///var/run/docker.sock上连接到Docker守护程序。 docker守护程序是否正在运行?
更新和解决方案: 安德烈亚斯'回答帮助我意识到守护进程没有正常运行。查看本文前面的截图,未使用右-H选项启动docker守护程序。然后我发现this Github issue解决了这个问题。所以所需要的只是:
DOCKER_OPTS="-H tcp://0.0.0.0:2375"
(请注意,这不是非常安全,仅用于测试)[Service]
下为EnvironmentFile添加一行:EnvironmentFile=-/etc/default/docker
,然后更新ExecStart行:ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
sudo service docker restart
systemctl daemon-reload
请注意,我没有添加daemon.json
文件 - 我离开了现有的docker.json
文件。
答案 0 :(得分:4)
默认情况下,出于安全原因,docker守护程序不会暴露给外部世界。当您使用-H
标志启动docker守护程序时,您当然可以更改此设置。
要测试它,您只需手动启动您的守护程序(确保之前停止服务)。假设1.2.3.4是运行您要连接的守护程序的主机的IP。
<path to>/dockerd -H tcp://1.2.3.4:2375
或者将它绑定到所有网络接口:
<path to>/dockerd -H tcp://0.0.0.0:2375
这里可以提供多个-H
选项,以便在绑定到tcp套接字时不禁用unix套接字。有关守护程序绑定选项的详细信息,请参阅the docs (Bind Docker to another host/port or a Unix socket)。
要永久拥有此功能,您可以在daemon.json
文件中配置守护程序启动设置,您也可以在其中指定主机阵列。有关这方面的信息,请参阅the docs (Configure the Docker daemon)和Linux configuration File。
{
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
您可以提供hosts
的条目列表,这样您的守护程序就可以同时监听tcp和unix套接字。
请注意,只需绑定到tcp 0.0.0.0,任何能够访问您的计算机的人都可以远程启动容器,因此几乎可以在您的系统上执行任何操作,就像使用非常糟糕的root用户密码一样。您应该只在测试时或在隔离/防火墙的环境中执行此操作。
答案 1 :(得分:1)
安德烈亚斯&#39;回答帮助我意识到守护进程没有正常运行。查看本文前面的截图,未使用右-H选项启动docker守护程序。然后我发现this Github issue解决了这个问题。所以所需要的只是:
DOCKER_OPTS="-H tcp://0.0.0.0:2375"
(请注意,这不是非常安全,仅用于测试)[Service]
下为EnvironmentFile添加一行:EnvironmentFile=-/etc/default/docker
,然后更新ExecStart行:ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
sudo service docker restart
请注意,我没有添加daemon.json
文件 - 我离开了现有的docker.json
文件。