Docker虚拟化技术底层是基于LXC+Cgroups+AUFS(Overlay)技术实现,而我们有熟知Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(Process Groups)所使用的物理资源的机制。
Docker虚拟化的产物是Docker容器,基于Docker Engine启动容器时,默认会给容器指定和分配各种子系统:CPU子系统,、Memory子系统、IO子系统、NET子系统等。
启动一个容器,会分配Network Namespace(子系统)提供了一份独立的网络环境,包括网卡、路由、Iptables规则等,容器跟其他容器的Network Namespace是相互隔离的。
通过Docker run创建Docker容器时,可以使用–net选项指定Docker容器的网络模式,Docker默认有四种网络模式:
- host模式,使用–net=host指定;
- container模式,使用–net=container:NAME_or_ID指定;
- none模式,使用–net=none指定;
- bridge模式,使用–net=bridge指定,默认设置。
- Host模式剖析
通常来讲,启动新的Docker容器,都会分配独立的Network Namespace隔离子系统,如果在运行是指定为host模式,那么Docker容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace子系统。
新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和宿主机共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。 - Container模式剖析
Docker容器网络,Container模式是指定新创建的容器和已存在的某个容器共享一个Network Namespace子系统,而不是和宿主机共享Namespace子系统。
新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和指定的Docker容器共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。如果依附的Docker容器关闭,新的Docker容器网络也会丢失。 - None模式剖析
None模式与其他的模式都不同,如果Docker容器使用None模式,Docker容器会拥有自己的Network Namespace子系统,但是Docker引擎并不会为新启动的Docker容器配置任何的网络信息。
即新创建的Docker容器不会虚拟出自己的网卡、IP、网关、路由等信息,而是需要手工为Docker容器添加网卡、配置IP、路由等信息,在企业实战环境中,通常会使用Pipework工具为Docker容器指定IP等信息。 - Bridge桥接剖析
Docker容器的Bridge模式也是Docker默认的网络模式,该模式会为每个容器分配Network Namespace子系统,会自动给每个容器虚拟出自己的网卡、IP、网关、路由等信息,无需手工添加。
默认创建的Docker容器会统一通过一对veth虚拟网卡,连接到一个虚拟网桥交换机Docker0上,所有的容器的网络加入到一个二层交换机网络里面,即同一宿主机的所有容器之间都是可以相互联通和访问的。 - Bridge模式原理剖析
默认Docker引擎启动会在本地生成一个Docker0虚拟网卡。Docker0是一个标准Linux虚拟网桥设备。在Docker默认的桥接网络工作模式中,docker0网桥起到了至关重要的作用。物理网桥是标准的二层网络设备,标准物理网桥只有两个网口,可以将两个物理网络连接在一起。
但与物理层设备集线器等相比,网桥具备隔离冲突域的功能。网桥通过MAC地址学习和泛洪的方式实现二层相对高效的通信。随着技术的发展,标准网桥设备已经基本被淘汰了,替代网桥的是二层交换机。二层交换机也可以看成一个多口网桥。
查看网络模式
docker network ls
docker network inspect hos
netstat -tunlp