Docker Compose 外部网络(`external: true`)与内部网络的区别
Docker Compose 外部网络(external: true
)与内部网络的区别
在 Docker Compose 中,external: true
声明的外部网络与普通(内部)网络有重要区别,以下是它们的详细对比:
1. 定义与创建方式
特性 | 外部网络 (external: true ) | 内部网络 (默认) |
---|---|---|
创建者 | 由 Docker 命令行或其他 Compose 文件预先创建 | 由当前 docker-compose up 自动创建 |
生命周期 | 独立于当前 Compose 项目存在 | 随 docker-compose down 被删除 |
声明方式 | 必须指定 name 属性引用现有网络 | 自动生成或使用自定义配置 |
# 外部网络示例
networks:my-external-net:external: truename: existing-network # 必须匹配已存在的网络名# 内部网络示例
networks:my-internal-net:driver: bridge
2. 使用场景对比
外部网络典型场景
- 跨项目通信:多个独立的 Compose 项目需要互联
- 连接非 Docker 服务:连接主机上运行的传统服务
- 使用特殊网络:如已配置好的
macvlan
/overlay
网络 - 持久化网络:需要保留网络配置不被删除
内部网络典型场景
- 项目隔离:单一项目内部容器通信
- 临时环境:开发/测试时需要的临时网络
- 自动化管理:希望随项目生命周期自动创建/清理
3. 实际应用案例
案例1:多个项目共享数据库
# 项目A的compose.yml
services:webapp:networks:- shared-netnetworks:shared-net:external: truename: common-network# 项目B的compose.yml
services:database:networks:- shared-netnetworks:shared-net:external: truename: common-network
案例2:连接主机网络
services:network-tool:image: alpinenetworks:- host-netnetworks:host-net:external: truename: host # 使用Docker主机网络
4. 关键区别总结
维度 | 外部网络 | 内部网络 |
---|---|---|
可见性 | 对所有容器可见 | 仅限当前Compose文件的容器 |
配置控制 | 需提前手动配置好 | 可在Compose文件中完全定义 |
IP分配 | 使用外部网络的IPAM配置 | 使用Compose中定义的或默认的IPAM |
依赖关系 | docker-compose up 前必须已存在 | 随Compose服务自动创建 |
删除影响 | docker-compose down 不会删除 | 默认随 down 删除(除非指定 --network ) |
5. 使用建议
- 生产环境推荐:对关键服务(如数据库)使用外部网络,避免误删
- 开发环境推荐:使用内部网络简化管理
- 混合使用:一个Compose项目可以同时使用两种网络类型
- 命名规范:为外部网络使用明确的前缀(如
company_
),避免冲突
6. 常见问题解决
Q1:如何将现有内部网络转为外部网络?
# 1. 查找网络名
docker network ls# 2. 在compose文件中改为
networks:mynet:external: truename: <实际网络名>
Q2:外部网络不存在时如何自动创建?
# 先创建网络(外部网络不会自动创建)
docker network create my-external-net
Q3:如何查看哪些容器连接了外部网络?
docker network inspect <网络名>