Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker 0,它在内核层连通了其他的物理或虚拟网卡,这就是将容器和本地主机都放在同一个物理网络,Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
在组网方面,网桥网络是一种链路层设备,用于转发网段之间的流量。网桥可以是在主机内核中运行的硬件设备或软件设备。在Docker方面,网桥网络使用软件网桥,允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络的容器的隔离。Docker Bridge驱动程序自动在主机中安装规则,使不同网桥网络上的容器无法直接通信。网桥网络适用于运行在同一个Docker守护进程主机上的容器。对于运行在不同Docker守护进程主机上的容器之间的通信,可以在操作系统级别管理路由,也可以使用覆盖网络。启动Docker时,将自动创建默认网桥网络(也称为网桥),除非另有指定,否则新启动的容器将连接到该网络。还可以创建用户定义的自定义网桥网络。用户定义的网桥网络优于默认的网桥网络。
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥,Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP进行通信了。在执行docker run命令时,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机上使用ifconfig,就可以看到docker0和自己create的network eth0、eth1、eth2,代表网卡1、网卡2…,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址。
网桥docker0创建一对对虚拟设备接口叫做veth,另一个叫eth0,成对匹配:
- 整个宿主机的网桥模式都是docker0,类似交换机有一个接口,每个接口叫做veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做veth pair)
- 每个容器实例内部也有一张网卡,每个接口就走eth0
- docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配
所以,将宿主机上的所有容器都链接到这个内部网络上,两个容器在同一个网络下,就从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。