Docker 容器网络全景:单机容器网络到 Kubernetes 对照

1. 容器网络身份

Docker 先给容器一个 network namespace。

容器只看到自己的 eth0、IP、路由、DNS 和网关。

背后通常是 veth 接到宿主机 bridge。

2. bridge / NAT

默认 bridge 或 user-defined bridge 负责单机容器互联。

容器出站通常经 MASQUERADE / SNAT,外部看到宿主机 IP。

自定义 bridge 比默认 bridge 更适合项目隔离和 DNS。

3. 端口发布

EXPOSE 只是镜像元数据。

-p 8080:80 才把 HostIP:8080 转到 ContainerIP:80。

应用还必须监听 0.0.0.0,而不是只监听 127.0.0.1。

4. DNS / Compose

User-defined network 里可以按容器名 / alias 解析。

Compose 默认创建项目网络,service name 是稳定入口。

容器间访问用 service name + container port,不用宿主机 published port。

5. 网络驱动选择

bridge:单机默认。 host:共享宿主网络。 none:只有 loopback。 overlay:Swarm / 多 Docker host。 macvlan / ipvlan:接入物理网络。

6. 防火墙 / 数据面

Docker 会写 iptables / nftables 规则。

端口发布、bridge 隔离、NAT 出站都依赖这些规则。

UFW / firewalld 看到的结果可能和直觉不同,排障要看 Docker 自己的链。

7. 和 Kubernetes 接上

Docker 解释单机容器如何接入 Linux 网络。

Kubernetes 在此之上增加 Pod、CNI、Service、EndpointSlice、kube-proxy/eBPF、Ingress/Gateway 和 NetworkPolicy。

-p 不等于 Service;host network 不等于生产入口。

8. 排障路径

容器内:ip addr / ip route / resolv.conf / getent hosts。

Docker 层:network inspect / ps ports。

宿主机:ss / iptables-save / nft / conntrack。

先分清:出站、入站、容器间通信。

veth 接入 bridge外部入口靠端口发布内部互访用名字按需求选 driver落到宿主机规则上升到 K8s出问题按层排主解释挂回 Docker MOC旧卡片扩展K8s 对照Docker 入口Compose 网络运行时边界dockerd/containerd/runc云原生总图