三种内置的网络模式
安装Docker后,Docker会为我们创建三种类型的网络:bridge,host和none。使用docker network ls
命令可以查看。
bridge模式
Docker默认的网络模式,此模式下,容器拥有自己独立的Network Namespace。简单的来说,Docker在宿主机上虚拟了一个子网络,宿主机上的所有容器都从这个子网络获取ip,这个子网络通过网桥挂在宿主机上。Docker通过NAT技术来确保容器可以和宿主机外部网络交互。Docker安装时会在宿主机上新建一个docker0网桥,通过宿主机下运行ip addr show
命令可以查看到此网桥。连接在同一个Docker网桥上的容器可以通过IP相互访问。如此实现了宿主机到容器,容器与容器之间的联通性。除非你使用docker run --network=<NETWORK>
显示的指定了网络,否则Docker默认会指定你的容器使用docker0网络。
bridge 是 docker默认的网络模式,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,是最常用的使用方式。容器从原理上是可以与宿主机乃至外界的其他机器通信的。同一宿主机上,容器之间都是连接到docker0这个网桥上的,它可以作为虚拟交换机使容器可以相互通信。然而,由于宿主机的IP地址与容器veth pair的 IP地址均不在同一个网段,故仅仅依靠veth pair和namespace的技术,还不足以使宿主机以外的网络主动发现容器的存在。为了使外界可以方位容器中的进程,docker采用了端口绑定的方式,也就是通过iptables的NAT,将宿主机上的端口端口流量转发到容器内的端口上。很明显,bridge模式的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,对宿主机端口的管理会是一个比较大的问题。同时,由于容器与外界通信是基于三层上iptables NAT,性能和效率上的损耗是可以预见的。
Veth pair 是一对虚拟网卡,从一张veth网卡发出的数据包可以直接到达它的peer veth,两者之间存在着虚拟链路。
eth0,eth1,eth2……代表网卡一,网卡二,网卡三……
host模式
使用host模式的容器与宿主机共用同一个网络栈,ip和端口。这意味这在容器中暴露的端口可以直接通过宿主机访问。相比于bridge模式,host模式拥有明显的性能优势(走的是宿主机的网络栈,而不是Docker deamon为为容器虚拟的网络栈)。
none模式
none模式下的容器不能访问任何外部路由,只能通过文件IO和标准输入输出交互,或者通过docker attach <CONTAINER>
进入容器进行交互。