it-swarm.asia

多个docker-compose项目之间的通信

我在两个不同的文件夹中有两个单独的docker-compose.yml文件:

  • 〜/前/搬运工-compose.yml
  • 〜/ API /搬运工-compose.yml

如何确保front中的容器可以向api中的容器发送请求?

我知道可以使用--default-gateway为单个容器设置docker run选项,以便可以为此容器分配特定的IP地址,但使用docker-compose时似乎无法使用此选项。

目前我最终做了docker inspect my_api_container_id并查看输出中的网关。它有效,但问题是这个IP是随机归因的,所以我不能依赖它。

因此,这个问题的另一种形式可能是:

  • 我可以使用docker-compose将固定IP地址归属到特定容器吗?

但最后我要照顾的是:

  • 两个不同的docker-compose项目如何相互通信?
136
Jivan

您只需要确保要彼此通信的容器位于同一网络上。网络是一流的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_

然后,他们可以使用服务名称相互通信。从front你可以做ping api,反之亦然。

185
johnharris85

只是对@ johnharris85的一个很好的答案,当你运行一个docker compose文件时,会创建一个“default”网络,这样你就可以将它作为一个外部网络添加到另一个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文件并希望与之通信。

51
Tal Joffe

更新:从撰写文件版本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”的网络。如果它不存在,它将被创建!

[email protected]:~# 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

这将创建一个将位于外部网络上的容器。

我在文档中找不到任何参考但是它有效!

39
cstrutton

来自api的所有容器都可以使用以下配置加入front default network:

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

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

22
dedek

以前的帖子信息是正确的,但它没有关于如何链接容器的详细信息,这些容器应该连接为“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
7
Daniel Blanco

从Compose 1.18(规范3.5)开始,您可以使用自己的自定义名称覆盖默认网络,以获取所需的所有Compose YAML文件。它就像向他们追加以下内容一样简单:

networks:
  default:
    name: my-app

以上假设您将version设置为3.5(如果他们不在4+中弃用它,则为以上)。

其他答案也有相同的说法;这是一个简化的摘要。

3
emyller

通过使用以下方法将所有容器同时组合在一起,确保所有容器都docker-compose'到同一网络:

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