Docker 网络模式与通信机制
前言
一、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 分配
✅ 能进行跨容器、跨网络通信配置