前言

一、Docker 网络基础原理

1️⃣ 网络命名空间(Network Namespace)

2️⃣ veth pair 虚拟网卡对

3️⃣ Docker 网络命令概览

二、Docker 默认的四种网络模式

2.1 Bridge 模式(默认模式)

2.2 Host 模式

2.3 None 模式

2.4 Container 模式

三、自定义网络

3.1 创建自定义网络

3.2 查看网络详情

3.3 在自定义网络中创建容器

3.4 为容器指定静态 IP

3.5 删除自定义网络

四、容器间通信案例

案例 1:同网络容器互通

案例 2:跨网络容器通信

案例 3:容器访问宿主机

五、Bridge 网络原理解析

5.1 宿主机访问容器原理

六、网络命令速查表

七、网络故障排查

八、总结

前言

在前几章中,我们已经掌握了 Docker 镜像、容器以及生命周期管理。 然而在实际生产部署中,容器之间的网络通信与访问控制 才是真正让容器系统“活起来”的关键。

本篇将深入讲解:

  • Docker 网络的基本原理

  • 四种网络模式(bridge、host、none、container)

  • 自定义网络的创建与容器通信

  • docker0 桥接机制与 IP 分配

  • 常见网络命令与实战案例


一、Docker 网络基础原理

Docker 容器的网络是基于 Linux 的 Namespace(命名空间)veth pair 虚拟网卡对 实现的。

1️⃣ 网络命名空间(Network Namespace)

每个容器都会创建一个独立的网络命名空间,拥有:

  • 独立的网卡(eth0)

  • 独立的 IP 地址

  • 独立的路由表和端口空间

💡 理解方式: 容器之间相互隔离的网络环境,就像不同虚拟机的独立网卡。


2️⃣ veth pair 虚拟网卡对

Docker 使用 veth pair 机制连接容器和宿主机:

  • 一端位于容器内部(eth0)

  • 另一端位于宿主机(vethXXXX)

  • 两端数据传递相互映射

容器eth0 <----> vethxxxx <----> docker0 (bridge)

总结: docker0 是所有容器的默认网桥,相当于“虚拟交换机”。


3️⃣ Docker 网络命令概览

命令 说明
docker network ls 查看所有网络
docker network inspect <name> 查看网络详情
docker network create <name> 创建自定义网络
docker network rm <name> 删除网络
docker network connect <network> <container> 将容器连接到网络
docker network disconnect <network> <container> 从网络断开容器

二、Docker 默认的四种网络模式

执行以下命令查看所有网络:

docker network ls

默认输出:

NETWORK ID     NAME      DRIVER    SCOPE
a5f3d...       bridge    bridge    local
c1a9b...       host      host      local
f9a41...       none      null      local

2.1 Bridge 模式(默认模式)

🧩 关键点: 容器通过 docker0 虚拟网桥与宿主机通信。

docker run -d --name web1 nginx

此时容器会自动分配 IP(如 172.17.0.2),通过 docker0 网桥 NAT 到外部访问。

查看容器 IP:

docker inspect -f '{{.NetworkSettings.IPAddress}}' web1

查看宿主机 docker0:

ip addr show docker0

示意图:

[容器 eth0] ↔ [vethxxxx] ↔ [docker0 bridge] ↔ [宿主机 eth0]

适用场景:

  • 默认通信模式

  • 支持跨容器通信(同网络)

  • 支持宿主机访问容器


2.2 Host 模式

容器共享宿主机网络命名空间,不再使用独立 IP。

docker run -d --network host nginx

容器直接使用宿主机的 IP 和端口。

⚠️ 注意:

  • 性能最高,但端口会与宿主机冲突。

  • 适用于高性能、低延迟场景(如监控服务、日志采集)。


2.3 None 模式

完全禁用网络,只保留 loopback。

docker run -d --network none centos sleep 3600

容器无法访问外部,也不能被访问。

💡 用途:

  • 安全隔离测试

  • 手动配置网络场景


2.4 Container 模式

让一个容器共享另一个容器的网络命名空间。

docker run -d --name web1 nginx
docker run -it --name test --network container:web1 centos /bin/bash

test 容器将与 web1 共用 IP、端口、网络栈。

用途:

  • 容器协同工作场景(如 Sidecar 模式)


三、自定义网络

默认 bridge 网络不支持容器名互相解析,因此推荐使用 自定义 bridge 网络

3.1 创建自定义网络

docker network create --driver bridge mynet

3.2 查看网络详情

docker network inspect mynet

输出示例:

"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1",

3.3 在自定义网络中创建容器

docker run -d --name web1 --network mynet nginx
docker run -d --name web2 --network mynet nginx

测试互通:

docker exec -it web1 ping web2

💡 在同一个自定义网络下,容器可通过 容器名 直接通信,无需使用 IP。


3.4 为容器指定静态 IP

docker network create --subnet=172.20.0.0/16 mynet2
docker run -d --name web1 --network mynet2 --ip 172.20.0.10 nginx

验证:

docker exec -it web1 ip addr

3.5 删除自定义网络

docker network rm mynet

⚠️ 必须先删除该网络中的所有容器。


四、容器间通信案例

案例 1:同网络容器互通

docker network create mynet
docker run -d --name app1 --network mynet nginx
docker run -d --name app2 --network mynet nginx

在 app1 内 ping app2:

docker exec -it app1 ping app2

案例 2:跨网络容器通信

可以将容器同时加入两个网络:

docker network connect mynet2 app1

断开连接:

docker network disconnect mynet2 app1

案例 3:容器访问宿主机

宿主机访问容器:

http://localhost:8080

容器访问宿主机(Linux):

ping host.docker.internal

💡 在 Docker Desktop (Windows/Mac) 环境下 host.docker.internal 为宿主机别名。 在 Linux 中可通过 --add-host 参数手动添加:

docker run -d --add-host=host.docker.internal:172.16.0.1 nginx

五、Bridge 网络原理解析

Docker 在安装时会自动创建 docker0 网桥。 查看网桥配置:

brctl show

默认输出:

bridge name bridge id       STP enabled interfaces
docker0     8000.0242a0b14d9f no     veth3a1e2c1

docker0 就是容器网络的“交换机”,veth 对充当“网线”。


5.1 宿主机访问容器原理

宿主机通过 NAT 转发实现访问:

宿主机端口 8080 → docker0 → 容器 IP:80

通过以下命令查看转发规则:

iptables -t nat -L -n

六、网络命令速查表

命令 说明
docker network ls 查看所有网络
docker network inspect <name> 查看网络详细信息
docker network create <name> 创建自定义网络
docker network rm <name> 删除网络
docker network connect 将容器连接到网络
docker network disconnect 从网络断开容器
ip addr show docker0 查看虚拟网桥 IP
brctl show 查看网桥与接口映射

七、网络故障排查

问题 检查方向 命令示例
容器无法访问外网 检查宿主机 NAT iptables -t nat -L -n
容器间不互通 检查是否同一网络 docker inspect 容器名
ping 不通主机 检查 DNS 设置 cat /etc/resolv.conf
自定义 IP 不生效 检查 network 子网配置 docker network inspect mynet

八、总结

通过本篇学习,你应掌握以下技能:

✅ 理解 Docker 网络原理与 veth 机制

✅ 熟悉四种网络模式及其适用场景

✅ 掌握自定义网络创建与容器通信

✅ 了解 docker0 桥接机制与 IP 分配

✅ 能进行跨容器、跨网络通信配置

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