Docker 网络管理

Docker 核心技术

Docker 底层依赖的核心技术主要包括Linux 操作系统的命名空间(Namespace)、控制组(Control Group)、联合文件系统(Union File System)和Linux 网络虚拟化支持。

  • 通过命名空间,每个容器都有自己独有的网络栈,意味着它们不能访问其他容器的套接字或接口。容器默认可以与host 主机网络连通。
  • 每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统环境中一样。命名空间机制保证了容器之间彼此互不影响。
  • 控制组确保每个容器可以公平地分享主机的内存、CPU、磁盘IO等资源;还可以限制容器对资源的占用,确保不影响host 主机系统和其他容器。
  • 联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
  • Docker容器网络很好利用了Linux虚拟网络技术,在host 主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做veth pair)。

Docker 网络管理

Veth Pair(Virtual Ethernet Pair) 是一个虚拟网络通道,就是将来自通道一端的数据传输到另外一端。

Docker 网络管理

docker0并不是正常的网络接口,它只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥。

它可以使容器与主机相互通信。每次Docker创建一个容器,它就会创建一对对等接口(peer interface),类似于一个管子的两端-在这边可以收到另一边发送的数据包。Docker会将对等接口中的一个做为eth0接口连接到容器上,并使用类似于vethAQI2QT这样的惟一名称来持有另一个,该名称取决于主机的命名空间。通过将所有veth*接口绑定到docker0桥接网卡上,Docker在主机和所有Docker容器间创建一个共享的虚拟子网。

Docker 网络管理

  • 默认情况下,Docker 启动时会在宿主机上架设一个名为 docker0 的虚拟网络,用来连接宿主机与容器。
  • 通过 Veth Pair 连接到 docker0 所在的虚拟网络上,Veth Pair 是专门用于虚拟网卡间通信的通道。
  • 当容器内部的网络通过 Veth Pair 连接到 docker0 上时,它就与其他连接到 docker0 上的容器同属于一个子网中,而宿主机也通过虚拟网卡连接到了 docker0 上。也就是说,宿主机与容器间通过 docker0 达到了互相访问的目的。

Docker 默认的3种网络:

  • bridge
  • host
  • none

其中默认的是 bridge 驱动网络,也是容器创建时默认的网络管理方式。

都是非集群环境下 Docker 提供的默认网络。

docker network ls

Docker 网络管理

bridge(桥接)网络和overlay(覆盖)网络

在Docker Swarm 集群环境下,除了这 3 中默认网络之外,Docker 还提供了 docker_gwbridge 和 ingress 两种默认网络。

Docker Engine本地支持bridge(桥接)网络和overlay(覆盖)网络。

1).桥接网络仅限于运行Docker Engine的单个主机。

2).覆盖网络可以包含多个主机,是一个更高级的主题。

overlay网络下的不同主机之间就能够相互访问,但其实出口还是在docker_gwbridge网桥。

Docker 网络管理

Overlay网络是在现有的网络架构之上构建一个不同主机容器间的二层虚拟网络,以实现容器跨主机的通信,多用于规模比较大的容器集群环境。

Docker的Overlay网络需要基于键值存储来实现,K-V存储里面存放了各个主机上容器和网络相关的信息。

Docker 网络管理

如上图,Overlay将多主机中的容器划分到一个虚拟的二层网络中,以实现容器的跨主机通信。

Docker Overlay网络的构建支持VxLAN技术,将二层的MAC地址封装到4层的UDP数据包中,只要传输层端到端可达,则可以基于VxLAN隧道实现容器间大二层网络的构建,这也体现了Overlay网络与底层网络基础架构的相对无关性。

Docker 网络管理

相关推荐