Docker 网络模式与通信机制
前言
在前几章中,我们已经掌握了 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 分配
✅ 能进行跨容器、跨网络通信配置
更多推荐


所有评论(0)