Hello Docker(四)——Docker网络

Hello Docker(四)——Docker网络

一、Docker Network NameSpace

1、Docker CNM网络模型

Docker通过libnetwork实现CNM网络模型。
Hello Docker(四)——Docker网络
CNM网络模型有三个组件:
(1)Sandbox(沙盒),每个沙盒包含一个容器网络栈(network stack)的配置,配置包括:容器的网口、路由表和DNS设置等。
(2)Endpoint(端点):通过Endpoint,沙盒可以被加入到一个Network里。
(3)Network(网络):一组能相互直接通信的Endpoints。
Docker中Sandbox通过Linux Network Namespace实现;Endpoint通过VETH对实现;Network则可以用Linux Bridge或Vxlan实现。

2、Linux Bridge

Linux Bridge是Linux提供的一种虚拟网络设备之一,其工作方式非常类似于网络交换机设备。Linux Bridge可以工作在二层,也可以工作在三层,默认工作在二层。工作在二层时,可以在同一网络的不同主机间转发以太网报文;一旦为一个Linux Bridge分配IP地址,就开启了Linux Bridge的三层工作模式。

3、VETH

VETH(Virtual Ethernet )是Linux提供的另外一种特殊的网络设备,中文称为虚拟网卡接口。VETH通常成对出现,一个Pair中的VETH就像一个网络线缆的两个端点,数据从一个端点进入,必然从另外一个端点流出。每个VETH都可以被赋予IP地址,并参与三层网络路由过程。

二、Docker网络操作命令

docker network connect [OPTIONS] NETWORK CONTAINER
连接容器到网络
docker network create [OPTIONS] NETWORK
创建一个网络
docker network disconnect [OPTIONS] NETWORK CONTAINER
断开连接到网络的容器
docker network inspect [OPTIONS] NETWORK [NETWORK...]
显示网络的详细信息
docker network ls [OPTIONS]
列出当前Docker网络
docker network prune [OPTIONS]
删除未使用所有Docker网络
docker network rm NETWORK [NETWORK...]
删除Docker网络

三、Docker网络模式

1、Docker网络模式简介

Docker安装时会自动创建bridge、 none 、host三个网络,创建容器时默认连接到bridge网络。不同网络模式指定如下:
host模式:使用--net=host指定。
none模式:使用--net=none指定。
bridge模式:使用--net=bridge指定,默认设置。
container模式:使用--net=container:NAME_or_ID指定。
docker network ls
查看Docker网络

2、bridge模式

bridge模式是Docker 默认的网络模式,如果未指定驱动类型(docker启动时指定特定网络参数),则默认创建使用bridge网络模式,适用于应用程序运行于独立的Docker容器,但容器需要与外部网络或者容器间需要交互,如多个容器在同一个Docker主机上进行通信。
桥接网络是一种链路层设备,在网络段之间转发通信。网桥是运行在主机内核上的一个硬件设备或者软件设备。在Docker中,桥接网络使用软件桥接,连接到同一桥接网络上的容器直接可相互通信,而且是全端口的,而与未连接到桥接网络的容器直接隔离,因此,桥接网络管理同一主机上所有容器的连接与隔离。docker桥接驱动程序自动在主机上安装规则,同一网桥上的网络可相互通信,不同网桥网络容器相互隔离。
桥接网络适用于同一主机docker daemon生成的容器,当启动docker daemon时,默认桥接网络(virbr0)将自动被创建,连接docker daemon与宿主机器,同时创建一个网络docker0,后续创建的容器将自动连接到桥接网络(docker0)上。
网桥virbr0连接docker0与宿主机器,在网桥上创建接口virbr0-nic,用于接收docker0网络的数据。每创建一个容器,在docker0上新建一个接口,并且docker0的地址被设置成容器的网关。
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥。
(1)Docker启动容器时,会在宿主机上创建一对虚拟网卡veth pair设备,组成一个数据通道,数据从一个设备进入,就会从另一个设备出来。
(2)Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0,另一端放在宿主机中,以vethxxxx名字命名,并将veth网络设备加入到docker0网桥中。
(3)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
Hello Docker(四)——Docker网络
Docker默认内置了bridge network,即docker0接口的network,所有未指定network的Docker容器会连接到默认bridge network中,其网段为172.17.0.1/16,因此两个未进行连接操作的Docker容器可以进行通信,因为其在同一个network下,但只能通过IP地址进行通信,不能使用容器名称进行通信。自定义创建的network可以通过容器名称进行通信。
Hello Docker(四)——Docker网络
docker0负责连通所有未指定network的Docker容器,并且连通外网。
docker run --name box1 -it --rm busybox sh
使用默认bridge网络运行box1
docker run --name box2 -it --rm busybox sh
使用默认bridge网络运行box2
在box1和box2间可以通过IP进行ping,但不能使用容器名称进行ping。
Docker网桥是宿主机虚拟出来的,不是真实存在的网络设备,外部网络是无法寻址到的,因此外部网络无法通过直接Container-IP访问到容器。如果Docker容器希望外部网络能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p或-P参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

3、host模式

host模式删除了Docker容器与宿主机设备间的隔离,仅适用于docker版本在17.06及高版本的集群服务中。
host模式中,Docker容器不会获得一个独立的Network Namespace(即不会虚拟出自己的网卡),而是和宿主机共用一个Network Namespace(即使用宿主机的IP和端口),但容器其它方面,如文件系统、进程列表等和宿主机隔离。
使用host模式的Docker容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势是网络性能比较好,但docker host已经使用的端口不能再使用,网络隔离性差。
Hello Docker(四)——Docker网络
host 模式适用于容器需要取消与宿主机器间的网络堆栈隔离,但容器内的其它部分仍需要隔离的场景。

