Docker网络架构主要由三部分组成:CNM,Libnetwork和Driver。
1.CNM
CNM(Container Network Model)是一种网络模型,用于定义容器的网络架构和实现容器之间的通信。
这其中也有三要素:
- 沙盒:Sandbox:Sandbox是容器的网络运行环境,类似于一个隔离的网络命名空间。每个容器都有自己的Sandbox,其中包含网络接口、IP地址、路由表等网络配置。Sandbox确保容器之间的网络隔离。
- 终端:Endpoint:Endpoint是容器网络的终端点,用于处理容器的网络通信。每个容器连接到一个或多个Endpoint,并通过Endpoint进行网络数据包的接收和发送。Endpoint提供了容器与网络之间的桥梁。
- 网络:Network:Network是一组相关的Endpoint的集合,它定义了容器之间的通信规则和机制。每个Network都有唯一的标识符和配置选项。容器可以连接到一个或多个Network,实现不同的网络拓扑和通信方式。801.1d网桥的软件实现,是需要交互的终端的集合。
大体框架就是: 我外面套一个容器,容器里面有沙盒,沙盒上还有终端。 终端负责跟网络进行数据交互,然后无限制拷贝容器ABCD这个样子~
2.Libnetwork
CNM是设计规范,而Libnetwork是开源的、由GO语言编写的、跨平台的CNM的标准实现。
Libnetwork除了 实现了CNM的三个组件、还实现了本地服务发现,容器负载均衡,以及网络控制层与管理层功能。
Libnetwork的主要目标是提供一个可插拔、可扩展的网络架构,使得Docker容器可以在不同的网络环境中灵活地通信和交互。
Libnetwork的特点和功能包括:
多种网络驱动程序:Libnetwork支持多种网络驱动程序,包括Bridge、Overlay、Macvlan、Host等。这些驱动程序提供了不同的网络模式和通信方式,满足不同应用场景的需求。
网络抽象层:Libnetwork提供了一个网络抽象层,将底层的网络细节屏蔽起来,使得容器可以使用相同的网络API进行通信,无论使用哪种网络驱动程序。
网络插件:Libnetwork支持网络插件机制,允许第三方开发者编写自定义的网络插件,以扩展和定制网络功能。这使得Libnetwork可以适应各种不同的网络场景和需求。
动态网络配置:Libnetwork支持动态的网络配置,可以在容器运行时动态地添加、删除或修改网络配置。这使得容器可以灵活地适应不同的网络环境和需求。
通过Libnetwork,Docker容器可以方便地创建、连接和管理网络,实现容器之间的通信和与外部网络的连接。它提供了一个统一的网络管理接口,简化了网络配置和管理的复杂性,使得Docker网络更加灵活、可扩展和易用。
3.Driver
在Docker中,Driver(驱动程序)是用于扩展和定制Docker的关键组件之一。Driver负责实现与底层系统或平台的交互,提供特定功能或能力的扩展。
以下是几种常见的Driver:
Container Runtime Driver:负责与底层容器运行时进行交互,例如Docker默认使用的Containerd或者其他可选的容器运行时,如CRI-O、rkt等。Container Runtime Driver实现了容器的生命周期管理、容器的创建、启动、停止、销毁等操作。
Network Driver:用于实现容器的网络连接和通信。Docker提供了多种内置的Network Driver,如Bridge、Overlay、Macvlan、Host等,用于创建不同类型的容器网络。同时,也支持第三方开发的网络驱动插件,以满足特定网络需求。
Volume Driver:负责实现容器的数据卷功能。Docker的Volume Driver用于管理容器的数据卷,可以将宿主机上的目录或文件映射到容器中,实现数据的持久化和共享。Docker支持多种Volume Driver,如Local Volume Driver、AWS EBS、Azure Disk等。
Storage Driver:用于管理容器镜像的存储和管理。Docker的Storage Driver负责将容器镜像存储在宿主机上,并提供镜像的读取、写入和管理功能。Docker支持多种Storage Driver,如Overlay2、Aufs、Device Mapper等,用于实现镜像的存储和管理。
这些Driver通过接口和插件机制与Docker引擎进行交互,扩展和定制了Docker的功能和能力。它们使得Docker可以适应不同的运行时环境、网络环境和存储需求,提供更灵活、可扩展和可定制的容器化解决方案。
不管使用的是哪种网络类型,其工作原理都是相似的。
通过Docker命令可以查看当前主机所连接的网络及网络类型。
4.总结
这里只是说了一下docker网络架构的一些知识,docker网络仍有很多内容需要学习。
ok。我已讲完。