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
2docker run -d --name c1 busybox sleep 3600
docker run -it --network container:c1 busybox shc1和新容器共享网络。应用场景:当你希望两个容器看起来像在同一台机器上(例如应用和 sidecar)。
5. 自定义 bridge 网络
默认的
bridge网络用容器名互相访问不方便,所以推荐创建自定义 bridge。命令:
1
2
3docker 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 | ✅ 有 | ✅ | 多主机、集群场景 |
🔹 实际开发/生产的使用建议
开发环境
- 用自定义
bridge,方便用服务名互相访问。 - 例如:
docker-compose默认会创建自定义网络。
- 用自定义
单机生产
- 如果追求性能(比如数据库容器),用
--network host。 - 普通服务还是用自定义 bridge + 端口映射。
- 如果追求性能(比如数据库容器),用
集群环境(Swarm / K8s)
- 用
overlay或者CNI 插件(K8s 默认用 flannel、calico 等)。
- 用