4、container模式

Container模式中多个Docker容器共享一个Network namespace,而不是和宿主机共享。
Hello Docker(四)——Docker网络

5、none模式

none模式中,Docker容器拥有自己的Network Namespace,但不会为Docker容器进行任何网络配置,即Docker容器没有网卡、IP、路由等信息,需要为Docker容器添加网卡、配置IP等。
none模式下Docker容器只有lo回环网络,没有其它网卡。
Hello Docker(四)——Docker网络

四、Docker自定义网络

1、Docker自定义网络简介

Docker 允许创建3种类型的自定义网络:bridge、overlay、macvlan。
自定义网桥可以控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
自定义网络可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到自定义网络中的零个或多个网络。此外,可以连接并断开网络中的运行容器,而无需重新启动容器。当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供。

2、自定义bridge网络

docker network create NETWORK
如果不指定-d,默认创建bridge驱动模式的network。
自定义bridge network会有自己专属的网段,与其它network隔离。
加入到同一个自定义网络的Docker容器间可以使用容器名称进行通信,会自动进行DNS解析,但必须给容器指定名称,Docker随机分配的容器名称无法进行解析,但可以通过IP进行通信。
同一个Docker容器可以同时加入到多个network,此时容器会由多个网络接口,连接到不同的bridge上。
docker network create bridge1
创建自定义bridge网络bridge1
docker run --name box3 --network bridge1 -it --rm busybox sh
使用指定bridge1网络运行box3容器
docker run --name box4 --network bridge1 -it --rm busybox sh
使用指定bridge1网络运行box4容器
在box3和box4容器间可以通过IP进行ping,也可以使用容器名称进行ping。

3、自定义bridge优点

自定义bridge网络与默认bridge网络docker0的优点如下:
(1)自定义bridge提供更好的隔离性和容器间的互操作性
连接到同一个自定义bridge网络的容器会自动将所有端口相互暴露,并且无法连接到容器外的网络,使得容器化的应用能轻松地相互通信,并且与外部环境产生了良好的隔离性。
(2)自定义bridge提供容器间的自动DNS解析
默认bridge网络上的容器只能通过IP地址互相访问,除非使用在docker run 时添加--link 参数。
在用户定义桥接网络上,容器可以通过容器名称 (--name 指定的名称) 或别名来解析对方。
(3)容器可动态、快速地关联、剥离自定义桥接网络
使用自定义bridge,容器在整个生命周内,可以自如地关联、剥离到网络,而要从默认bridge网络中移除容器,则需要停止容器并使用不同的网络选项重新创建容器。
(4)每个自定义的bridge网络都会创建一个可配置的网桥
如果容器使用默认bridge网络,虽然可以对其进行配置,但所有容器都使用相同的默认设置,例如MTU和防火墙规则。另外,配置默认bridge网络隔离于 Docker本身外,并且需要重新启动Docker才可以生效。
自定义bridge网络使用docker network create创建和配置。如果不同的应用程序组具有不同的网络要求,则可以在创建时分别配置每个用户定义的 bridge网络,增加了灵活性和可控性。
(5)使用默认bridge容器共享所有的环境变量
自定义bridge网络实现共享环境变量的方式如下:
A、多个容器可以使用Docker卷来挂载包含共享信息的文件或目录。
B、多个容器可以使用Docker Compose启动,并且Docker Compose.yml文件可以定义共享变量。
C、使用集群服务而不是独立容器,并利用共享密钥和配置。

4、overlay

overlay模式可以连接多个docker daemon(docker服务端)使其相互通信,允许用户连通覆盖一个集群网络和一个独立的容器或者分布在两个docker daemon上的容器。
Docker内置跨主机的网络通信通常由二层VLAN网络和Overlay网络实现。
通常交换机可用的VLAN数量都在4000个左右,会对容器集群规模造成限制,不能满足公有云或大型私有云的部署需求;大型数据中心部署VLAN,会导致任何一个VLAN的广播数据会在整个数据中心内泛滥,大量消耗网络带宽,带来维护的困难。 
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文上的新数据格式,不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
overlay网络是目前最主流的容器跨节点数据传输和路由方案。
overlay网络将多个Docker守护进程连接在一起,并使集群服务能够相互通信。可以使用overlay网络来实现swarm集群和独立容器之间的通信或者不同 Docker守护进程上的两个独立容器之间的通信。
overlay模式适用于当需要使用多个docker daemon上的容器或者使用集群服务运行程序的场景。

5、macvlan

macvlan模式会为Docker容器分配一个地址,使得容器变成一个实际物理设备,docker deamon根据mac地址,将通信路由到具体容器。通常用于应用程序需要直接访问网络、不通过宿主机的场景。
macvlan本身是linxu kernel模块,本质上是一种网卡虚拟化技术,其功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的MAC地址在数据链路层进行网络数据的转发。
Macvlan网络允许为容器分配MAC地址,使其显示为网络上的物理设备。 Docker守护进程通过其MAC地址将流量路由到容器。
macvlan 模式适用于将容器 从VM(虚拟设备)环境中迁出或者让容器成为网络中具体的节点,容器配置唯一的mac地址。

上一篇:Adobe Bridge/Br 2019软件安装包(附安装教程)


下一篇:有关EMQX桥接的配置工作