默认网络模式

默认网络模式

面试题

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。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容