李成笔记网

专注域名、站长SEO知识分享与实战技巧

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

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

  • 容器之间是怎么通信的?
  • 容器怎么访问宿主机?宿主机又如何访问容器?
  • 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

容器私有 IP

Pod 拥有独立 IP

容器间通信

默认不同网段不可通

Pod 内可通过 localhost

默认网络

bridge

CNI 插件统一管理

跨宿主机通信

手动配置 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 的引入进一步简化了应用层对网络的认知,实现了平台级统一抽象。

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言