Docker Swarm 容器与普通 Docker 容器的网卡差异
问题背景
在 Docker Swarm 网络空间启动的容器有两张网卡(eth0 和 eth1),而普通 Docker 容器只有一张网卡(eth0)。以下通过分析 ip addr show 和 ip link show 的输出,解释原因。
命令输出解析
Docker Swarm 容器(ip addr show)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP link/ether 02:42:0a:00:01:06 brd ff:ff:ff:ff:ff:ffinet 10.0.1.6/24 brd 10.0.1.255 scope global eth0valid_lft forever preferred_lft forever
38: eth1@if39: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ffinet 172.18.0.3/16 brd 172.18.255.255 scope global eth1valid_lft forever preferred_lft forever
lo:回环接口,IP 为127.0.0.1/8,用于本地通信。eth0:IP 为10.0.1.6/24,MTU 为 1450,连接 overlay 网络,用于 Swarm 集群跨主机通信。eth1:IP 为172.18.0.3/16,MTU 为 1500,连接桥接网络(如docker_gwbridge),用于本地或外部通信。
普通 Docker 容器(ip link show)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
lo:回环接口,功能同上。eth0:连接默认桥接网络(如docker0),MTU 为 1500,IP 通常为172.17.0.0/16或类似范围。
为什么 Swarm 容器有两张网卡,普通容器只有一张?
1. 普通 Docker 容器网络
- 网络模式:默认使用桥接网络(bridge network,通常是
docker0桥)。 - 网卡:只有一个网卡(
eth0),IP 从默认子网分配(如172.17.0.0/16)。 - 用途:适合单机环境,容器通过
docker0与主机、其他容器或外部网络通信。 - 原因:普通容器网络需求简单,默认只连接单一桥接网络,除非手动配置其他网络(如
--network参数)。
2. Docker Swarm 容器网络
- 网络模式:默认连接两种网络:
- Overlay 网络(
eth0,IP 如10.0.1.6/24):用于跨主机容器通信,基于 VXLAN 技术,MTU 较小(如 1450)。 - 桥接网络(
eth1,IP 如172.18.0.3/16):通常连接docker_gwbridge,用于本地主机或外部网络通信,MTU 为 1500。
- Overlay 网络(
- 网卡:两张网卡,分别服务于 overlay 网络和桥接网络。
- 用途:支持分布式集群,overlay 网络实现跨主机通信,桥接网络确保外部访问。
- 原因:Swarm 模式为集群设计,自动分配 overlay 网络(即使单机运行)以支持服务发现和负载均衡,同时保留桥接网络以访问主机或公网。
3. 核心差异
- 普通容器:单机环境,单一桥接网络,网卡数量为 1。
- Swarm 容器:集群环境,overlay + 桥接网络,网卡数量为 2。
- Swarm 额外网卡的原因:
- Overlay 网络为跨主机通信提供虚拟网络平面。
- 桥接网络(
docker_gwbridge)确保容器与外部世界的连接。 - Swarm 的网络模型是为分布式系统设计的,即使单机运行也保留两张网卡。
实际场景对比
- 普通容器:
- 命令:
docker run --rm -it alpine sh - 网络:单网卡(
eth0),连接docker0,IP 如172.17.0.2。 - 场景:单机应用、开发测试。
- 命令:
- Swarm 容器:
- 命令:
docker service create --name my-service alpine sh - 网络:双网卡,
eth0(overlay,IP 如10.0.1.6),eth1(桥接,IP 如172.18.0.3)。 - 场景:分布式服务、微服务架构。
- 命令:
验证方法
- 普通容器:
- 查看网络:
docker network ls(仅bridge网络)。 - 检查网卡:容器内运行
ip addr show,仅见lo和eth0。
- 查看网络:
- Swarm 容器:
- 查看网络:
docker network ls(含overlay和docker_gwbridge)。 - 检查网卡:容器内运行
ip addr show,见lo、eth0(overlay)、eth1(桥接)。
- 查看网络:
总结
普通 Docker 容器因单机环境需求简单,默认只有一张网卡(eth0),连接桥接网络。Docker Swarm 容器为支持集群通信,默认有两张网卡:eth0 用于 overlay 网络(跨主机通信),eth1 用于桥接网络(本地/外部通信)。这是 Swarm 网络模型为分布式系统设计的必然结果,即使在单机 Swarm 中也保留此配置。
