docker的网络模式

理解 Docker 的网络模式是使用容器化时的核心之一,因为它直接影响到容器之间、容器与宿主机之间,以及容器与外部网络之间的通信方式。下面我详细给你拆解一下:


🔹 Docker 的常见网络模式

Docker 提供了几种网络模式(network driver),常用的有以下几种:

1. bridge(默认模式)

  • 特点

    • 当你运行 docker run -d nginx 没有指定网络时,容器会被分配到一个默认的 bridge 网络(docker0 网桥)
    • 容器有自己的 独立 IP(虚拟网卡),在宿主机 docker0 网卡上桥接。
    • 容器之间通过 容器 IP 或者 自定义网络中的容器名(DNS) 来通信。
    • 宿主机可以通过端口映射(-p 8080:80)来访问容器服务。
  • 使用场景:大多数应用场景,容器之间需要隔离,但也能通过网络互通。


2. host

  • 特点

    • 容器 不再有独立的网络命名空间,直接使用宿主机的网络栈。
    • 容器和宿主机 共享 IP 和端口,没有 NAT。
    • 启动时指定 --network host
  • 优点:性能最好,没有 NAT 转换;适合需要和宿主机高度集成的服务,比如监控、日志采集。

  • 缺点:端口冲突(容器占用的端口就是宿主机的端口),隔离性差。


3. none

  • 特点

    • 容器完全没有网络接口(除了 lo 回环)。
    • 适合需要完全自定义网络配置的场景(比如自己在容器里跑 VPN client)。

4. container

  • 特点

    • 新容器和指定的已有容器 共享网络命名空间
    • 相当于两个容器共用同一个网络接口和 IP。
  • 使用方式

    1
    2
    docker run -d --name c1 busybox sleep 3600
    docker run -it --network container:c1 busybox sh

    c1 和新容器共享网络。

  • 应用场景:当你希望两个容器看起来像在同一台机器上(例如应用和 sidecar)。


5. 自定义 bridge 网络

  • 默认的 bridge 网络用容器名互相访问不方便,所以推荐创建自定义 bridge。

  • 命令:

    1
    2
    3
    docker network create mynet
    docker run -d --network mynet --name app nginx
    docker run -it --network mynet busybox ping app
  • 容器可以通过 名字直接 DNS 解析,更适合微服务。


6. overlay 网络(Swarm/K8s 用)

  • 用于 跨主机容器通信
  • 需要 Docker Swarm/K8s 支持。
  • 主要用于多节点部署。

🔹 对比总结

模式 容器是否有独立 IP 是否需要端口映射 场景
bridge(默认) ✅ 有 ✅ 需要 最常用,默认模式
host ❌ 无(用宿主机 IP) ❌ 无(共享端口) 高性能、无 NAT
none ❌ 无 ❌ 无 特殊情况,需要完全自定义
container ❌(共享已有容器 IP) Sidecar、共享网络
自定义 bridge ✅ 有 推荐应用服务之间通信
overlay ✅ 有 多主机、集群场景

🔹 实际开发/生产的使用建议

  1. 开发环境

    • 用自定义 bridge,方便用服务名互相访问。
    • 例如:docker-compose 默认会创建自定义网络。
  2. 单机生产

    • 如果追求性能(比如数据库容器),用 --network host
    • 普通服务还是用自定义 bridge + 端口映射。
  3. 集群环境(Swarm / K8s)

    • overlay 或者 CNI 插件(K8s 默认用 flannel、calico 等)。