理解容器之间的连通性 – 每天5分钟玩转 Docker 容器技术(34)

通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性。

网络拓扑结构图

两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下

互通验证

可见同一网络中的容器、网关之间都是可以通信的。

my_net2 与默认 bridge 网络能通信吗?

从拓扑图可知,两个网络属于不同的网桥,应该不能通信。

我们通过实验验证一下,让 busybox 容器 ping httpd 容器

busybox 容器 ping httpd 容器

确实 ping 不通,符合预期。

“等等!不同的网络如果加上路由应该就可以通信了吧?”我已经听到有读者在建议了。

这是一个非常非常好的想法。

确实,如果 host 上对每个网络的都有一条路由,同时操作系统上打开了 ip forwarding,host 就成了一个路由器,挂接在不同网桥上的网络就能够相互通信。

  下面我们来看看 docker host 满不满足这些条件呢?  

ip r 查看 host 上的路由表

# ip r

......
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1
172.22.16.0/24 dev br-5d863e9f78b6  proto kernel  scope link  src 172.22.16.1
......

172.17.0.0/16 和 172.22.16.0/24 两个网络的路由都定义好了。

再看看 ip forwarding

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

ip forwarding 也已经启用了。

条件都满足,为什么不能通行呢?

我们还得看看 iptables

# iptables-save

......
-A DOCKER-ISOLATION -i br-5d863e9f78b6 -o docker0 -j DROP
-A DOCKER-ISOLATION -i docker0 -o br-5d863e9f78b6 -j DROP
......

原因就在这里了:iptables DROP 掉了网桥 docker0 与 br-5d863e9f78b6 之间双向的流量。

从规则的命名 DOCKER-ISOLATION 可知 docker 在设计上就是要隔离不同的 netwrok。

那么接下来的问题是:怎样才能让 busybox 与 httpd 通信呢?
答案是:为 httpd 容器添加一块 net_my2 的网卡。这个可以通过docker network connect 命令实现。 

docker network connect

我们在 httpd 容器中查看一下网络配置

网络配置

容器中增加了一个网卡 eth1,分配了 my_net2 的 IP 172.22.16.3。

现在 busybox 应该能够访问 httpd 了,验证一下

访问 httpd

busybox 能够 ping 到 httpd,并且可以访问 httpd 的 web 服务。

当前网络结构如图所示

网络结构图

下一节我们讨论容器间通信的三种方式。


本文转载,原文出自:理解容器之间的连通性 – 每天5分钟玩转 Docker 容器技术(34)
作者:CloudMan

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/docker-5min-34.html

Leave a Comment