一、概述
Docker网络模型是指Docker容器在网络中的通信方式和组织结构。Docker容器通过网络连接,使得容器之间可以相互通信,并与主机和外部网络进行交互。
在Docker中,有几种不同的网络模型可供选择:
1、主机模式(Host mode):容器与主机共享网络命名空间,容器中的网络直接映射到主机网络上。这意味着容器可以使用主机上的网络配置,并且容器中的服务可以通过主机的IP地址和端口进行访问。
2、桥接模式(Bridge mode):Docker会创建一个虚拟的网络桥接接口,称为docker0,容器加入这个桥接接口后,可以通过桥接接口与其他容器和宿主机进行通信。每个容器都分配一个唯一的IP地址,并且可以使用Docker提供的DNS服务进行容器之间的域名解析。
3、Overlay模式(Overlay mode):用于在多个主机上创建一个覆盖网络,允许分布式容器在不同的主机上进行通信。此模式使用虚拟的网络隧道和路由来连接不同的主机上的容器,并提供透明的跨主机通信。
4、MacVLAN模式(MacVLAN mode):此模式允许将容器直接连接到物理网络上,每个容器会分配一个唯一的MAC地址,并与主机网络共享IP地址。这样容器就可以像主机上的其他设备一样与网络进行交互。
5、None模式(None mode):在此模式下,容器不会与任何网络进行连接,完全与外部网络隔离。
这些网络模型可以根据应用场景和要求选择合适的模式来配置Docker容器的网络连接。
二、网络模型
1、主机模式(Host mode)
Docker底层使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptables规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Root Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。出于安全考虑不推荐使用这种网络模式。
我们在192.168.77.123/24的机器上用Host模式启动一个含有WEB应用的Docker容器,监听TCP 80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.200.111:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
docker run -itd --net=host --name=host busybox
docker exec -it host ifconfig
可以看到容器和宿主机的IP是一样的
2、container模式
这个模式可以指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
使用--net=container:container_id/container_name,多个容器使用共同的网络看到的ip是一样的。
docker run -itd --name=con1 busybox
docker exec -it con1 ifconfig
docker run -itd --net=container:con1 --name=con2 busybox
docker exec -it con2 ifconfig
可以看到两个容器的IP是一样的
3、none模式
在这种模式下,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
使用--net=none指定,这种模式下不会配置任何网络。
docker run -itd --name=none --net=none busybox
docker exec -it none ifconfig
4、bridge模式
bridge模式是Docker默认的网络设置,属于一种NAT网络模型,Docker daemon在启动的时候就会建立一个docker0网桥(通过-b参数可以指定),每个容器使用bridge模式启动时,Docker都会为容器创建一对虚拟网络接口(veth pair)设备,这对接口一端在容器的Network Namespace,另一端在docker0,这样就实现了容器与宿主机之间的通信。