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

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

163.png

两个 busybox 容器都挂在 my_net2 上,应该可以互通,咱们验证一下:docker

可见同一网络中的容器、网关之间都是能够通讯的。网络

my_net2 与默认 bridge 网络能通讯吗?ui

从拓扑图可知,两个网络属于不一样的网桥,应该不能通讯,咱们经过实验验证一下,让 busybox 容器 ping httpd 容器:spa

确实 ping 不通,符合预期。操作系统

“等等!不一样的网络若是加上路由应该就能够通讯了吧?”我已经听到有读者在建议了。设计

这是一个很是很是好的想法。code

确实,若是 host 上对每一个网络的都有一条路由,同时操做系统上打开了 ip forwarding,host 就成了一个路由器,挂接在不一样网桥上的网络就可以相互通讯。下面咱们来看看 docker host 满不知足这些条件呢?orm

ip r 查看 host 上的路由表:
ip

# 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 命令实现。

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

容器中增长了一个网卡 eth1,分配了 my_net2 的 IP 172.22.16.3。如今 busybox 应该可以访问 httpd 了,验证一下:

busybox 可以 ping 到 httpd,而且能够访问 httpd 的 web 服务。当前网络结构如图所示:

下一节咱们讨论容器间通讯的三种方式

二维码+指纹.png

相关文章
相关标签/搜索