两个容器之间使用另一个容器进行通信
communication between two containers using another container
我是 运行 连接到 server_router 网络(网桥网络 driver)的 docker 服务器容器和连接到 client_router 的 docker 客户端容器网络(桥接网络driver)。路由器容器连接到 server_router 和 client_router 网络。
我需要这种网络拓扑,其中服务器和客户端属于不同的 docker 网络并且路由器能够连接服务器和客户端容器(可以路由服务器和客户端流量的实际路由器)。这是网络模拟所必需的,我 运行 在 docker 容器而不是实际计算机上进行模拟。 (正在使用的网络模拟器是使用 Python (TEACUP) 控制的 TCP 实验自动化)。
用于创建设置的命令:
docker network create server_router
docker network create client_router
docker run -itd --net client_router --name client ubuntu:14.04
docker run -itd --net server_router --name server ubuntu:14.04
docker run -itd --net server_router --name router ubuntu:14.04
docker network connect client_router router
docker network inspect client_router
docker network inspect server_router
representation of the network topology
我能够从路由器容器 ping 客户端容器,反之亦然,我也能够从路由器容器 ping 服务器容器,反之亦然(因为它们属于同一个网络)。
但是我无法从客户端容器 ping 服务器容器,反之亦然。
ping 命令没有显示任何结果。
任何建议都会有很大帮助。
这是因为您忘记将 client_router 的网络连接添加到服务器
$ docker network connect client_router server
我能够使用以下命令成功 运行 事情。
$ docker network create server_router
$ docker network create client_router
$ docker run -itd --net client_router -h client --name client ubuntu:xenial
$ docker run -itd --net server_router -h server --name server ubuntu:xenial
$ docker run -itd --net server_router -h router --name router ubuntu:xenial
$ docker network connect client_router router
$ docker network connect client_router server
然后能够从客户端成功 ping 通服务器
viswesn@viswesn:~$ docker exec -it client bash
root@client:/# ping server
PING server (172.22.0.3) 56(84) bytes of data.
64 bytes from server.client_router (172.22.0.3): icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from server.client_router (172.22.0.3): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from server.client_router (172.22.0.3): icmp_seq=3 ttl=64 time=0.052 ms
^C
好的,如果这是用于模型和测试,让我们列出您可能需要检查的操作:
- 您需要确保
router
设置为在两个虚拟网络之间路由 IP 数据包。
- 您需要在网络创建期间对 IP 子网进行硬编码。
- 您需要在
router
创建过程中对路由进行硬编码。
- 因为
client
和 server
的默认网关不是 router
容器,您需要手动向这些容器添加路由,以了解它们需要通过路由器互相交谈。
- 如果您想按名称寻址,您需要手动编辑
client
和 server
中的主机文件。
- 您需要手动识别每个容器的 IP 才能使上述 DNS 正常工作。
我可能忘记了更多步骤...
我是 运行 连接到 server_router 网络(网桥网络 driver)的 docker 服务器容器和连接到 client_router 的 docker 客户端容器网络(桥接网络driver)。路由器容器连接到 server_router 和 client_router 网络。
我需要这种网络拓扑,其中服务器和客户端属于不同的 docker 网络并且路由器能够连接服务器和客户端容器(可以路由服务器和客户端流量的实际路由器)。这是网络模拟所必需的,我 运行 在 docker 容器而不是实际计算机上进行模拟。 (正在使用的网络模拟器是使用 Python (TEACUP) 控制的 TCP 实验自动化)。
用于创建设置的命令:
docker network create server_router
docker network create client_router
docker run -itd --net client_router --name client ubuntu:14.04
docker run -itd --net server_router --name server ubuntu:14.04
docker run -itd --net server_router --name router ubuntu:14.04
docker network connect client_router router
docker network inspect client_router
docker network inspect server_router
representation of the network topology
我能够从路由器容器 ping 客户端容器,反之亦然,我也能够从路由器容器 ping 服务器容器,反之亦然(因为它们属于同一个网络)。 但是我无法从客户端容器 ping 服务器容器,反之亦然。
ping 命令没有显示任何结果。
任何建议都会有很大帮助。
这是因为您忘记将 client_router 的网络连接添加到服务器
$ docker network connect client_router server
我能够使用以下命令成功 运行 事情。
$ docker network create server_router
$ docker network create client_router
$ docker run -itd --net client_router -h client --name client ubuntu:xenial
$ docker run -itd --net server_router -h server --name server ubuntu:xenial
$ docker run -itd --net server_router -h router --name router ubuntu:xenial
$ docker network connect client_router router
$ docker network connect client_router server
然后能够从客户端成功 ping 通服务器
viswesn@viswesn:~$ docker exec -it client bash
root@client:/# ping server
PING server (172.22.0.3) 56(84) bytes of data.
64 bytes from server.client_router (172.22.0.3): icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from server.client_router (172.22.0.3): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from server.client_router (172.22.0.3): icmp_seq=3 ttl=64 time=0.052 ms
^C
好的,如果这是用于模型和测试,让我们列出您可能需要检查的操作:
- 您需要确保
router
设置为在两个虚拟网络之间路由 IP 数据包。 - 您需要在网络创建期间对 IP 子网进行硬编码。
- 您需要在
router
创建过程中对路由进行硬编码。 - 因为
client
和server
的默认网关不是router
容器,您需要手动向这些容器添加路由,以了解它们需要通过路由器互相交谈。 - 如果您想按名称寻址,您需要手动编辑
client
和server
中的主机文件。 - 您需要手动识别每个容器的 IP 才能使上述 DNS 正常工作。
我可能忘记了更多步骤...