Docker的几种网络模式详解
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。
namespace概念
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
namespace用途
Linux 内核实现 namespace 的一个主要目的就是实现轻量级虚拟化(容器)服务。在同一个 namespace 下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的。也就是说 linux 内核提供的 namespace 技术为 docker 等容器技术的出现和发展提供了基础条件。
官方文档给出了一下以下五种网络驱动模型,如下:
- bridge:网桥类型网络,类似五大虚拟化网络模型NAT网络,只不过这里叫做bridge网桥类型;
- host:主机类型网络,对应虚拟化网络模型中的桥接网络,这里叫host网络驱动(还有一种container容器网络模型,与host模型类似,不同之处在于它是在容器之间共享网络);
- none:禁用容器网络,即在容器中不启动网络,仅有lo网卡用于本地回环地址通信;
- overlay:叠加网络,借助docker swarm服务实现高级叠加网络模型;
- macvlan:…
一、bridge模式
各个容器之间网络协议栈单独分离。
当Docker启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。
==通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。==Docker 就创建了在主机和所有容器之间一个虚拟共享网络。我们也可以创建自定义bridge以满足个性化的网络需求。
二、host模式
容器与主机使用相同的协议栈,容器可以使用主机所有的网络接口。
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是**和宿主机共用一个Network Namespace。**容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
![截屏2021-01-07 上午11.34.28](https://tva1.sinaimg.cn/large/008eGmZEly1gmez60sdb4j30xa0gcdnm.jpg)
优点 | 缺点 |
---|---|
host 模式简单并且性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致。 | host 不利于网络自定配置和管理,并且所有主机的容器使用相同的IP。也不利于主机资源的利用。对网络性能要求比较高,可以使用该模式。否则应该使用其他模式。 |
区别:虚拟机的host-only模式不能访问外界网络,而docker的host模式可以。
三、container模式
容器之间共享网络协议栈。
Docker网络container模式是指,创建新容器的时候,通过--net container
参数,指定其和已经存在的某个容器共享一个 Network Namespace。
如下图所示,右方黄色新创建的container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。
两个容器之间网络共享,文件系统隔离。
![截屏2021-01-07 下午12.04.34](https://tva1.sinaimg.cn/large/008eGmZEly1gmf01e1mkkj30x20fitgy.jpg)
优点:
这种模式可以节约一定的网络资源,并能降低容器间的通信的难度。container网络模式使多个容器共享网络环境,在这种模式下容器可以通过访问localhost来访问 namespace下的其他容器,网络性能高。
四、none模式
在none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。