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。
了解更多信息: