容器、Pod、虚拟机与宿主机网络通信全解:看这一篇就够了

0 阅读5分钟

在日常开发与部署过程中,很多人一开始都会有这样的疑惑:

  • 容器之间是怎么通信的?
  • 容器怎么访问宿主机?宿主机又如何访问容器?
  • Kubernetes 中 Pod 的网络和 Docker 容器一样吗?
  • 容器跨机器是怎么连通的?是用了物理网络还是隧道?

这些问题都指向一个核心话题:容器网络的通信机制。本篇将用通俗易懂但技术精准的方式,全面梳理容器、Pod、虚拟机与宿主机之间的网络交互原理,涵盖 Docker 和 Kubernetes 两大场景。


一、容器网络基础:veth、bridge、NAT 是关键

1. veth pair:容器网络的桥梁

当你运行一个容器时,Docker 会创建一对虚拟以太网接口(veth pair):

  • 一端连接到容器内部,作为容器的 eth0;
  • 另一端连接到宿主机的桥接网卡(如 docker0)。

这就好比用一根网线把容器和宿主机的虚拟交换机连起来。

2. bridge:Docker 默认网络

Docker 默认会创建一个叫 docker0 的 Linux 网桥(bridge),作用如下:

  • 给每个容器分配一个私有 IP(通常是 172.17.0.X 段);
  • 容器通过该桥接设备与宿主机通信;
  • 同一 bridge 网络下的容器可以直接互通。

3. NAT:容器访问外网的跳板

容器虽然拥有自己的私有 IP,但要访问外网,还需要宿主机做 NAT 转换(SNAT):

[容器 172.17.0.2] → [docker0] → [宿主机公网网卡] → Internet

宿主机通过 iptables 做地址伪装,实现容器出网访问功能。


二、容器与宿主机的通信模型详解

1. 宿主机访问容器

方式一:容器私有 IP(仅限 bridge 内)

curl http://172.17.0.2:80

要求容器和宿主机在同一个网络命名空间下,且未开启防火墙限制。

方式二:端口映射(推荐方式)

docker run -p 8080:80 nginx

此时访问宿主机的 localhost:8080,就等同于访问容器内的 80 端口。

2. 容器访问宿主机

容器内访问宿主机方式:

  • 使用默认网关 IP:在容器内查看 ip route,默认网关即为宿主机地址;
  • Docker for Mac/Win 专用地址:host.docker.internal 是官方内置别名。

三、容器与容器之间通信

1. 同宿主机,默认网络

两个容器都连接在 docker0 桥接网络时,它们的 IP 是同一子网,可以互通:

docker network inspect bridge

也可以通过容器名称通信(如果在用户自定义网络下):

docker network create my-net
docker run --network my-net --name web nginx
docker run --network my-net busybox ping web

2. 跨宿主机通信 —— Overlay 网络

当容器部署在不同宿主机上(如 Swarm 或 Kubernetes 集群中),就必须使用 Overlay 网络:

  • 原理:将容器的网络包通过 VXLAN、IPIP 或 eBPF 封装为宿主机级别通信;
  • 主流方案
    • Docker Swarm Overlay
    • Flannel(VXLAN、UDP)
    • Calico(基于 BGP 路由)
    • Cilium(eBPF + L7 安全)

网络通信流程图:

[容器A] --veth--> [Bridge A] --Overlay--> [Bridge B] <--veth-- [容器B]

四、Pod 网络模型与容器的不同点

1. 什么是 Pod?

在 Kubernetes 中,Pod 是最小的调度单元,一个 Pod 可以包含多个容器,这些容器共享:

  • 同一网络命名空间(network namespace)
  • 同一 IP 地址、端口空间

也就是说,Pod 内容器可以通过 localhost 互相访问!

2. Pod 与容器的网络区别

特性Docker 容器K8s Pod
网络 IP容器私有 IPPod 拥有独立 IP
容器间通信默认不同网段不可通Pod 内可通过 localhost
默认网络bridgeCNI 插件统一管理
跨宿主机通信手动配置 Overlay自动使用 CNI Overlay

五、虚拟机与容器之间的网络交互

当你将容器部署在虚拟机上(比如公有云的 ECS、私有云的 KVM、VMware),通信路径如下:

1. 虚拟机访问容器

  • 通过虚拟机的宿主网络访问 Docker 端口映射;
  • 若容器未映射端口,需要登录虚拟机内部使用容器 IP 访问。

2. 容器访问虚拟机外部服务

容器 → 虚拟机出口 NAT → 外部网络。

注意:如果使用云厂商的安全组、VPC 网络,还需配置相应规则开放端口。


六、容器网络常见的 7 种类型(Docker)

Docker 实际支持以下 7 种网络类型(截至 Docker v24):

网络类型说明
bridge默认网络类型,容器通过虚拟桥接互联
host容器与宿主机共用网络命名空间
none完全禁用网络
container:多容器共享一个容器的网络空间(如 Pod 模式)
overlay跨宿主机网络(Swarm 模式)
macvlan容器像真实物理设备一样拥有独立 MAC 地址,接入物理网段
ipvlan类似 macvlan,但不生成 MAC,适合高性能网络场景

七、实战建议:选哪种网络模式?

场景推荐网络模式
单机本地测试bridge
网络性能优先,无隔离需求host
容器模拟独立主机部署macvlan
跨宿主机部署集群overlay(K8s/Swarm)
云上部署容器通常由 CNI 自动配置(Flannel/Calico)

八、总结

容器网络虽然看似复杂,但只要理解了 Linux 网络命名空间、veth pair、桥接和 NAT 的基础概念,就能把握大部分网络模型的核心原理。在 Kubernetes 中,Pod 的引入进一步简化了应用层对网络的认知,实现了平台级统一抽象。

掌握容器网络,不只是让你能“跑起来”,更是成为云原生时代合格架构师的必经之路。