当前位置: 首页 > 知识库问答 >
问题:

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

江奕
2023-03-14

我按照官方指示在Ubuntu 16.04上安装了docker,并成功地将注册表作为容器运行。我想远程连接到另一个容器,所以我尝试:

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

我得到一个错误:

连接过程中出错:Posthttp://1.2.3.4:2375/v1.29/containers/19f36d1bdfaf/exec: 拨打tcp 1.2.3.4:2375:connectex:无法建立连接,因为目标计算机主动拒绝连接。

为什么会出现此错误,如何解决?

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

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

更新:

通过创建daemon.json文件(docker.json的副本),然后运行:

sudo dockerd

问题是,现在客户端无法工作:docker info导致错误:

无法连接到位于的Docker守护程序unix:///var/run/docker.sock. docker守护进程正在运行吗?

更新和解决方案:Andreas的回答帮助我意识到守护进程没有正常运行。查看本文前面的屏幕截图,docker守护进程没有使用right-H选项启动。然后我发现这个Github问题解决了这个问题。因此,所需要的只是:

  • 编辑/etc/default/DOCKER:DOCKER_OPTS=“-H”中的$DOCKER_OPTS变量tcp://0.0.0.0:2375“(注意这不是很安全,只是为了测试)
  • 编辑/lib/systemd/system/docker.service文件,方法是在环境文件的[service]下添加一行:EnvironmentFile=-/etc/default/docker然后更新ExecStart行:ExecStart=/usr/bin/dockerd$docker\u OPTS-H fd://
  • 重新启动服务sudo服务docker Restart
  • 使用systemctl守护程序重新加载重新启动守护程序

注意,我没有添加daemon.json文件——我保留了现有的docker.json文件。

共有2个答案

朱慈
2023-03-14

Andreas的回答帮助我意识到守护进程没有正常运行。查看本文前面的屏幕截图,docker守护进程没有使用right-H选项启动。然后我发现这个Github问题解决了这个问题。因此,所需要的只是:

  • 编辑/etc/default/DOCKER:DOCKER_OPTS=“-H”中的$DOCKER_OPTS变量tcp://0.0.0.0:2375“(注意这不是很安全,只是为了测试)

注意,我没有添加daemon.json文件——我保留了现有的docker.json文件。

韩楷
2023-03-14

默认情况下,出于安全原因,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套接字。有关守护进程绑定选项的详细信息,请参阅文档(将Docker绑定到其他主机/端口或Unix套接字)。

要永久地实现这一点,您可以在daemon.json文件中配置守护程序启动设置,在该文件中还可以指定主机数组。请参阅文档(配置Docker守护进程)和Linux配置文件。

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

您可以为主机提供一个条目列表,以便您的守护进程可以同时侦听tcp和unix套接字。

请注意,只要绑定到tcp 0.0.0.0,任何能够访问您的计算机的人都可以远程启动容器,因此几乎可以在您的系统上执行任何操作,例如使用非常糟糕的root用户密码。您应该仅在测试或在正确隔离/防火墙的环境中执行此操作。

 类似资料:
  • 机器A和B之间的通信工作良好。我可以运行像或这样的命令,它会给出预期的结果: 我听说过,但还没有尝试过,但据我所知,这并不能解决我的问题。 有什么方法可以直接使用来实现这一点。解决办法可能是使用连接到远程主机,并直接从远程主机使用客户机,但我希望尽可能避免这种解决方案。 在上运行,而不是在本地计算机上运行。

  • 我正在尝试使用JProfiler分析远程主机/服务器上的Web应用程序,但该过程似乎比我想象的要复杂。 我已经设法在我的开发工作副本上本地评测了,但结果在那里没有用处。 有没有一种方法可以将JProfiler连接到该服务器,而无需将其安装在远程机器/服务器上,因为这不是我拥有的选项。类似于远程调试,我在其中配置主机和端口并连接。 提前感谢!

  • 请帮助我如何将JProfiler从windows机器连接到运行在linux服务器上的远程Virgo Jetty服务器。 以下是我遵循的步骤 从选择集成向导中选择Eclipse Virgo(下一个) 在这里,我们没有在linux远程环境中安装JProfiler,但我们在那里运行了服务器。我看到了这样的选项:若并没有安装JProfiler,你们可以创建归档文件,其中包含分析代理并将其提取到上面的目录中

  • 问题内容: 是否可以(直接使用命令或API)从远程主机启动容器? 假设我有两台具有不同体系结构的机器:-A是一台机器-B是一台机器 我想使用我的A机器在B机器上运行一个容器。起初,我认为可以使用以下命令: 但这个命令实际上拉图像,并试图在其中一些最终的机器运行它的原因很明显,你不能运行的图像所特有的一种机器。 机器A和B之间的通信正常。我可以运行诸如或的命令,它可以给我预期的结果: 我听说过并且还

  • 使用VisualVM,我可以看到两种类型来连接远程主机。 > jstatd 所以我正在尝试使用JMX,我学习了很多教程,但到目前为止还没有成功。 目前,有我的桌面和一个运行java服务器应用程序的linux盒子。我正在尝试在桌面上设置VisualVM客户端,以查看在linux Box上运行的java应用程序。 我为Linux上的java应用程序在start.sh脚本上添加了以下JAVA_OPTS脚

  • 我对JavaEE非常陌生,尝试运行一个小的EJB示例,但远程JNDI查找总是失败。 到目前为止,我做了什么? 我使用Eclipse for JavaEE,在Marketplace上安装了JBossTools并创建了一个JBoss EAP 7. x运行时服务器(我在安装过程中下载了一个7.1运行时)。 我写了一些Bean,将它们部署在服务器上并启动它。 我用JNDI-Lookup编写了一些客户端代码