两个容器之间使用另一个容器进行通信

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

好的,如果这是用于模型和测试,让我们列出您可能需要检查的操作:

  1. 您需要确保 router 设置为在两个虚拟网络之间路由 IP 数据包。
  2. 您需要在网络创建期间对 IP 子网进行硬编码。
  3. 您需要在 router 创建过程中对路由进行硬编码。
  4. 因为 clientserver 的默认网关不是 router 容器,您需要手动向这些容器添加路由,以了解它们需要通过路由器互相交谈。
  5. 如果您想按名称寻址,您需要手动编辑 clientserver 中的主机文件。
  6. 您需要手动识别每个容器的 IP 才能使上述 DNS 正常工作。

我可能忘记了更多步骤...