我有两个独立的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": ""
},
...
}
更新:作为撰写文件版本3.5:
现在可以工作了:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
Docker-compose up -d将加入一个名为“custom_network”的网络。如果它不存在,它将被创建!
root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done
现在,你可以这样做:
version: "2"
services:
web:
image: hello-world
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
这将创建一个位于外部网络上的容器。
我在文档中找不到任何参考资料,但它是有效的!
更新:从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": ""
},
...
}
每个人都解释得很好,所以我将添加必要的代码,只做一个简单的解释。
使用docker-compose 3.5+版本在docker-compose之外创建的网络(“外部”网络)。
进一步的解释可以在这里找到。
第一个docker-compose。yml文件应该定义名为giveItANamePlease的网络,如下所示。
networks:
my-network:
name: giveItANamePlease
driver: bridge
第一码头的服务。Yml文件可以使用网络如下:
networks:
- my-network
在第二个docker-compose文件中,我们需要使用我们在第一个docker-compose文件中使用的网络名来代理网络,在本例中是giveItANamePlease:
networks:
my-proxy-net:
external:
name: giveItANamePlease
现在你可以在第二个docker-compose服务中使用my-proxy-net了。Yml文件如下。
networks:
- my-proxy-net
只是对@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文件,并且希望与它通信。