上一篇:Docker的那些事儿—none和host网络(21)
桥接网络,顾名思义就是在容器和宿主机间搭建一座桥,实现容器与宿主机可以相互访问。
你可能发现,当安装了docker后,宿主机上多了一个叫做docker0的网卡。使用ip a或者ifconfig查询。
实际上,这个docker0网络就是这里的bridge网络创建的网卡。我们使用:docker network inspect
bridge查询该bridge网络的具体信息:
该bridge网络所属子网为172.17.0.0/16,网关为172.17.0.1(这其实就是docker0的ip)。子网掩码为16保证了可以创建足够多的容器。当创建并启动一个容器时,docker会根据使用的网络为容器分配一个可用的IP。docker run时可以使用--network指定使用的网络,例如:docker run -itd --name mysql1 --network=bridge mysql /bin/bash
我们再次查询该bridge网络信息,发现Container字段多了一些信息,这些就是该网络为该mysql1容器分配的网络信息。
我们进入容器进一步观察:
容器内的eth0实际上是veth
pair的一端,另一端(veth2cc3a05)连在docker0网桥上。eth0@if7中的@if7代表该网卡与宿主机上编号为7的网卡是一对。veth2cc3a05@if6的@if6也是同样的道理。
bridge网络连接如下:
尝试宿主机与容器间ping
实际上,bridge网络是docker
run时默认使用的网络,当不使用--network可选项时,也是使用的bridge的网络。
mysql1和mysql2容器分配的ip分别为172.17.0.2和172.17.0.3
该bridge网络下的两个容器间可以相互访问。
用如下图,描绘上述网络拓扑:
总结如下:
1、 bridge网络下,容器与宿主机间可以相互访问。
2、 同一bridge网络下的容器间可以相互访问。
所以,Docker完成以上网络配置的过程大致是这样的:
1、在宿主机上创建一对虚拟网卡veth pair设备。
2、Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
3、从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。