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 中也保留此配置。