Docker 在运行容器时,通过 Network Namespace 实现网络隔离,并提供多种网络模式(Network Mode) 。下面系统介绍各模式,并给出实用案例。
一、查看 Docker 网络模式
bash
bash
docker network ls
默认会看到:
-
bridge(默认) -
host -
none
二、Docker 常见网络模式详解
1️⃣ bridge(桥接模式,默认)
说明
-
每个容器分配独立 IP
-
通过
docker0虚拟网桥通信 -
外部访问需 端口映射
-p
✅ 最常用
❌ 跨主机不支持(需 overlay)
启动容器
docker run -d --name nginx-bridge \
-p 8080:80 \
nginx
访问:
http://宿主机IP:8080
查看网络
docker inspect nginx-bridge | grep IPAddress
2️⃣ host(主机模式)
说明
-
容器直接使用宿主机网络栈
-
无 NAT、无端口映射
-
容器端口 = 宿主机端口
✅ 性能最好、少一层网络转换
❌ 失去网络隔离、端口冲突风险
启动容器
docker run -d --name nginx-host \
--network host \
nginx
访问(直接用宿主机 80 端口):
http://宿主机IP
⚠️ Windows / Mac(Docker Desktop)上 --network host不生效或表现不同
3️⃣ none(无网络)
说明
-
容器内只有
lo(127.0.0.1) -
无法访问外网、无法被访问
✅ 用于高安全 / 离线计算 / 自定义网络
docker run -it --network none busybox sh
ping baidu.com # 失败
4️⃣ container(共享另一个容器的网络)
说明
-
多个容器共享同一个 Network Namespace
-
类似
--network host,但是共享的是某容器
✅ 常用于 Sidecar(日志、监控)
# 主容器
docker run -d --name web nginx
# 共享其网络
docker run -it --network container:web busybox sh
在 busybox 中:
wget localhost:80
5️⃣ 自定义 bridge 网络(推荐生产使用)
说明
-
自带 DNS 容器名解析
-
更好的隔离性
bash
bash
docker network create mynet
bash
bash
docker run -d --name db --network mynet mysql:8
docker run -d --name app --network mynet myapp
在 app容器中可直接解析:
bash
bash
ping db
三、模式对比总结
| 模式 | 隔离 | 端口映射 | DNS解析 | 典型场景 |
|---|---|---|---|---|
| bridge | ✅ | ✅ -p |
❌(默认) | 普通服务 |
| host | ❌ | ❌ | ❌ | 高性能/端口多 |
| none | ✅ | ❌ | ❌ | 离线/安全 |
| container | 共享 | ❌ | 共享 | Sidecar |
| 自定义 bridge | ✅ | ✅ | ✅ | 生产微服务 |