多个docker-compose项目之间的通信
我在两个不同的文件夹中有两个单独docker-compose.yml
文件:
- 〜/前/搬运工-compose.yml
- 〜/ API /搬运工-compose.yml
我怎样才能确保front
的容器可以发送请求到api
的容器?
我知道--default-gateway
选项可以使用--default-gateway
docker run
为单个容器设置,这样一个特定的IP地址可以分配给这个容器,但是看起来这个选项在使用docker-compose
时候是不可用的。
目前我最终做了一个docker inspect my_api_container_id
并看看输出中的网关。 它的工作原理,但问题是这个IP是随机的,所以我不能依靠它。
这个问题的另一种forms可能是:
- 我可以使用docker-compose将固定的IP地址归入特定的容器吗?
但是最后我所看到的是:
- 两个不同的docker-compose项目怎么能相互沟通?
你只需要确保你想互相交谈的容器在同一个networking上。 networking是一stream的docker结构,而不是专门构成的。
# front/docker-compose.yml version: '2' services: front: ... networks: - some-net networks: some-net: driver: bridge
…
# api/docker-compose.yml version: '2' services: api: ... networks: - front_some-net networks: front_some-net: external: true
然后他们可以使用服务名称相互交谈。 从front
你可以做ping api
,反之亦然。
在@ johnharris85的很好的答案中,当你运行一个docker compose文件时,会创build一个默认的networking,这样你就可以把它作为一个外部networking添加到另一个compose文件中:
# 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文件,并想与之通信。
来自api
所有容器都可以使用以下configurationjoinfront
默认networking:
# api/docker-compose.yml ... networks: default: external: name: front_default
请参阅泊坞窗撰写指南: 使用预先存在的networking
我会确保所有的容器是docker-compose
的同一个networking,通过在同一时间他们在一起,使用:
docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d
之前的post信息是正确的,但是没有关于如何链接容器的细节,应该将容器连接为“external_links”。
希望这个例子对你更清楚:
-
假设你有两个服务(svc11和svc12)的app1 / docker-compose.yml和两个更多服务(svc21和svc22)的app2 / docker-compose.yml,假设你需要交叉连接:
-
svc11需要连接到svc22的容器
- svc21需要连接到svc11的容器。
所以configuration应该是这样的:
这是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