如何连接到在Ubuntu主机上运行的远程docker

我按照官方说明在Ubuntu 16.04上安装了Docker,并成功地将registry作为容器运行。 我想远程连接到另一个容器,所以我尝试:

docker -H tcp://1.2.3.4:2375 exec -it 19f36d1bdfaf /bin/bash 

我得到一个错误:

连接期间出错:Post http://1.2.3.4:2375/v1.29/containers/19f36d1bdfaf/exec:dial tcp 1.2.3.4:2375:connectex:由于目标机器主动拒绝连接,因此无法build立连接。

经过几个小时的谷歌search没有解决scheme,我不得不提出这个问题到StackOverflow:为什么我得到这个错误,我该如何解决?

docker.json文件包含以下内容:

 { "hosts": [ "tcp://0.0.0.0:2375", "npipe://" ] } 

当我查看这些服务时,它看起来像守护进程没有听到tcp://0.0.0.0:2375正如我所期望的(这只是为了testing,我会保护这一点,一旦我能得到它实际工作): 在这里输入图像说明

更新:

通过创build一个daemon.json文件(一个docker.json的副本)来部分工作,然后运行:

 sudo dockerd 

这个问题是,现在的客户端不工作: docker info导致一个错误:

在unix:///var/run/docker.sock中无法连接到Docker守护进程。 docker守护进程运行吗?

更新和解决scheme:安德烈亚斯的答案帮助我意识到守护进程没有正常运行。 在本文前面的屏幕截图中,docker守护进程没有使用右侧的-H选项启动。 然后我发现这个Github问题解决了这个问题。 所以所需要的只是:

  • 编辑/ etc / default / docker中的$ DOCKER_OPTSvariables: DOCKER_OPTS="-H tcp://0.0.0.0:2375" (注意这不是很安全,只是为了testing)
  • 编辑/lib/systemd/system/docker.service文件,方法是在[Service]为EnvironmentFile添加一行: EnvironmentFile=-/etc/default/docker docker,然后更新ExecStart行: ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
  • 重新启动服务sudo service docker restart
  • 使用systemctl daemon-reload重启守护systemctl daemon-reload

请注意,我没有添加daemon.json文件 – 我离开了现有的docker.json文件。

默认情况下,出于安全原因,docker守护进程不会暴露给外部世界。 当用-H标志启动docker守护进程时,你当然可以改变这个设置。

要testing它,您可以简单地手动启动守护程序(请务必在之前停止服务)。 假设1.2.3.4是运行守护程序的主机的IP地址。

 <path to>/dockerd -H tcp://1.2.3.4:2375 

或者将其绑定到所有networking接口:

 <path to>/dockerd -H tcp://0.0.0.0:2375 

您可以在此处提供多个-H选项,以便在绑定到tcp套接字时不禁用unix套接字。 有关守护进程绑定选项的详细信息,请参阅文档(将Docker绑定到另一个主机/端口或Unix套接字) 。

要持久保存这个,你可以在daemon.json文件中configuration守护进程的启动设置,你也可以指定一个主机数组。 请参阅文档(configurationDocker守护程序)和Linuxconfiguration文件 。

 { "hosts": [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ] } 

您可以提供hosts条目列表,以便守护进程可以同时侦听tcp和unix套接字。

请注意,通过绑定到tcp 0.0.0.0,任何能够连接到你的机器的人都可以远程启动容器,因此几乎可以在你的系统上执行任何操作,比如使用非常糟糕的root用户密码。 你只能做这个testing或在一个孤立/防火墙正确的环境。

安德烈亚斯的回答帮助我意识到守护进程没有正常运行。 在本文前面的屏幕截图中,docker守护进程没有使用右侧的-H选项启动。 然后我发现这个Github问题解决了这个问题。 所以所需要的只是:

  • 编辑/ etc / default / docker中的$ DOCKER_OPTSvariables: DOCKER_OPTS="-H tcp://0.0.0.0:2375" (注意这不是很安全,只是为了testing)
  • 编辑/lib/systemd/system/docker.service文件,方法是在[Service]为EnvironmentFile添加一行: EnvironmentFile=-/etc/default/docker docker,然后更新ExecStart行: ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
  • 重新启动服务sudo service docker restart

请注意,我没有添加daemon.json文件 – 我离开了现有的docker.json文件。