在每个独立的docker-compose架构中的docker容器之间进行ping操作(不是同一个docker-compose.yml文件)。
在每个独立的docker-compose架构中的docker容器之间进行ping操作(不是同一个docker-compose.yml文件)。
我在处理两个项目。每个项目都有:
- 1个docker-compose.yml文件
- 3个容器(Apache、PHP、MariaDB)
第一个应用是一个网站,需要使用第二个应用的API。
所有关于单个docker-compose架构的互联网主题和文档都不能解决我的问题,因为我的问题涉及到两个特定且独立的docker-compose架构。
最佳网络驱动程序是什么(桥接、主机、覆盖、ipvlan、macvlan、无)?
在docker-compose文件中使用'extra_host'配置是否是必需的?
我是否需要为每个容器声明网络?
为什么在同一个docker-compose容器中ping命令可以正常运行,但在另一个docker-compose架构之间却不行?所有容器都在同一个Docker引擎Windows实例中运行...
问题的出现原因:
在每个项目/`docker-compose.yml`文件中,如果没有另外指定,`docker-compose`会为每个项目创建一个名为`default`的`docker network`,并将项目的每个服务/容器连接到该网络。 这些网络彼此隔离,但主机作为它们的网关与它们相连接(至少在默认配置中)。
解决方法:
要能够访问另一个项目的某个服务,您需要将这两个服务连接到一个共同的网络。例如,可以按照以下方式创建共享网络:
docker network create shared_api_network
项目1的`docker-compose.yml`文件示例如下:
# project 1
services:
apache:
# ...
networks:
- default # 连接到该项目的默认网络,以便apache可以与数据库通信
- shared # 连接到共享网络,以便apache可以与另一个项目的API通信
php:
# ...
db:
# ...
networks:
shared:
name: shared_api_network
external: true
项目2的`docker-compose.yml`文件示例如下:
# project 2
services:
apache:
# ...
networks:
- default # 连接到该项目的默认网络,以便apache可以与数据库通信
- shared # 连接到共享网络,以便其他项目可以调用API
php:
# ...
db:
# ...
networks:
shared:
name: shared_api_network
external: true
通过上述配置,项目1和项目2都连接到了名为`shared_api_network`的共享网络,从而可以彼此通信。
更多信息请参阅docker-compose网络文档。
如果你想避免使用`docker network create`命令,可以在其中一个`docker-compose.yml`文件中定义`shared_api_network`网络,并使用自定义网络名称,而另一个`docker-compose.yml`文件保持与上述相同的配置。