Linux 将端口公开给所有容器,而不仅仅是主机

Linux 将端口公开给所有容器,而不仅仅是主机,linux,networking,docker,influxdb,Linux,Networking,Docker,Influxdb,我可以从主机pingInfluxDB在docker容器内运行,主机中有一个暴露的端口: » 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

我可以从主机ping
InfluxDB
在docker容器内运行,主机中有一个暴露的端口:

» 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
我运行了一个
ubuntu16.04
docker容器(安装了curl),连接到与
InfluxDB
容器相同的网络,但我无法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
这意味着首先我需要找出XDB容器的IP地址。我只是猜测,因为我无法在
InfluxDB
容器中执行
ifconfig
,并且我不知道如何列出所有正在运行的容器的IP:
docker ps
不显示它

因此,
InfluxDB
的端口在主机中作为
localhost:8086
公开,但它不公开给其他容器。一些问题:

  • 是否可以按名称对容器进行寻址?docker是否会自动将DNS条目分配给容器,这些条目是否可以通过使用容器来解决?从主机内部?命名方案是什么
  • 是否可以将一个容器中的端口不仅公开给主机,还公开给所有其他容器(在同一网络中运行),以便我可以从任何容器ping
    localhost:8086
  • 如何获取所有正在运行的容器的IP列表
  • 我运行一个Ubuntu 16.04 docker容器(安装了curl), 连接到与XDB容器相同的网络,而我不是 能够ping localhost:8086。最后我发现我需要打乒乓球 使用XDB容器的IP地址:

    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
    
    与同一网络上的其他容器“对话”时,请使用容器名称。您可以使用
    --name influxdb

    然后,您将能够从同一网络使用
    curlhttp://influxdb:8086

    我运行一个Ubuntu 16.04 docker容器(安装了curl), 连接到与XDB容器相同的网络,而我不是 能够ping localhost:8086。最后我发现我需要打乒乓球 使用XDB容器的IP地址:

    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
    
    与同一网络上的其他容器“对话”时,请使用容器名称。您可以使用
    --name influxdb

    然后,您将能够从同一网络使用
    curlhttp://influxdb:8086

    1。集装箱通信 如前所述,这是可能的。但由于某些原因,我无法使用默认的网桥网络实现这一点

    $ 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
    
    创建测试网络将起作用:

    $ 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。看看如何公开端口

    基本上,您有三种选择:

    • 既不指定EXPOSE也不指定-p
    • 仅指定暴露
    • 指定EXPOSE和-p
    如果未指定其中任何一项,则除了从容器本身内部之外,无法从任何位置访问容器中的服务

    如果公开端口,则无法从Docker外部访问容器中的服务,而只能从其他Docker容器内部访问。因此,这有利于容器间的通信

    如果您公开并-p一个端口,那么容器中的服务可以从任何地方访问,甚至在Docker之外

    可在此处找到:

    3.检查网络 1.集装箱通信 如前所述,这是可能的。但由于某些原因,我无法使用默认的网桥网络实现这一点

    $ 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
    
    创建测试网络将起作用:

    $ 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。看看如何公开端口

    基本上,您有三种选择:

    • 既不指定EXPOSE也不指定-p
    • 仅指定暴露
    • 指定EXPOSE和-p
    如果未指定其中任何一项,则除了从容器本身内部之外,无法从任何位置访问容器中的服务

    如果公开端口,则无法从Docker外部访问容器中的服务,而只能从其他Docker容器内部访问。因此,这有利于容器间的通信

    如果您公开并-p一个端口,那么容器中的服务可以从任何地方访问,甚至在Docker之外

    可在此处找到:

    3.检查网络
    是的,我记得这件事,而且很有效。尽管如此,能够将端口公开给其他容器还是很好的,这样相关的服务就可以在
    localhost:port
    中找到。是的,我记得这一点,它可以工作。不过,最好能够将端口公开给其他容器,这样就可以在
    localhost:port
    中找到相关服务。默认网桥不允许在不使用
    --link
    的情况下进行容器名称联网。默认网桥不允许在不使用
    --link
    的情况下进行容器名称联网