Docker镜像之间的网络通信

时间:2015-08-11 21:27:31

标签: docker

我有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

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

每个docker容器都在一个单独的“网络命名空间”中运行。这意味着(a)每个容器都有自己的ip地址,(b)localhost表示“此容器”,并且与其他容器中的localhost没有任何关系。

如果您希望可以从其他容器访问您的服务,则需要将它们配置为绑定到localhost,然后使用以下命令访问它们:

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

请注意,EXPOSE目录基本上是无操作的;默认情况下,在同一主机上运行的容器可以不受限制地相互访问。当您使用EXPOSE时,使用--link确实有助于服务发现,因为它会导致在链接容器中填充环境变量以及有关可用服务的信息。

了解更多信息: