dokcer的网卡
# 网卡
当你初次启动docker的时候,它会创建一个 docker0 的网卡。
# 宿主机网卡
[root@yudianxx ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 00:ff:b8:a2:ae:6d brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 42:a1:42:42:a0:1e brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
valid_lft forever preferred_lft forever
link/ether 02:42:63:4f:a0:2d brd ff:ff:ff:ff:ff:ff
4: br-2931f0e3f4dd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 9e:bd:c7:8b:40:88 brd ff:ff:ff:ff:ff:ff
inet 172.19.0.1/16 brd 172.18.255.255 scope global br-2931f0e3f4dd
valid_lft forever preferred_lft forever
# Docker应用网卡
是的,docker网卡也有自己的eth0
[root@yudianxx ~]# docker exec -it docker-hermes-manager sh
# ipconfig
sh: 15: ipconfig: not found
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.3 netmask 255.255.0.0 broadcast 172.18.255.255
ether 8e:c8:d0:a6:c9:b6 txqueuelen 0 (Ethernet)
RX packets 21918 bytes 13945391 (13.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17844 bytes 12887855 (12.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 779 bytes 155329 (151.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 779 bytes 155329 (151.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0 本质是 Linux 网桥,是容器默认互通、容器访问宿主机 / 外网的核心虚拟交换机。
docker0 是你安装 Docker 引擎时,Docker 自己在 Linux 内核里创建的一个虚拟网桥。它的宿命是为通过 docker run 跑起来的普通容器分配 172.18.0.3 的 IP。
# 访问流程
# 文字流程解释
宿主机访问
192.168.1.50:8080,数据包到达物理网卡 ens160;Linux iptables 匹配 Docker 自动创建的 DNAT 规则:
将访问
:8080的流量,目标 IP + 端口替换为172.18.0.3:80;修改后的数据包交给自定义网桥
docker0;通过 veth pair 传递到容器 eth0,容器服务接收请求;
容器返回响应包,网桥回传给宿主机;
iptables 做 SNAT 地址还原,最终响应返回宿主机客户端。
#
你可能现在会产生巨大的好奇:为什么我们用 Docker 容器技术起家,到了 K8s 里,Docker 自己的网桥(docker0)反而成了摆设?
在以前的历史版本中,K8s 依赖 Docker 运行时,创建 Pod 时确实会借用 Docker 的底层网络。但由于我们这次搭建集群彻底抛弃了 Docker 引擎,改用了 Containerd 容器运行时,整个网络生命周期的掌控者就彻底换人了。
在传统的 Docker 单机网络中,容器依赖 docker0 网桥进行 NAT 转发和单机通信,跨主机网络需要依赖繁琐的端口映射或 Overlay Overlay。
而我们在搭建生产级 K8s 集群时,全面采用了 CRI(Containerd)与 CNI(Flannel) 的解耦架构。此时,Docker 引擎自带的 docker0 网卡已被完全弃用(处于 DOWN 状态)。
K8s 遵循 IP-per-Pod 的扁平化网络原则。Containerd 调用的 CNI 插件会在内核中创建全新的 cni0 网桥和 flannel.1 隧道网卡,直接通过 VXLAN 技术 实现跨宿主机的三层直接互通,消灭了传统 Docker 网络的端口冲突与双重 NAT 损耗,从而保障了分布式微服务网关的高性能通信。”