0

我是 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 进入该端口telnet localhost 5672并立即连接。

我在这里想念什么?

4

1 回答 1

1

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

来自官方 docker 文档

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

稍后在rabbitmq hub 中有一个管理插件的引用,该插件通过执行命令来运行

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

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

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

于 2018-06-25T13:07:54.303 回答