docker同机器不同network通讯

/ docker / 没有评论 / 368浏览

docker同机器不同network通讯

在Docker中,如果你想让位于同一台机器上但属于不同Docker网络的容器能够通讯,你需要确保网络之间能够互相访问。Docker提供了默认的bridge网络,但如果你创建了额外的网络,容器之间默认不能直接通讯,除非你显式地配置它们。

以下是一个简单的示例,演示如何设置两个容器在同一台机器上通过不同的Docker网络进行通讯:

  1. 创建两个Docker网络:
docker network create --driver bridge my_network1
docker network create --driver bridge my_network2
  1. 启动两个运行在不同网络的容器:
docker run --network my_network1 -d --name container1 busybox /bin/sh -c "while true; do sleep 3600; done"
docker run --network my_network2 -d --name container2 busybox /bin/sh -c "while true; do sleep 3600; done"
  1. 使用docker exec进入其中一个容器,并尝试ping另一个容器:
docker exec -it container1 sh
/ # ping container2

如果你按照上面的步骤操作,你会发现无法ping通另一个容器,因为它们位于不同的Docker网络中。为了让它们可以通讯,你需要在网络之间添加路由规则或者使用用户定义的桥接网络。

  1. 为容器配置静态路由(不推荐,不同网络间通常应通过网络设计或服务发现机制进行通信):

在一个网络中的容器执行以下命令,添加到另一网络的静态路由:

/ # route add -net 172.20.0.0 netmask 255.255.0.0 gw <另一网络容器的IP>

请注意,上述命令中的172.20.0.0/16是Docker默认分配的网段,如果你的网络配置与此不同,需要相应地修改。

  1. 使用桥接网络,确保容器能够在同一台机器上的不同网络间通讯:
docker network connect bridge container2

这样,container2将能够通过bridge网络访问container1,因为Docker的bridge网络是所有容器默认连接的。

总结,要使同一台机器上的不同Docker网络中的容器能够通讯,你需要确保网络之间互相可达,或者将容器配置到共享的网络(如bridge网络)中。