我不确定我是否能比文档更清晰,但重新表述可能会有所帮助。
首先,你在这里遵循的文档使用了 Docker 的 swarm mode
。
什么是 swarm mode
?
Swarm 是一组 Docker 引擎或节点,您可以在其中部署服务。Docker 引擎 CLI 和 API 包括管理 Swarm 节点(例如添加或删除节点)以及在整个 Swarm 中部署和协调服务的命令。
来自 SO 文档:
Swarm 是一些 Docker 引擎(或节点),它们共同部署服务。Swarm 用于在许多物理、虚拟或云机器之间分配处理。
因此,使用 swarm mode,您拥有一个多主机(虚拟机和/或物理机)集群,这些机器通过它们的 Docker 引擎
相互通信。
Q1. 什么是 webnet?
webnet
是在启动堆栈时创建的一个 覆盖网络 的名称。
覆盖网络管理在参与 Swarm 的 Docker 守护程序之间的通信
在您的机器群集中,将创建一个虚拟网络,其中每个服务都有一个 IP - 映射到内部 DNS 条目(即服务名称),并允许 Docker 在整个 Swarm(集群)中将传入的数据包路由到正确的容器。
Q2. 因此,默认情况下,Docker 群集中的覆盖网络是负载均衡的吗?
如果您使用覆盖网络,则可以实现负载平衡,但您也可以删除服务的networks
配置,以绕过它。然后,您需要发布要公开的服务端口。
Q3. 使用了什么负载均衡算法?
来自swarm主节点bmitch回答的这个Stack Overflow问题:
目前使用的算法是轮询,我没有看到任何迹象表明它是可插拔的。更高级别的负载均衡器将允许对维护进行swarm节点关闭,但任何粘性会话或其他路由功能都将被swarm模式下的轮询算法取消。
Q4. 实际上,我不清楚为什么我们在覆盖网络上有负载均衡
Docker Swarm模式/服务的目的是允许编排复制的服务,这意味着我们可以扩展在Swarm中部署的容器。
再次引用文档:
Swarm模式具有一个内部DNS组件,它会自动为swarm中的每个服务分配DNS条目。Swarm管理器使用内部负载平衡来基于服务的DNS名称在群集内分配请求。
因此,您可以部署10个完全相同的容器(例如nginx和应用程序html/js),而无需处理私有网络DNS条目、端口配置等...任何传入的请求都会自动负载平衡到参与Swarm的主机。
希望这能帮助到您!