Docker镜像之间的networking通信

我有2个应用程序:

  • 服务器绑定在127.0.0.1:5150
  • 连接到127.0.0.1:5150的客户端

每个应用程序都装在一个Docker镜像中。 在我使用的服务器Dockerfile中:

... EXPOSE 5150 ... 

我无法从客户端连接到服务器:

 $ docker run --rm -it --name server my-registry.com/server:0.0.1 $ docker run --rm -it --name client --link server:chat my-registry.com/client:0.0.1 

我拒绝了连接。

另外telnet:

 $ docker run --rm -it --name client --link server:chat --entrypoint=/bin/bash my-registry.com/client:0.0.1 root@f384b008ce68:/# env | grep CHAT_PORT CHAT_PORT_5150_TCP_ADDR=172.17.0.54 CHAT_PORT_5150_TCP_PROTO=tcp CHAT_PORT_5150_TCP=tcp://172.17.0.54:5150 CHAT_PORT_5150_TCP_PORT=5150 CHAT_PORT=tcp://172.17.0.54:5150 root@f384b008ce68:/# telnet $CHAT_PORT_5150_TCP_ADDR $CHAT_PORT_5150_TCP_PORT Trying 172.17.0.54... telnet: Unable to connect to remote host: Connection refused 

任何想法我做错了什么?

每个Docker容器都在一个单独的“networking名称空间”中运行。 这意味着(一)每个容器有自己的IP地址和(二) localhost意思是“这个容器”,并没有任何与localhost在另一个容器。

如果您希望您的服务可以从另一个容器访问,则需要将其configuration为绑定到本地主机,然后使用以下命令访问它们:

  • 容器IP,或
  • 容器名称,当使用 – --link
  • 某种服务发现机制,或者
  • 发布主机上的端口并通过主机IP访问它们

请注意, EXPOSE目录基本上是没有操作的; 在同一主机上运行的容器默认情况下具有不受限制的访问权限。 使用EXPOSE在使用EXPOSE可以帮助您发现服务,因为它会导致在链接的容器中填充有关可用服务的信息的环境variables。

了解更多信息: