两个独立Docker-Compose架构下容器网络互通相关技术咨询
跨独立Docker Compose项目的网络配置解决方案
针对你提到的两个独立Docker Compose项目(各含Apache、PHP、MariaDB容器),且第一个项目需调用第二个项目API的场景,逐一解答问题:
1. 最佳网络驱动选择
首选自定义bridge桥接网络。原因如下:
overlay用于多Docker节点的集群场景,单节点完全没必要;host会让容器直接使用宿主机网络,破坏容器隔离性,不推荐;ipvlan/macvlan配置复杂,多用于需要容器直接暴露到物理网络的特殊场景;none完全关闭网络,不符合你的需求;- 自定义bridge网络默认支持容器名/服务名的DNS解析,是单节点下跨Compose项目最简便、安全的网络方案。
2. 是否必须配置extra_host?
不需要。extra_hosts用于给容器添加宿主机或外部主机的映射关系,不是跨Compose项目通信的正确方式。只要两个Compose项目的容器都加入同一个自定义桥接网络,就能直接通过服务名/容器名互相访问。
3. 是否需要为每个容器声明网络?
是的,需要让两个Compose项目中需要跨项目通信的服务(比如第一个项目的PHP容器、第二个项目的API服务容器)加入同一个外部自定义桥接网络。
示例配置:
- 先手动创建自定义网络:
docker network create shared_api_network
- 在第一个项目的
docker-compose.yml中配置服务连接该网络:
services: php: # 其他配置... networks: - default - shared_api_network apache: # 其他配置... networks: - default - shared_api_network mariadb: # 其他配置... networks: - default networks: shared_api_network: external: true
- 在第二个项目的
docker-compose.yml中做同样配置,确保提供API的服务(如PHP、Apache)加入shared_api_network。
4. 同一Compose内可ping通,跨Compose不行的原因
每个Docker Compose项目默认会自动创建一个独立的默认桥接网络(命名格式为项目名_default),不同Compose项目的默认网络是互相隔离的:
- 同一默认网络内的容器处于同一网段,且Compose默认配置了DNS解析,所以可以通过服务名/容器名直接通信;
- 跨Compose的容器处于不同的隔离网络中,彼此不在同一网段,且默认网络不支持跨网络的DNS解析,因此无法互相访问。
内容的提问来源于stack exchange,提问作者miltone
相关产品推荐
相关产品推荐

