Docker的那些事儿—bridge网络(22)
上一篇:Docker的那些事儿—none和host网络(21)
桥接网络,顾名思义就是在容器和宿主机间搭建一座桥,实现容器与宿主机可以相互访问。
你可能发现,当安装了docker后,宿主机上多了一个叫做docker0的网卡。使用ip a或者ifconfig查询。
![](https://img.haomeiwen.com/i10839544/319e646531ad0611.png)
实际上,这个docker0网络就是这里的bridge网络创建的网卡。我们使用:docker network inspect
bridge查询该bridge网络的具体信息:
![](https://img.haomeiwen.com/i10839544/0d898c2e04e1f90e.png)
该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
![](https://img.haomeiwen.com/i10839544/8e7fd2475c3e7b73.png)
我们再次查询该bridge网络信息,发现Container字段多了一些信息,这些就是该网络为该mysql1容器分配的网络信息。
![](https://img.haomeiwen.com/i10839544/3fb8316aa21f4b21.png)
我们进入容器进一步观察:
![](https://img.haomeiwen.com/i10839544/0b138301911656a1.png)
容器内的eth0实际上是veth
pair的一端,另一端(veth2cc3a05)连在docker0网桥上。eth0@if7中的@if7代表该网卡与宿主机上编号为7的网卡是一对。veth2cc3a05@if6的@if6也是同样的道理。
![](https://img.haomeiwen.com/i10839544/087c3cb73e381606.png)
bridge网络连接如下:
![](https://img.haomeiwen.com/i10839544/3168d3cb771fc0d2.png)
尝试宿主机与容器间ping
![](https://img.haomeiwen.com/i10839544/685dcdc62d7df33a.png)
![](https://img.haomeiwen.com/i10839544/2ac1fde37ec8a906.png)
实际上,bridge网络是docker
run时默认使用的网络,当不使用--network可选项时,也是使用的bridge的网络。
![](https://img.haomeiwen.com/i10839544/fcaade6991081831.png)
![](https://img.haomeiwen.com/i10839544/353e1327deba8593.png)
mysql1和mysql2容器分配的ip分别为172.17.0.2和172.17.0.3
![](https://img.haomeiwen.com/i10839544/84c2b5e5cd7b0bb9.png)
![](https://img.haomeiwen.com/i10839544/4dff40742da6a3ce.png)
该bridge网络下的两个容器间可以相互访问。
用如下图,描绘上述网络拓扑:
![](https://img.haomeiwen.com/i10839544/7915ca7459cba874.png)
总结如下:
1、 bridge网络下,容器与宿主机间可以相互访问。
2、 同一bridge网络下的容器间可以相互访问。
所以,Docker完成以上网络配置的过程大致是这样的:
1、在宿主机上创建一对虚拟网卡veth pair设备。
2、Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
3、从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
![](https://img.haomeiwen.com/i10839544/2e4c371e2e574077.png)