在深入探讨容器间通信原理之前,我们已经了解了虚拟化网络的基础知识。现在,让我们利用这些知识来解构容器间的通信机制。毕竟,应用知识解决实际问题是学习网络虚拟化的最终目标。
我们先从 Docker 开始,讨论 Docker 提供的容器通信方案。在介绍 CNI 下的 Kubernetes 网络插件生态后,你可能会发现 Docker 的网络通信相对简单,甚至对于某些分布式系统的需求来说显得过于简陋。然而,尽管容器网络方案多种多样,但通信主体始终是固定的,包括没有物理设备的虚拟主体(如容器、Pod、Service、Endpoints 等)、不需要跨网络的本地主机以及通过网络连接的外部主机三种层次。
所有容器网络通信问题都可以归结为三种情况:本地主机内部的多个容器之间的通信、本地主机与其内部容器之间的通信,以及跨越不同主机的多个容器之间的通信。这些原理在很多方面是相通的(例如,同班同学之间的交流、同班老师和同学之间的交流、同班同学和外班同学之间的交流)。因此,我认为 Docker 网络的简单性在检验你是否真正理解了前面所学的网络知识时,反而是一种优势。
在操作层面上,Docker 的网络方案可以通过 docker run --network 参数直接指定,或者先通过 docker network create 创建后再让容器使用。在安装 Docker 的过程中,宿主机会自动创建一个名为 docker0 的网桥,以及三种不同的 Docker 网络:bridge、host 和 none。你可以通过 docker network ls 命令查看这三种网络,具体如下所示:
$ docker network ls NETWORK ID NAME DRIVER SCOPE 2a25170d4064 bridge bridge local a6867d58bd14 host host local aeb4f8df39b1 none null local
这三种网络对应着 Docker 提供的三种开箱即用的网络方案,分别为:
使用过虚拟机的读者应该对这些模式并不陌生。
桥接模式,通过 --network=bridge 指定,这是未指定网络参数时的默认网络。在桥接模式下,Docker 会为新容器分配独立的网络名称空间,创建 veth pair,一端连接到容器,另一端连接到 docker0 网桥上。Docker 会为每个容器自动分配 IP 地址,默认配置下的地址范围是 172.17.0.0/24,docker0 的地址默认是 172.17.0.1,并且会设置所有容器的网关为 docker0。这样,所有连接到同一网桥的容器可以直接通过二层网络进行通信,而在此范围之外的容器和主机则需要通过网关访问(具体过程我在介绍 Linux Bridge 时已经详细讲解过,这里不再赘述)。
主机模式,通过 --network=host 指定。在主机模式下,Docker 不会为新容器创建独立的网络名称空间,容器的所有网络设施(如网卡、网络栈等)都将直接使用宿主机上的资源,因此容器不会拥有独立的 IP 地址。在这种模式下与外界通信不需要进行 NAT 转换,性能损耗较小,但其缺点也显而易见,因为没有隔离,无法避免网络资源冲突,比如端口号不能重复。
空置模式,通过 --network=none 指定。在空置模式下,Docker 会为新容器创建独立的网络名称空间,但不会创建任何虚拟的网络设备,此时容器只能看到一个回环设备(Loopback Device)。这种方式是为了方便用户进行自定义的网络配置,比如自己添加网络设备、自己管理 IP 地址等。
除了前面提到的三种开箱即用的网络方案外,Docker 还支持用户自行创建的网络,例如:
容器模式,创建容器后通过 --network=container:容器名称 指定。在容器模式下,新创建的容器将加入指定容器的网络名称空间,共享所有网络资源,但其他资源(如文件、PID 等)默认仍然是隔离的。两个容器可以通过回环地址(localhost)直接通信,端口号等网络资源不能有冲突。
MACVLAN 模式,通过 docker network create -d macvlan 创建。这种网络模式允许为容器指定一个副本网卡,容器通过副本网卡的 MAC 地址使用宿主机上的物理设备,因此在追求通信性能的场景中,这种网络是最佳选择。需要注意的是,Docker 的 MACVLAN 仅支持 Bridge 通信模式,因此在功能表现上与桥接模式类似。
Overlay 模式,通过 docker network create -d overlay 创建。Docker 所说的 Overlay 网络实际上是指 VXLAN,这种网络模式主要用于 Docker Swarm 服务之间的通信。然而,由于 Docker Swarm 被 Kubernetes 取代,并未成为主流,因此这种网络模式实际上很少被使用。

总结:虚拟化网络是容器编排不可或缺的功能,网络的功能和性能与应用程序各服务之间的通信密切相关,这一点你需要重点关注。在实际生产中,容器编排系统就是通过网络交互的一批容器共同对外提供服务,其中的开发、调试、效率优化等工作都离不开这些基础的网络知识。
一课一思:在使用 Docker 时,你是否关注或调整过它的容器通信网络?你在哪些需求场景下进行了调整?
以上就是容器间通讯(前面Linux网络是在看不下去直接看这篇)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号