Linux 将端口公开给所有容器,而不仅仅是主机
我可以从主机pingLinux 将端口公开给所有容器,而不仅仅是主机,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
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
容器相同的网络,但我无法pinglocalhost: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
公开,但它不公开给其他容器。一些问题:
localhost:8086
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 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
是的,我记得这件事,而且很有效。尽管如此,能够将端口公开给其他容器还是很好的,这样相关的服务就可以在
localhost:port
中找到。是的,我记得这一点,它可以工作。不过,最好能够将端口公开给其他容器,这样就可以在localhost:port
中找到相关服务。默认网桥不允许在不使用--link
的情况下进行容器名称联网。默认网桥不允许在不使用--link
的情况下进行容器名称联网