多个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