默认网络模式
面试题
Docker 默认有哪几种网络模式?各有什么特点和适用场景?
标准答案
Docker 安装后自动创建三个默认网络:bridge、host、none。运行容器时通过 --network 指定,不指定则使用 bridge 模式。
三种默认网络
# 查看默认网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
98c3f2f1b5d3 bridge bridge local
7d3e4a9b1c6f host host local
a5b8e9c2d4f1 none null local
1. bridge 模式(默认)
# 不指定 --network 时的默认模式
docker run -d --name web nginx
# 或显式指定
docker run -d --network bridge --name web nginx
特点:
– 容器拥有独立的网络命名空间
– 通过 docker0 网桥与其他容器通信
– 通过端口映射(-p)对外暴露服务
– 默认 NAT 访问外网
IP 分配:
– 默认子网:172.17.0.0/16
– 容器通常分配到 172.17.0.x
– 宿主机(网桥):172.17.0.1
2. host 模式
# 容器直接使用宿主机网络栈
docker run -d --network host --name web nginx
# host 模式下,-p 参数无效
docker run -d --network host -p 80:80 nginx
# -p 会被忽略,因为容器直接使用宿主机端口
特点:
– 容器不隔离网络命名空间
– 共享宿主机 IP 和端口
– 性能最高(无 NAT 转换)
– 端口冲突风险(和宿主机共享)
适用场景:
– 网络性能敏感的应用(如视频流、游戏服务器)
– 需要大量端口映射的应用
– 监控工具需要访问宿主机网络
安全注意:
# host 模式降低了隔离性
# 容器内获取到的权限和宿主机一致
# 不是生产环境的推荐选项
3. none 模式
# 容器没有网络接口
docker run -d --network none --name isolated alpine sleep 3600
# 容器内只有一个 lo(回环)接口
docker exec isolated ip addr
# 1: lo: ...
# 没有 eth0 接口
特点:
– 容器完全隔离网络
– 只有 lo 回环接口
– 无法访问外网
– 外网也无法访问容器
适用场景:
– 安全性要求极高的离线计算
– 处理敏感数据的容器(如密钥生成)
– 不需要网络功能的批处理任务
对比表格
| 特性 | bridge | host | none |
|---|---|---|---|
| 网络隔离 | ✅ 完全隔离 | ❌ 共享宿主机 | ✅ 完全隔离 |
| 外网访问 | ✅ NAT 转换 | ✅ 直接访问 | ❌ 无网络 |
| 端口映射 | ✅ -p 参数 | ❌ 直接使用宿主机端口 | ❌ 不支持 |
| 容器间通信 | ✅ 通过 IP | ✅ 通过 localhost | ❌ 无法通信 |
| 性能 | 有 NAT 开销 | 无额外开销 | N/A |
| 安全性 | 中等 | 较低 | 最高 |
| 配置复杂度 | 简单 | 最简单 | 最简单 |
常用场景示例
# bridge 模式:大多数应用
docker run -d \
--name api \
-p 3000:3000 \
-e DB_HOST=mysql \
--network mynet \
myapi:latest
# host 模式:性能敏感或需要大量端口
docker run -d \
--network host \
--name file-server \
myfileserver:latest
# none 模式:安全隔离
docker run -d \
--network none \
--name sensitive-compute \
mysecureapp:latest
面试高频问题
问:bridge 模式下,容器之间为什么可以通信?
因为所有 attach 到同一个 bridge 网络的容器,都连接到了同一个 docker0 网桥上。网桥工作在二层,可以转发以太网帧,所以容器之间可以直接通信。
问:host 模式下需要注意什么?
端口冲突是第一风险。如果宿主机 80 端口已被占用,host 模式的 Nginx 容器就无法启动。另外,容器的网络隔离性几乎为零。
问:none 模式的容器真的完全不能联网吗?
是的,默认没有任何网络接口。但如果后续需要联网,可以通过 docker network connect 将其加入其他网络:
docker network connect mynet isolated-container
# 现在 isolated-container 既有 lo,也有 mynet 的 eth0
问:默认 bridge 有什么不足?怎么解决?
默认 bridge 的问题:
– 容器间不能通过容器名通信(只能用 IP)
– DNS 解析受限
解决方案:使用自定义 bridge 网络,支持自动 DNS 解析。
总结
三种默认网络模式:bridge(默认,隔离 + 可通信)、host(共享,高性能,低隔离)、none(无网络,最高隔离)。记住一句话:大多数情况用 bridge,性能敏感用 host,安全敏感用 none。


暂无评论内容