docker-compose常用的网络模式有哪些?
Docker Compose 中常用的网络模式主要继承自 Docker 本身的网络模型,同时提供了更便捷的网络管理方式。以下是常用的网络模式及特点:
1. bridge
模式(默认模式)
- 特点:Docker 最常用的网络模式,Compose 会为每个项目自动创建一个默认的
bridge
网络(默认名称为项目名_default
),所有未指定网络模式的服务都会自动加入这个网络。 - 通信方式:同一网络内的服务可以通过 服务名 互相访问(Docker 内置 DNS 解析),无需暴露端口到主机;若需外部访问,需通过
ports
配置端口映射(如8080:80
)。 - 适用场景:绝大多数常规场景,适合多服务之间需要通信但又需要一定网络隔离的情况。
- 配置示例:
默认无需额外配置,或显式指定:services:web:image: nginx# 默认加入项目的默认 bridge 网络ports:- "8080:80" # 外部可通过主机 8080 访问容器 80 端口
2. host
模式
- 特点:容器直接使用主机的网络栈(共享主机的 IP 和端口),容器内的端口会直接绑定到主机对应的端口,无需端口映射。
- 通信方式:容器与主机共享网络,服务间可通过
localhost
或主机 IP 通信;外部访问直接使用主机端口。 - 限制:
- 不支持
ports
配置(会被忽略并警告); - 跨平台兼容性差(在 Windows/macOS 上可能受限)。
- 不支持
- 适用场景:需要高性能网络(如减少网络开销)、或需要直接使用主机网络资源(如绑定特权端口)的场景。
- 配置示例:
services:app:image: myappnetwork_mode: host # 使用主机网络
3. none
模式
- 特点:容器禁用所有网络,完全隔离,没有网络接口。
- 适用场景:极少数特殊场景(如仅需本地计算、不需要任何网络通信的容器)。
- 配置示例:
services:task:image: mytasknetwork_mode: none # 禁用网络
4. container
模式
- 特点:当前容器共享另一个容器的网络栈(IP、端口等完全复用目标容器的网络)。
- 通信方式:两个容器共享网络,可通过
localhost
互相访问,无需端口映射。 - 适用场景:需要让一个容器“寄生”在另一个容器网络中的场景(如辅助工具容器需要访问主容器的内部服务)。
- 配置示例:
services:main:image: mainapphelper:image: helperappnetwork_mode: "service:main" # 共享 main 容器的网络
5. 自定义网络(推荐用于复杂场景)
- 特点:通过
networks
配置自定义网络,可指定网络驱动(如bridge
、overlay
等),实现更灵活的网络隔离和管理。 - 优势:
- 支持多网络隔离(一个服务可加入多个自定义网络);
- 比默认
bridge
网络更安全(默认拒绝跨网络通信); - 支持 DNS 服务名解析,方便服务间通信。
- 适用场景:多服务复杂应用(如微服务架构),需要按功能划分网络隔离(如前端、后端、数据库分属不同网络)。
- 配置示例:
# 定义自定义网络 networks:frontend: # 前端网络backend: # 后端网络services:web: # 前端服务,加入 frontend 网络image: nginxnetworks:- frontendports:- "80:80"api: # 后端服务,加入 frontend 和 backend 网络image: myapinetworks:- frontend- backenddb: # 数据库服务,仅加入 backend 网络(隔离保护)image: mysqlnetworks:- backend
总结
- 简单场景用默认
bridge
模式; - 需高性能/主机网络资源用
host
模式; - 复杂应用(如微服务)优先用 自定义网络,按功能隔离网络更安全灵活;
- 特殊隔离需求用
none
或container
模式(极少用)。