docker-容器网络深度原理

Docker 容器网络深度原理

·6 分钟阅读·2274 字

Docker 容器网络完整原理:网络模式、veth pair、iptables、DNS、跨主机通信

📋 目录

Docker 容器网络深度原理

一、前置基础

Docker 网络依托 Linux 内核:Network Namespace、veth pair、bridge、iptables、路由

  • Network Namespace:实现网络隔离,每个容器独立协议栈(网卡、IP、路由、arp);
  • veth pair:成对虚拟网卡,一端宿主机网桥、一端容器ns;

Docker内置5种网络驱动:bridge(默认)、host、none、container、overlay生产最常用bridge+overlay

# 查看网络
docker network ls

二、Bridge桥接模式(默认,单机容器互通+外网访问)

1.架构结构

  1. 宿主机自动生成网桥:docker0(linux网桥设备)
  2. 新建容器:创建一组veth pair:vethxxx(宿主机侧) <--> eth0(容器内)
  3. veth宿主机端挂载绑定到docker0网桥;容器eth0落在自身netns。
外网网卡eth0 ←→ 宿主机内核路由/iptables ←→ docker0网桥

               veth pair ←→ 容器eth0(独立ns)

2.三个通信场景

  1. 容器 ↔ 同宿主机其他容器
    经过docker0二层转发,同网段直接互通。
  2. 容器 → 外网互联网
    SNAT:iptables nat表POSTROUTING做源地址转换,容器内网IP→宿主机公网IP出站。
  3. 外网 → 容器(端口映射-p)
    DNAT:-p 宿主机端口:容器端口,iptables PREROUTING把宿主机端口流量转发容器内网IP。

-p 8080:80本质就是iptables DNAT规则。

3.缺点

只能单机互通,跨宿主机容器不能直接通信。

三、Host主机模式

容器不创建独立Network Namespace,直接共用宿主机网络协议栈。

  1. 无docker0、无veth,容器IP=宿主机IP;
  2. 启动端口占用宿主机端口,无需端口映射;
  3. 隔离最弱,性能最好,适合监控类、高性能组件。
docker run --net=host xxx

四、None无网络模式

容器创建独立ns,但不配置任何网卡、IP、路由,完全断网;仅本地磁盘读写,安全隔离场景。

docker run --net=none xxx

五、Container复用容器网络

新容器复用已有容器的Network Namespace,共用一张网卡、同一个IP。
典型场景:sidecar架构(日志采集容器和业务容器共享网络)

# 复用容器id为abc的网络
docker run --net=container:abc xxx

六、Overlay跨主机网络(Swarm集群跨宿主机互通,重点)

原理:VXLAN隧道技术(内核封装UDP报文)

  1. 跨宿主机容器不在同一docker0,通过Overlay驱动+VXLAN实现二层互通;
  2. 数据包:容器报文 → 内核封装VXLAN头(UDP 4789端口) → 宿主机网卡 → 对端宿主机解封装 → 目标容器。
  3. 架构分层:
  • 每个节点内部:本地bridge;
  • 跨节点:VXLAN隧道打通二层,所有Overlay容器同网段。

适用:Docker Swarm集群、多机器容器互通。

# 创建overlay跨主机网络
docker network create -d overlay my-over

七、自定义bridge(生产规范替代docker0)

不使用默认docker0,自建网桥,便于网段规划:

docker network create -d bridge my-bridge
docker run --net=my-bridge xxx

八、关键内核知识点(面试高频)

  1. veth pair特点:管道型虚拟网卡,一端收、一端发,成对出现;
  2. namespace隔离:容器看不到宿主机真实网卡,内核实现网络资源隔离;
  3. 端口映射底层 = iptables DNAT/SNAT
  4. Overlay底层=VXLAN,封装在UDP,跨三层网络实现二层互通。

九、Obsidian面试卡片

tags: #Docker #容器网络 #bridge #overlay #VXLAN #面试
题型:原理简答
难度:高级
题目:简述Docker五种网络模式原理与适用场景?
精简答案:
1.bridge默认:docker0网桥+veth pair,单机容器互通,iptables实现端口映射与外网访问;
2.host:共用宿主机ns,无隔离,性能高,共用宿主机IP端口;
3.none:空网络,无网卡,完全隔离断网;
4.container:复用其他容器ns,同IP,sidecar常用;
5.overlay:基于VXLAN隧道,跨宿主机容器二层互通,集群使用。
拓展:bridge靠SNAT/DNAT实现内外网互通,Overlay依靠内核VXLAN封装UDP报文跨机器传输。
易错点:默认docker0是bridge,无法跨主机通信,跨主机需要overlay。
关联:[[Docker 联合文件系统|Docker 联合文件系统 Overlay2]]

关联文档

  • ../network/网络 — 网络基础
  • ../kubernetes/service/K8s Service 核心原理 — K8s 网络