我有两个独立的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文件,并且希望与它通信。

其他回答

您只需要确保希望相互通信的容器位于同一网络上。网络是一流的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,反之亦然。

我将确保所有的容器都是docker-compose到同一个网络,通过在同一时间将它们组合在一起,使用:

docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d

只是对@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文件,并且希望与它通信。

api中的所有容器都可以通过以下配置加入前端默认网络:

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

参见docker撰写指南:使用预先存在的网络(见底部)

之前的帖子信息是正确的,但是没有详细说明如何链接容器,应该连接为“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