Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Docker 网络原理

下面这份是从 Linux 网络底层 -> Docker 网络模型 -> 数据包路径 -> 访问场景 -> 常见坑《Docker 网络原理全景解析》

不是“怎么用”,而是为什么这样设计、数据包怎么走

一、一句话总览(先背)

Docker 网络本质是:Linux Network Namespace + veth + bridge + iptables NAT


二、Docker 网络的四个核心组件

1️⃣ Network Namespace(网络隔离)

  • 每个容器有独立网络栈

  • 包括:

    • 网卡
    • IP
    • 路由表
    • 防火墙规则

📌 容器 ≠ 进程共享网络(除非 host)


2️⃣ veth pair(虚拟网线)

container eth0  <====>  vethxxxx (host)
  • 成对出现
  • 一端进容器,一端在宿主机

📌 veth 就是“网线”


3️⃣ Linux bridge(docker0)

container
 veth
docker0 (bridge)
宿主机网卡
  • docker0 是二层交换机
  • 容器 IP 在同一子网

4️⃣ iptables / NAT(地址转换)

  • SNAT:容器访问外网
  • DNAT:外部访问容器

📌 这是访问控制的核心


三、Docker 默认网络:bridge

结构图(文字版)

[container] --veth--> [docker0] --NAT--> [eth0] --> Internet

容器 IP 举例

docker inspect container | grep IPAddress
172.17.0.2

四、外部 -> 容器(端口映射原理)

1️⃣ 命令

docker run -p 8080:80 nginx

2️⃣ 数据包路径

Client
宿主机 8080
  ↓ (DNAT)
容器 80

iptables 规则本质是:

PREROUTING: 8080 -> 172.17.0.2:80

📌 容器无需感知外部端口


3️⃣ 没有 -p 会怎样?

  • 外部无法访问
  • 容器只在内部网络可见

五、容器 -> 外部(SNAT)

示例

curl www.baidu.com

数据包路径

container 172.17.0.2
docker0
  ↓ (SNAT)
宿主机 IP
Internet

iptables 做了:

POSTROUTING: 172.17.0.0/16 -> 宿主机 IP

📌 所以外部只看到宿主机 IP


六、容器 ↔ 容器通信

同一 bridge 网络

services:
  api:
  db:

访问方式:

api -> db:5432
  • 📌 Docker 内置 DNS
  • 📌 不要用 IP

不同网络

  • 默认不通
  • 可手动 connect
docker network connect net1 container

七、Docker 网络类型全解


1️⃣ bridge(默认)

  • NAT

  • 有 IP

  • 最常用

  • ✅ 开发 / 测试

  • ❌ 高性能数据库(慎用)


2️⃣ host(性能最强)

network_mode: host

特点:

  • 无隔离
  • 无 NAT
  • 无端口映射

📌 容器端口 = 宿主机端口

  • ✅ 高性能服务
  • ❌ 端口冲突

3️⃣ none(完全隔离)

  • 无网卡

  • 无网络

  • ✅ 安全测试

  • ✅ 离线任务


4️⃣ overlay(多主机)

  • VXLAN

  • Swarm / K8S

  • ❌ 性能下降

  • ✅ 跨主机通信


八、DNS 解析原理(常考)

Docker 内置 DNS

127.0.0.11
  • service name -> 容器 IP
  • 同网络可见

📌 DNS 不是 /etc/hosts


九、特殊访问场景(高频)


1️⃣ 容器访问宿主机

Linux(推荐)

--add-host=host.docker.internal:host-gateway
container -> host.docker.internal

2️⃣ 宿主机访问容器

  • 使用端口映射
  • 或直接访问容器 IP(仅本机)

3️⃣ 容器访问局域网

  • NAT 转发
  • 路由允许即可

十、iptables 表与链(进阶)

用途
nat DNAT / SNAT
filter 防火墙
mangle 改包
raw 连接追踪

Docker 主要使用:

  • nat
  • filter

十一、常见网络坑(真实)

  • ❌ 忘记 -p
  • ❌ 服务只监听 127.0.0.1
  • ❌ 用 IP 通信
  • ❌ overlay 性能期望过高
  • ❌ 容器 DNS 被覆盖

十二、总结

Docker 网络基于 Linux Namespace 隔离,每个容器有独立网络栈,通过 veth 连接到宿主机的 bridge。外部访问通过 DNAT 端口映射,容器访问外部通过 SNAT。容器间通信依赖内置 DNS。

veth 是网线
bridge 是交换机
iptables 是路由器 + 防火墙