docker-容器之间连通

当前网络拓扑如下:
avatar

两个挂载在my_net2上的容器走的同一个网关,肯定能通信

网络my_net2 与 默认网桥docker0之间不通,因为:

1
2
3
4
5
6
7
8
9
# 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:

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

ip forwarding 也已经启用了。

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

我们还得看看 iptables:

1
2
3
4
5
6
7
8
# 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 容器(挂载到默认网桥docker0的容器)添加一块 net_my2 的网卡。这个可以通过docker network connect 命令实现。

1
# docker network connect my_net2 2b668e52480e

这样,容器2b668e52480e内部就会多出一块网卡分配了my_net2的ip,就能与my_net2通信了。
前网络结构如图所示:
avatar

转自:容器之间连通