4、容器虚拟化网络概述

Docker 的网络实现其实就是利用了 Linux 上的网络名称空间和虚拟网络设备(特别是 veth pair)。

Linux 网络命名空间:https://www.jianshu.com/p/369e50201bce

Linux虚拟网络设备之veth: https://segmentfault.com/a/1190000009251098

监控和调整Linux网络堆栈:接收数据:https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/

Linux网络-数据包的发送过程:https://segmentfault.com/a/1190000008926093

Docker网络核心原理    

基本原理

首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。

对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。

Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair)。

veth设备的特点

veth和其它的网络设备都一样,一端连接的是内核协议栈。

veth设备是成对出现的,另一端两个设备彼此相连

一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去。

参考自      https://segmentfault.com/a/1190000009251098

使用docker run命令创建一个执行shell(/bin/bash)的Docker容器,假设容器名称为con1。
     在 con1 容器中可以看到它有两个网卡 lo 和 eth0。lo设备不必多说,是容器的回环网卡;eth0 即为容器与外界通信的网卡,eth0的ip 为 172.17.0.2/16,和宿主机上的网桥 docker0 在同一个网段。

     查看 con1 的路由表,可以发现 con1 的默认网关正是宿主机的 docker0 网卡,通过测试, con1 可以顺利访问外网和宿主机网络,因此表明 con1 的eth0网卡与宿主机的docker0网卡是相互连通的。

     这时再来查看(ifconfig)宿主机的网络设备,会发现有一块以"veth"开头的网卡,如veth60b16bd,我们可以大胆猜测这块网卡肯定是veth设备了,而veth pair总是成对出现的。veth pair通常用来连接两个network namespace,

     那么另一个应该是 Docker 容器 con1 中的eth0了。之前已经判断con1容器的eth0和宿主机的docker0是相连的,那么veth60b16bd也应该是与docker0相连的,不难想到,docker0就不只是一个简单的网卡设备了,而是一个网桥。

     真实情况正是如此,下图即为Docker默认网络模式(bridge模式)下的网络环境拓扑图,创建了docker0网桥,并以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。

4、容器虚拟化网络概述

    这里的网桥概念等同于交换机,为连在其上的设备转发数据帧。网桥上的veth网卡设备相当于交换机上的端口,可以将多个容器或虚拟机连接在上面,这些端口工作在二层,所以是不需要配置IP信息的。

    图中docker0网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的Docker容器之间可以相互通信。


    大家应该注意到docker0既然是二层设备,它上面怎么设置了IP呢?docker0是普通的linux网桥,它是可以在上面配置IP的,可以认为其内部有一个可以用于配置IP信息的网卡接口

   (如同每一个Open vSwitch网桥都有一个同名的内部接口一样)。在Docker的桥接网络模式中,docker0的IP地址作为连于之上的容器的默认网关地址存在。

在Linux中,可以使用brctl命令查看和管理网桥(需要安装bridge-utils软件包),比如查看本机上的Linux网桥以及其上的端口:

# yum install bridge-utils

# brctl show   //四个虚拟接口

bridge name bridge id STP enabled interfaces docker0 8000.02428f0e6a12 no veth6a95f3b veth6d97324 veth7314b3e vethb2e752f vethdb62bce

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjdps.html