目录
- 1.为什么需要网络管理
- 2.Docker 网络架构简介
- 0.铺垫说明
- 1.CNM
- 2.Libnetwork
- 3.驱动
- 3.常见网络类型
- 1.bridge 网络
- 2.host 网络
- 3.container 网络
- 4.none 网络
- 5.overlay 网络
1.为什么需要网络管理
- 容器的网络默认与宿主机及其他容器都是相互隔离, 但同时也要考虑以下问题, 比如:
- 多个容器之间是如何通信的
- 容器和宿主机是如何通信的
- 容器和外界主机是如何通信的
- 容器中要运行一些网络应用(如 nginx、web应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现
- 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现
- 容器根本不需要网络的时候应该如何实现
- 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现
- …
2.Docker 网络架构简介
0.铺垫说明
- Docker容器网络是为应用程序所创造的虚拟环境的一部分
- 它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块
- Docker为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和 驱动
1.CNM
- Docker网络架构采用的设计规范是CNM(Container Network Model)
- CNM中规定了Docker网络的基础组成要素:
- Sandbox:
- 提供了容器的虚拟网络栈
- 即:端口、套接字、IP路由表、防火墙、 DNS配置等内容
- 主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境
- 提供了容器的虚拟网络栈
- Network:Docker内部的虚拟子网,使得网络内的参与者能够进行通讯
- Endpoint:
- 虚拟网络的接口,就像普通网络接口一样,Endpoint的主要职责是负责创建连接
- Endpoint类似于常见的网络适配器,那也就意味着一个Endpoint只能接入某一个网络, 当容器需要接入到多个网络,就需要多个Endpoint
- Sandbox:
- 如下图所示,容器B有两个Endpoint并且分别接入Networkd A和Network B。那么容器A和容器B之间是可以实现通信的,因为都接入了NetworkA。但是容器A和容器C不可以通过容器B的两个Endpoint通信
2.Libnetwork
- Libnetwork是CNM的一个标准实现
- Libnetwork是开源库,采用Go语言编写(跨平台的),也是Docker所使用的库,Docker网络架构的核心代码都在这个库中。 Libnetwork实现了CNM中定义的全部三个组件,此外它还实现了本地服务发现、基于Ingress的容器负载均衡,以及网络控制层和管理层等功能
3.驱动
- 驱动主要负责实现数据层相关内容
- 例如:网络的连通性和隔离性是由驱动来处理的
- 驱动通过实现特定网络类型的方式扩展了Docker网络栈
- 例如:桥接网络和覆盖网络
- Docker内置了若干驱动,通常被称作原生驱动或者本地驱动
- 例如:Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver等等
- 每个驱动负责创建其上所有网络资源的创建和管理
3.常见网络类型
1.bridge 网络
- bridge驱动会在Docker管理的主机上创建一个Linux网桥
- 默认情况下,网桥上的容器可以相互通信
- 也可以通过bridge驱动程序配置,实现对外部容器的访问
- Docker容器的默认网络驱动,当需要多个容器在同一个Docker主机上通信时,桥接网络是最佳选择
- 另外,在Docker安装时,会自动安装一块Docker网卡称为
docker0
,它是一个网桥设备,主要用于Docker各容器及宿主机的网络通信
2.host 网络
- 对于独立容器,移除容器和Docker主机之间的网络隔离,并直接使用主机的网络
- 当网络堆栈不应该与Docker主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择
3.container 网络
- 这个模式指定新创建的容器和已经存在的一个容器共享一个网络 ,而不是和宿主机共享
- 新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口等
- 两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的
- 两个容器的进程可以通过IO网卡设备通信
4.none 网络
- Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置
- 也就是说,这个Docker容器没有网卡、IP、路由等信息
- 容器网络完全隔离
5.overlay 网络
- 借助Docker集群模块Docker Swarm搭建的跨Docker Daemon网络,将多个Docker守护进程连接在一起,使集群服务能够相互通信
- 当需要运行在不同Docker主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择