【问题标题】:Docker - connecting to an open port in a containerDocker - 连接到容器中的开放端口
【发布时间】:2018-06-25 21:07:54
【问题描述】:

我是 docker 新手,也许这是我还不完全理解的东西,但我正在尝试做的是连接到正在运行的 docker 容器中的一个开放端口。我已经从集线器 (https://hub.docker.com/_/rabbitmq/) 拉出并运行 rabbitmq 容器。 rabbitmq 容器应该使用端口 5672 供客户端连接。

运行容器后(按照中心页面的说明):

$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3

现在我想做的是 telnet 进入打开的帖子(在常规的 rabbitmq 安装上是可能的,也应该在容器上)。

我已经(至少我认为我做到了)使用以下命令获取了容器 IP 地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

我得到的结果是172.17.0.2。当我尝试使用telnet 172.17.0.2 5672 访问时,它不成功。

地址172.17.0.2 对我来说似乎很奇怪,因为如果我在我的机器上运行ipconfig,我看不到任何使用172.17.0.x 地址的接口。我确实看到 Ethernet adapter vEthernet (DockerNAT) 使用以下 ip:10.0.75.1。这是应该的吗?

如果我进行端口绑定(添加-p 5672:5672),那么我可以使用telnet localhost 5672 远程登录到此端口并立即连接。

我在这里错过了什么?

【问题讨论】:

  • 你在什么操作系统上运行 Docker?
  • @larsks Windows 10

标签: docker docker-container docker-networking docker-network


【解决方案1】:

正如您所指出的,您需要端口绑定才能获得所需的结果,因为您正在默认桥接网络上运行应用程序(我猜是在 Windows 上)。

来自official docker doc

连接到同一个用户定义的桥接网络的容器会自动将所有端口相互公开,并且不对外公开任何端口。 [...] 如果您在默认桥接网络上运行相同的应用程序堆栈,则需要同时打开 Web 端口和数据库端口,对每个端口使用 -p 或 --publish 标志。这意味着 Docker 主机需要通过其他方式阻止对数据库端口的访问。

稍后在rabbitmq 集线器中有一个对通过执行命令运行的管理插件的引用

docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management

这暴露了用于管理的端口 8080,我认为这是您可能需要的。 您还应该注意到他们在那里谈论集群和节点,也许他们的意思是容器作为一个服务运行在一个集群中(因此使用覆盖网络而不是桥接网络)。

希望我能以某种方式提供帮助:)

【讨论】:

  • 谢谢。那是我认为我必须做的。我想我可能还缺少其他东西,或者是在容器本身上打开端口的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多