当今世界,企业热衷于容器化,这需要强大的网络技能来正确配置容器架构,因此引入了 Docker Networking 的概念。Docker 是一种容器化平台,允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能,用于管理容器之间的通信和容器与外部网络的连接。
1.什么是 Docker?
这就是理解 Docker 网络所需的所有理论。现在,展示网络是如何创建的以及容器如何相互通信。要了解 Docker,您需要了解以前如何部署应用程序的历史以及现在如何使用容器部署应用程序。
正如您在上图中看到的,旧方式在主机上有应用程序。 因此,n 个应用程序共享该操作系统中存在的库。但是,通过容器化,操作系统将拥有一个内核,这是所有应用程序之间唯一通用的东西。 因此,应用程序无法访问彼此的库。因此,简单来说, Docker是一个用于开发、交付和运行应用程序的开放平台,使用户能够借助容器将应用程序与基础设施分离,从而快速交付软件。那么,这些容器在各种情况下如何相互通信呢?
2.Docker的工作流
在深入研究 Docker 网络之前,我先向您展示 Docker 的工作流程。
正如您在上图中看到的。开发人员在易于编写的 Docker File中编写规定应用程序需求或依赖项的代码,并且该 Docker File会生成 Docker 镜像。因此,特定应用程序所需的任何依赖项都存在于此映像中。现在,Docker 容器只不过是 Docker 镜像的运行时实例。这些镜像被上传到 Docker Hub(Docker 镜像的 Git 存储库),其中包含公共/私有存储库。
您也可以从公共存储库中提取镜像,也可以将自己的镜像上传到 Docker Hub。然后,质量保证或生产团队等各个团队将从 Docker Hub 提取该镜像并准备自己的容器。这些单独的容器通过网络相互通信以执行所需的操作,这就是 Docker 网络。因此,您可以将 Docker Networking 定义为一个通信通道,所有隔离的容器通过该通道在各种情况下相互通信以执行所需的操作。
3.Docker网络的目标
灵活性——Docker 通过使不同平台上的任意数量的应用程序能够相互通信来提供灵活性。
跨平台——Docker 可以轻松地跨平台使用,借助 Docker Swarm 集群可以跨各种服务器工作。
可扩展性——Docker是一个完全分布式的网络,它使应用程序能够单独增长和扩展,同时确保性能。
去中心化——Docker 使用去中心化网络,从而能够实现应用程序的传播和高可用性。如果资源池中突然缺少容器或主机,您可以提供额外的资源或转而使用仍然可用的服务。
用户友好——Docker 可以轻松实现服务部署的自动化,使它们在日常生活中易于使用。
支持– Docker 提供开箱即用的支持。因此,能够非常简单直接地使用 Docker 企业版并获得所有功能,使得 Docker 平台非常易于使用。
为了实现上述目标,您需要称为容器网络模型的东西。
4.容器网络模型(CNM)
在告诉你到底什么是容器网络模型之前,我先给你介绍一下在理解 CNM 之前需要用到的 Libnetwork。Libnetwork 是一个开源 Docker 库,它实现了构成 CNM 的所有关键概念。
因此,容器网络模型 (CNM) 标准化了使用多个网络驱动程序为容器提供网络所需的步骤。CNM 需要像控制台这样的分布式键值存储来存储网络配置。CNM 具有 IPAM 插件和网络插件的接口。IPAM 插件 API 用于创建/删除地址池以及分配/取消分配容器 IP 地址,而网络插件 API 用于创建/删除网络以及在网络中添加/删除容器。
CNM主要构建在5个对象上:网络控制器、驱动程序、网络、端点和沙箱。容器网络模型对象
网络控制器:提供 Libnetwork 的入口点,为 Docker 引擎公开简单的 API 来分配和管理网络。由于 Libnetwork 支持多个内置和远程驱动程序,网络控制器使用户能够将特定驱动程序附加到给定网络。
驱动程序:拥有网络并负责通过多个驱动程序参与来管理网络,以满足各种用例和部署场景。
网络:在属于同一网络并与其他网络隔离的一组端点之间提供连接。因此,每当创建或更新网络时,相应的驱动程序都会收到该事件的通知。
端点: 为网络中容器公开的服务与网络中其他容器提供的其他服务提供连接。端点代表一个服务,不一定是一个特定的容器,端点在集群内也具有全局范围。
沙箱:当用户请求在网络上创建端点时创建。沙箱可以有多个端点连接到不同的网络,代表容器的网络配置,例如 IP 地址、MAC 地址、路由、DNS。
以上就是 CNM 的 5 个主要目标。
5.网络驱动程序
主要有5个网络驱动:Bridge、Host、None、Overlay、Macvlan
Bridge: 桥接网络是docker在主机上创建的私有默认内部网络。因此,所有容器都会获得一个内部 IP 地址,并且这些容器可以使用该内部 IP 相互访问。当您的应用程序在需要通信的独立容器中运行时,通常会使用 Bridge 网络。
Host:此驱动程序消除了 docker 主机和 docker 容器之间的网络隔离,以直接使用主机的网络。因此,这样一来,您将无法在同一主机、同一端口上运行多个 Web 容器,因为该端口现在是主机网络中所有容器所共用的。
None:在这种网络中,容器不附加到任何网络,并且无法访问外部网络或其他容器。因此,当您想要完全禁用容器上的网络堆栈并且 仅创建环回设备时,请使用此网络 。
Overlay:创建一个跨越参与 swarm 集群的所有节点的内部专用网络。因此,Overlay 网络促进了 swarm 服务和独立容器之间的通信,或者不同 Docker 守护进程上的两个独立容器之间的通信。
Macvlan: 允许您为容器分配 MAC 地址,使其显示为网络上的物理设备。然后,Docker 守护进程通过容器的 MAC 地址将流量路由到容器。当您希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由时,Macvlan 驱动程序是最佳选择。