Docker网络管理

  Docker借助强大的镜像技术,让应用的分发、部署与管理变得异常便捷。那么,Docker网络功能又如何,能否满足各种场景的需求。

1. Docker网络架构

  Docker在1.9版本引入了一整套docker network子命令和跨主机网络支持,这允许用户可以根据他们应用的拓扑结构创建虚拟网络并将容器接入其对应的网络。为了标准化网络驱动的开发步骤和支持多种网络驱动,Docker公司在libnetwork中使用了CNM。CNM定义了构建容器虚拟化网络的模型,同时还提供了可以用于开发多中网络驱动的标准化接口和组件。

 

  CNM的三个核心组件:

  • 沙盒:一个沙盒包含了一个容器网络栈的信息,可以对容器的接口、路由和DNS设置等进行管理。一个沙盒可以有多个端点和多个网络,实现可以是Linux network namespace等类似的机制。
  • 端点:一个端点可以加入一个沙盒和一个网络,端点的实现可以是veth pair等,一个端点只属于一个网络和一个沙盒。
  • 网络:一个网络是一组可以直接互相连通的端点,网络的实现可以是Linux bridge、VLAN等。一个网络可以包含多个端点。

  libnetwork的五种内置驱动:

  • bridge驱动:Docker默认设置。libnetwork将创建的Docker容器连接到Docker0网桥上,这种模式下容器与外界通信使用NAT。
  • host驱动:libnetwork将不为Docker创建网络协议栈,容器中的进程处于宿主机网络环境中,和宿主机公用一个network namespace,使用宿主机的网卡、IP和端口等信息。但容器的其他诸如文件系统、进程列表等还是和宿主机隔离的。这种模式下,容器可以直接使用宿主机IP与外界通信。
  • overlay驱动:使用这种方式需要额外的配置存储服务,如Consul、etcd、ZooKeeper。还需要在启动Docker daemon的时候添加参数来指定所使用的配置存储服务地址。
  • remote驱动:这个驱动调用了用户自行实现的网络插件,使libnetwork实现了驱动的可插件化。
  • null驱动:这种模式下,Docker容器除了networke namespace自带的loopback网卡外,没有其他任何网卡、IP和路由等信息,需要自行配置,因此给了用户最大的自由度来定义容器网络环境。

 

 

$ sudo docker network create backend
$ sudo docker network create fronted
$ docker network ls 

 

  name为bridge、host、null为三种内置网络,不能删除。我们发现创建的network是一个网桥设备,其实更准确来说功能更类似于交换机,如果进入然后我们使用connet命令按照上图方式连接到网络中去后,con1和con2能够ping同,con2和con3能够ping通。如果进入到con2容器中会发现多了一块网卡,其IP和网桥fronted同在一个IP段。所以docker network connect命令会在所连接的容器中创建新的网卡,以完成其指定网络的连接。

 2. Docker四种网络模式

  创建docker时候指定网络模式实际上就是通过--net指定docker加入哪个网络中去,也就是上面我们通过docker connect ls列举出来的三种系统网络模式。如果不使用--net参数指定,默认就是bridge模式。

  1. bridge模式

  当我们在一台机子上装完docker后,使用ifconfig命令,会发现多了一块名为docker0的网卡,默认网段为172.17.0.1/16,宿主机也会在内核路由表上添加一条到达相应网络的静态路由,可以通过route -n查看。所有目的地址为172.17.0.0/16的数据包从docker0网卡发出。

  当我们启动一个容器后,Docker从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。这里简单提一下veth设备对,这个是Linux用来连接两个network namespace的。所以不难想到,docker0其实不仅仅是一个网卡设备了,而是一个网桥,准确的说功能等同于交换机,为连在其上的设备转发数据帧,网桥上的veth网卡相当于交换机上的端口,这些端口工作在二层,因此不需要配置IP信息。容器中的数据通过docker0转发到宿主机的eth0网卡上,可以让容器顺利访问外网和宿主机网络。

  不难想象,默认模式下,各容器因为同处于一个网络中,因此可以互相访问。而docker0作为一个二层设备,其上的IP信息作为连接容器默认网关地址的存在。

  Docker提供了如下参数帮助用户自定义docker0设置:

  • --bip=CIDR:设置docker0的IP地址和子网范围。
  • --fixed-cidr=CIDR:限制Docker容器获取IP的范围。
  • -mtu:指定docker0的最大传输单元。

 2. Host模式  

 

  容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

3. container模式

 

 

  这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

4. None模式

 

欢迎关注公众号

 

参考链接:

《Docker容器与容器云第三版》

https://blog.csdn.net/suchahaerkang/article/details/84570488

 

posted @ 2020-12-03 13:10  尹瑞星  阅读(225)  评论(1编辑  收藏  举报