》中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式。为了深入理解 CNM 及最常用的 bridge 驱动,本文将探索 bridge 驱动的实现机制。
docker0 并不是一个简单的网卡设备,而是一个网桥!下图展示了 docker bridge 网络模式的拓扑图:
这里网桥的概念等同于交换机,为连在其上的设备转发数据帧。网桥上的 veth 网卡设备相当于交换机上的端口,可以将多个容器连接在它们上面,这些端口工作在二层,所以是不需要配置 IP 信息的。上图中的 docker0 网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的 docker 容器之间可以相互通信。既然 docker0 是二层设备,那么它为什么还需要 IP 呢?其实,docker0 是一个普通的 linux 网桥,是可以为它配置 IP 的,我们可以认为它的内部有一个可以用于配置 IP 的网卡。Docker0 的 IP 地址作为所连接的容器的默认网关地址!
$ br0 .
-A POSTROUTING -s ./ ! -o docker0 -j MASQUERADE
$ docker run -d -p : --name=myweb ljfpower/nodedemo
$ iptables-*-A DOCKER ! -i docker0 -p tcp -m tcp --dport -j DNAT --to-destination .:*-A DOCKER -d ./ ! -i docker0 -o docker0 -p tcp -m tcp --dport -
$ iptables -I DOCKER -i docker0 ! -s . -j DROP
-A FORWARD -i docker0 -o docker0 -j ACCEPT
$ /proc/sys/net/ipv4/ip_forward
# /dev/mapper/ubuntu--vg-root on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=/dev/mapper/ubuntu--vg-root on /etc/ type ext4 (rw,data=/dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,data=
$ docker run -it --name mycon -h lion --dns=. ubuntu: