我有两个独立的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项目如何相互通信?
更新:从docker-compose文件3.5版开始:
我遇到过类似的问题,我通过在docker-compose中添加一个小更改来解决它。yml项目。
例如,我们有两个API的评分和ner。评分API需要向ner API发送请求以处理输入请求。为了做到这一点,他们都应该共享同一个网络。
注意:每个容器都有自己的网络,这是在docker中运行应用程序时自动创建的。例如,一个API网络将创建像ner_default和评分API网络将命名为评分默认。此解决方案适用于版本:'3'。
在上面的场景中,我的评分API想要与另一个API通信,然后我将添加以下行。这意味着每当我为ner API创建容器时,它会自动添加到scoring_default网络。
networks:
default:
external:
name: scoring_default
ner/docker-compose.yml
version: '3'
services:
ner:
container_name: "ner_api"
build: .
...
networks:
default:
external:
name: scoring_default
得分/ docker-compose.yml
version: '3'
services:
api:
build: .
...
我们可以看到上面的容器现在是同一个名为scoring_default的网络的一部分:
Docker检查scoring_default
{
"Name": "scoring_default",
....
"Containers": {
"14a6...28bf": {
"Name": "ner_api",
"EndpointID": "83b7...d6291",
"MacAddress": "0....",
"IPv4Address": "0.0....",
"IPv6Address": ""
},
"7b32...90d1": {
"Name": "scoring_api",
"EndpointID": "311...280d",
"MacAddress": "0.....3",
"IPv4Address": "1...0",
"IPv6Address": ""
},
...
}
这么多答案!
首先,避免在实体名称中使用连字符,如服务、网络等。它们会导致名称解析问题。
例如: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
之前的帖子信息是正确的,但是没有详细说明如何链接容器,应该连接为“external_links”。
希望这个例子能让你更清楚:
假设您有app1/docker-compose。Yml,包含两个服务(svc11和svc12),以及app2/docker-compose。Yml和另外两个服务(svc21和svc22),假设你需要以交叉方式连接:
Svc11需要连接到svc22的容器
Svc21需要连接到svc11的容器。
所以构型应该是这样的:
这是app1/docker-compose.yml:
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
这是app2/docker-compose.yml:
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
回答Docker,写“3”以上
默认情况下,Docker Compose使用网桥网络来提供容器之间的通信。有关容器间网络的更多信息,请阅读本文。
重要的是,默认情况下,Docker Compose会创建一个与Docker - Compose中的服务名相同的主机名。yml文件。考虑下面的docker-compose.yml:
version: '3.9'
services:
server:
image: node:16.9.0
container_name: server
tty: true
stdin_open: true
depends_on:
- mongo
command: bash
mongo:
image: mongo
environment:
MONGO_INITDB_DATABASE: my-database
当你运行Docker -compose up时,Docker将创建一个默认网络,并为mongo和server分配服务名作为主机名。
你现在可以通过以下方式访问后端容器:
docker exec -it server bash
现在你可以使用Dockers内部网络(默认端口为27017)来ping mongo容器:
curl -v http://mongo:27017/my-database
就是这样。这同样适用于您的设置。