将端口暴露给所有容器,而不仅仅是主机

我可以ping主机上的Docker容器中运行的InfluxDB ,主机上暴露一个端口:

 » curl -k -L -I https://localhost:8086/ping HTTP/1.1 204 No Content Content-Type: application/json Request-Id: 2bb1059b-360e-11e7-8001-000000000000 X-Influxdb-Version: 1.2.0 Date: Thu, 11 May 2017 05:53:34 GMT 

我运行一个Ubuntu 16.04泊坞窗容器(安装了curl),连接到与InfluxDB容器相同的networking,并且我无法ping通localhost:8086 。 最后我发现我需要使用InfluxDB容器的IP地址进行ping操作:

 root@4a5457a5e297:/# curl -k -sL -I https://172.18.0.1:8086/ping HTTP/1.1 204 No Content Content-Type: application/json Request-Id: d8ab4282-360e-11e7-8002-000000000000 X-Influxdb-Version: 1.2.0 Date: Thu, 11 May 2017 05:58:25 GMT 

这意味着首先我需要找出InfluxDB容器的IP地址。 我只是猜测,因为我不能在InfluxDB容器中做ifconfig ,我不知道如何列出所有正在运行的容器的IP: docker ps不显示它。

因此, InfluxDB的端口以localhost:8086forms暴露在主机中,但不会暴露给其他容器。 一些问题:

  1. 有没有可能通过名称来处理容器? docker工人是否自动将DNS条目分配给容器,并且可以通过容器来解决这些条目? 从主机内? 什么是命名scheme?
  2. 是否有可能将一个容器的端口不仅暴露给主机,还暴露给所有其他容器(运行在同一个networking中),以便我可以从任何容器ping localhost:8086
  3. 如何获得所有正在运行的容器的IP列表?

我运行一个Ubuntu 16.04泊坞窗容器(安装了curl),连接到与InfluxDB容器相同的networking,并且我无法ping通localhost:8086。 最后我发现我需要使用InfluxDB容器的IP地址进行ping操作:

当向同一networking上的其他容器“讲话”时,请使用容器名称。 你可以用--name influxdb来强制执行

那么你可以从同一个networking使用curl http://influxdb:8086

1.集装箱通信

正如Rawkode所说,这是可能的。 但出于某种原因,我不能使用默认桥接networking。

 $ docker run -itd --rm --name test1 alpine /bin/sh 726cd933446df40e78e760d86256e11b1e786d83057a9d075c05c4d38240656c $ docker run -itd --rm --name test2 alpine /bin/sh c6837529c37f486edbc3a7743a6b127b9bdaae8a619564368697137fd8ae5622 $ docker container exec test1 ping test2 ping: bad address 'test2' $ docker container exec test2 ping test1 ping: bad address 'test1' $ docker container stop test1 test1 $ docker container stop test2 test2 

创build一个testingnetworking将工作:

 $ docker network create testnet ca1db96c3a533033c68d8885fac2f354919edc810e0f376f06f86e45d3050b35 $ docker run -itd --rm --name test1 --network testnet alpine /bin/sh 187f2c8534504e6a8db96c0a731c735976b19b0a710e162f3537b2f5f16d7b05 $ docker run -itd --rm --name test2 --network testnet alpine /bin/sh 7efd386c13962a56dc074903373848174fb5cdb649038a6e67fbb2f0f8bde74b $ docker container exec test1 ping test2 PING test2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.076 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.165 ms 64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.159 ms 64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.077 ms ^C $ docker container exec test2 ping test1 PING test1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.063 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.235 ms 64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.218 ms 64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.099 ms ^C $ 

2。

容器可以直接通信,你不必使用localhost。 看看如何公开端口

基本上,你有三个select:

  • 既不指定EXPOSE也不指定-p。
  • 只指定EXPOSE。
  • 指定EXPOSE和-p。

如果您不指定其中的任何一项,则容器中的服务将无法从容器内部的任何地方访问。

如果你EXPOSE一个端口,容器中的服务不能从外部的Docker访问,而是从其他的Docker容器中访问。 所以这对于集装箱间通信是有利的。

如果您使用EXPOSE和-pa端口,则可以从任何地方访问容器中的服务,即使在Docker之外也是如此。

在这里find: https : //stackoverflow.com/a/22150099/1561148

3.检查networking

 $ docker network inspect testnet | grep IPv4 "IPv4Address": "172.18.0.2/16", "IPv4Address": "172.18.0.3/16", 
    Interesting Posts