docker三种网络类型详解

3 阅读3分钟

在 Docker 中,bridgehostnone(你看到的 null 实际对应 none)是三种内置网络驱动(network drivers),它们决定了容器如何与外部网络、其他容器以及宿主机通信。

下面详细解释它们的区别和适用场景:


1. bridge(默认网络)

  • 作用:为容器创建一个私有内部网络,容器之间可通过 IP 或容器名(在用户自定义 bridge 网络中)通信,但与宿主机网络隔离。
  • 特点
    • 容器获得独立的 IP(如 172.17.0.x)。
    • 容器访问外网需通过 NAT(网络地址转换)。
    • 外部访问容器需显式映射端口(-p 8080:80)。
    • 用户自定义 bridge 网络(如你的 bookstack-net, monitoring)支持自动 DNS 解析(可用容器名通信),而默认 bridge 网络不行。
  • 适用场景
    • 大多数应用(如 Web 服务、数据库)。
    • 需要容器间隔离但又能通信的场景。
  • 示例
    docker run -d --network bookstack-net --name app nginx
    

2. host

  • 作用:容器直接使用宿主机的网络命名空间,无网络隔离。
  • 特点
    • 容器没有自己的 IP,直接绑定到宿主机的 IP 和端口。
    • 性能最好(无 NAT 开销)。
    • 端口冲突风险高:如果宿主机已占用 80 端口,容器无法再用。
    • 不支持端口映射(-p 无效)。
  • 适用场景
    • 对网络性能要求极高的服务(如高性能代理、监控 agent)。
    • 需要监听大量端口的服务(避免端口映射繁琐)。
  • 示例
    docker run -d --network host nginx  # 直接占用宿主机 80 端口
    

3. none(你看到的 null 是其内部名称)

  • 作用:容器完全无网络(只有 loopback 接口 lo)。
  • 特点
    • 容器无法访问外网,也无法被外部访问。
    • 适用于纯离线计算任务(如数据处理、批处理作业)。
  • 适用场景
    • 安全敏感型任务(禁止任何网络通信)。
    • 只需文件系统交互的任务(通过 volume 共享数据)。
  • 示例
    docker run -it --network none alpine ip addr  # 只能看到 lo 接口
    

🆚 对比总结

特性bridgehostnone
网络隔离✅ 完全隔离❌ 无隔离(共享宿主机网络)✅ 完全隔离
容器 IP有(私有 IP)无(直接用宿主机 IP)无(仅 127.0.0.1
访问外网✅(通过 NAT)✅(直接访问)
外部访问容器-p 映射端口直接访问宿主机端口
容器间通信✅(同网络内)✅(通过宿主机 localhost)
性能开销中(NAT 转换)
典型用途Web 应用、微服务高性能服务、监控离线计算、安全任务

🔍 关于你的输出说明

  • bridge:Docker 默认的 bridge 网络(不推荐直接使用,建议用自定义 bridge)。
  • host:宿主机网络模式。
  • none:在 docker network ls 中显示为 null(这是 Docker 内部标识,实际使用时仍叫 none)。

💡 最佳实践建议

  1. 优先使用自定义 bridge 网络(如你的 bookstack-net):

    docker network create my-net
    docker run --network my-net ...
    
    • 支持容器名 DNS 解析(如 ping mysql-container)。
    • 避免端口冲突(不同网络可复用相同端口)。
  2. 慎用 host 模式

    • 仅在明确需要高性能且能管理端口冲突时使用。
  3. none 用于特殊场景

    • 如运行加密计算任务,确保无网络泄露风险。

如果有具体应用场景(比如部署 BookStack 或 OpenStack),可以进一步讨论网络配置方案! 😊