本文共 3382 字,大约阅读时间需要 11 分钟。
Docker Swarm的网络架构设计确实非常巧妙,为容器化应用提供了强大的网络支持能力。本文将深入剖析Docker Swarm的网络实现机制,揭示官方文档中未提及的关键细节。
首先,我们创建一个包含两个节点(node 1 和 node 2)的 Docker Swarm 集群。创建 swarm 集群的具体步骤不在本文详细阐述。接下来,我们创建一个 overlay
网络 net1
和三个服务:Redis、Node.js 和 Nginx。每个服务指定使用 net1
网络,这样可以确保服务之间的通信基于该 overlay 网络。
具体命令如下:
docker network create --option encrypted --subnet 100.0.0.0/24 -d overlay net1docker service create --name redis --network net1 redis:latestdocker service create --name node --network net1 nvbeta/node:latestdocker service create --name nginx --network net1 -p 1080:80 nvbeta/swarm_nginx
这些命令创建了一个典型的三层架构:Nginx 作为负载均衡器,将请求转发到 Node.js 服务,而 Node.js 又通过调用 Redis 来获取数据并返回给 Nginx。为了简化起见,我们仅创建一个 Node 实例。
在 Docker Swarm 中,网络分为几个关键部分:
net1
网络:这是一个 overlay 网络,用于容器之间的通信。docker_gwbridge
网络:这是一个桥接网络,提供容器与宿主机之间的通信。ingress
网络:默认创建的 overlay 网络,用于暴露外部服务和实现 routing mesh。此外,还可以看到 none
网络,它用于 container 操作时的临时通信。
从 docker network ls
的输出可以看到:
NETWORK ID NAME DRIVER SCOPEcac91f9c60ff bridge bridge localb55339bbfab9 docker_gwbridge bridge localfe6ef5d2e8e8 host host localf1nvcluv1xnf ingress overlay swarm8vty8k3pejm5 net1 overlay swarm
net1
网络:负责容器间的通信,所有服务都指定使用此网络。docker_gwbridge
网络:由 Docker 自动创建,用于容器与宿主机的通信。ingress
网络:用于暴露外部服务,并管理 routing mesh,确保容器间的通信不受宿主机限制。通过 docker ps
命令可以观察到各个容器的状态:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESeb03383913fb nvbeta/node:latest "nodemon /src/index.js" 2 hours ago Up 2 hours 8888/tcp node.1yscmxtoymkvs3bdd4z678w4434ce2679482 redis:latest "docker-entrypoint.sh" 2 hours ago Up 2 hours 6379/tcp redis.1
此外,查看容器的网络配置,可以发现容器使用 overlay 网络进行通信。
Docker Swarm 的网络架构主要基于以下技术:
overlay
网络类型将多个宿主机连接成单个逻辑网络,确保容器在不同宿主机间通信。docker_gwbridge
。iptables
插件实现负载均衡和路由。通过 docker network inspect
和 brctl showbridge
等命令可以查看详细的网络拓扑信息:
Name Bridge id STP enabled Interfacedocker0 8000.0242e4567e9a no veth97d586bvethceaaebe 8000.024224f1afe8 no vethceaaebeethefdaa0d 8000.0242e4567e9a no vethefdaa0d
此外,使用 ip netns exec
和 ip link
可以查看容器的网络接口及其对应的名称空间。
在 Docker Swarm 中,服务间通信基于 overlay 网络实现的高效 routing mesh:
net1
网络:负责容器间的直接通信。docker_gwbridge
网络:允许容器与宿主机通信。ingress
网络:完成外部请求的路由和负载均衡。通过 iptables -t nat
命令可以观察到网络路由规则,
Chain DOCKER-INGRESS (policy ACCEPT 2 references)pkts bytes target prot opt in out source destination0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1080 to:172.18.0.2:1080
这表明所有到宿主机 1080 端口的流量会被重定向到隐藏的 ingress-sbox
容器。
Docker Swarm 的 routing mesh 机制确保了服务间的高效通信,无论服务运行在哪个节点,内部流量都能直接经过网络层而非传统的三次握手。
通过 ipvsadm
可以看到负载均衡器的配置:
IPVS: Thu Jan 14 16:38:51 2024 -> 1 server: 10.255.0.5:0FWM: Masq 1 0 0
这个配置指示负载均衡将所有到达 10.255.0.5:0
的流量转发给后端服务。
Docker Swarm 的网络设计极其巧妙,结合了 Overlay 网络、Linux Bridge、VxLAN 等技术,为容器化应用提供了高效、可靠的网络支持。深入理解这些机制对于开发与调试都是至关重要的。
转载地址:http://nyvyk.baihongyu.com/