我有两个独立的docker-compose。Yml文件在两个不同的文件夹:
~/front/docker-compose.yml
~/api/docker-compose.yml
我如何确保前面的容器可以在api中向容器发送请求?
我知道——default-gateway选项可以使用docker run为单个容器设置,这样就可以为该容器分配特定的IP地址,但似乎在使用docker-compose时这个选项不可用。
目前,我结束了一个docker检查my_api_container_id,并查看输出中的网关。它是有效的,但问题是这个IP是随机分配的,所以我不能依赖它。
这个问题的另一种形式可能是:
我可以使用docker-compose将一个固定的IP地址归属于特定的容器吗?
但最终我所追求的是:
两个不同的docker-compose项目如何相互通信?
只是对@johnharris85的伟大回答的一个小补充,
当你运行docker撰写文件时,一个“默认”网络被创建
所以你可以把它作为一个外部网络添加到另一个合成文件中:
# front/docker-compose.yml
version: '2'
services:
front_service:
...
...
# api/docker-compose.yml
version: '2'
services:
api_service:
...
networks:
- front_default
networks:
front_default:
external: true
对我来说,这种方法更适合,因为我没有第一个docker-compose文件,并且希望与它通信。
这么多答案!
首先,避免在实体名称中使用连字符,如服务、网络等。它们会导致名称解析问题。
例如:my-api不能工作。Myapi或API可以工作。
对我有用的是:
# api/docker-compose.yml
version: '3'
services:
api:
container_name: api
...
ports:
- 8081:8080
networks:
- mynetwork
networks:
mynetwork:
name: mynetwork
and
# front/docker-compose.yml
version: '3'
services:
front:
container_name: front
...
ports:
- 81:80
networks:
- mynetwork
networks:
mynetwork:
name: mynetwork
注意:我添加端口是为了展示服务如何相互访问,以及如何从主机访问它们。
重要提示:如果您没有指定网络名称,docker-compose将为您创建一个。它使用文件夹的名称docker_compose。Yml文件已导入。本例中为api_mynetwork和front_mynetwork。这将阻止容器之间的通信,因为它们将位于不同的网络上,具有非常相似的名称。
请注意,两个文件中对网络的定义完全相同,因此可以先启动其中一个服务,然后它就可以工作了。不需要指定哪个是外部的,docker-compose会为你管理它。
来自主持人
你可以使用docker-compose.yml中定义的已发布端口来访问任何一个容器。
您可以访问Front容器:curl http://localhost:81
您可以访问API容器:curl http://localhost:8081
从API容器
您可以使用原始端口访问Front容器,而不是您在docker-compose.yml中发布的端口。
例如:curl http://front:80
从前面的容器
你可以使用原始端口访问API容器,而不是你在docker-compose.yml中发布的端口。
例如:curl http://api:8080