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

Networking 多个docker compose项目之间的通信,networking,docker,docker-compose,Networking,Docker,Docker Compose,我在两个不同的文件夹中有两个独立的docker compose.yml文件: ~/front/docker compose.yml ~/api/docker compose.yml 如何确保front中的容器可以向api中的容器发送请求 我知道可以使用docker run为单个容器设置--默认网关选项,以便为该容器分配特定的IP地址,但在使用docker compose时,该选项似乎不可用 目前,我做了一个docker检查我的\u api\u容器\u id,并查看输出中的网关。它工作,但问题

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

  • ~/front/docker compose.yml
  • ~/api/docker compose.yml
如何确保
front
中的容器可以向
api
中的容器发送请求

我知道可以使用
docker run
为单个容器设置
--默认网关
选项,以便为该容器分配特定的IP地址,但在使用
docker compose
时,该选项似乎不可用

目前,我做了一个
docker检查我的\u api\u容器\u id
,并查看输出中的网关。它工作,但问题是,这个IP是随机属性,所以我不能依赖它

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

  • 我可以使用docker compose为特定容器指定固定IP地址吗
但最终我要照顾的是:

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

您只需确保要相互通话的容器位于同一网络上即可。网络是一种一流的docker结构,并不特定于组合

#front/docker-compose.yml
版本:“2”
服务:
正面:
...
网络:
-一些网
网络:
一些网络:
司机:驾驶台

#api/docker-compose.yml
版本:“2”
服务:
应用程序编程接口:
...
网络:
-前网络
网络:
前端网络:
外部:正确
注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称,在这种情况下,添加了前缀
front\uu


然后,他们可以使用服务名称相互交谈。从
前端
可以执行
ping api
操作,反之亦然。

我将确保所有容器都是
docker compose
,通过同时将它们组合在一起,使用:

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

只是@johnharis85伟大答案的一小部分, 运行docker compose文件时,将创建一个“
默认值”
”网络 因此,您可以将其作为外部网络添加到另一个compose文件中:

# front/docker-compose.yml 
version: '2' 
  services:   
    front_service:
    ...


对我来说,这种方法更合适,因为我没有第一个docker compose文件,希望与它通信。

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

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

参见docker compose guide:(参见底部)

之前的帖子信息是正确的,但没有关于如何链接容器的详细信息,容器应作为“外部链接”连接

希望这个例子能让你更清楚:

  • 假设您有app1/docker-compose.yml和app2/docker-compose.yml,其中包含两个服务(svc11和svc12),以及另外两个服务(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

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
这是app2/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

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

更新:自撰写文件版本3.5起:

现在可以这样做了:

版本:“3.5”
服务:
代理:
图片:你好,世界
端口:
- "80:80"
网络:
-proxynet
网络:
proxynet:
名称:自定义网络
docker compose up-d
将加入一个名为“自定义网络”的网络。如果它不存在,它将被创建

root@ubuntu-s-1vcpu-1gb-tor1-01:~#docker compose up-d
使用默认驱动程序创建网络“自定义网络”
正在创建根目录\u代理\u 1。。。完成
现在,您可以执行以下操作:

版本:“2”
服务:
网状物:
图片:你好,世界
网络:
-我的代理网络
网络:
我的代理网络:
外部:
名称:自定义网络
这将在外部网络上创建一个容器

我在文档中还找不到任何参考资料,但它很有效

自Compose 1.18(规范3.5)以来,您可以使用自己的自定义名称覆盖所有需要的Compose YAML文件的默认网络。只需在其后面附加以下内容即可:

networks:
  default:
    name: my-app
以上假设您已将
版本设置为
3.5
(或更高版本,如果他们没有在4+中弃用)

其他答案也指出了同样的问题;这是一个简化的摘要

version: '2'
services:
  bot:
    build: .
    volumes:
      - '.:/home/node'
      - /home/node/node_modules
    networks:
      - my-rede
    mem_limit: 100m
    memswap_limit: 100m
    cpu_quota: 25000
    container_name: 236948199393329152_585042339404185600_bot
    command: node index.js
    environment:
      NODE_ENV: production
networks:
  my-rede:
    external:
      name: name_rede_externa
要使用另一个docker compose网络,只需执行以下操作(在docker compose之间共享网络):

  • 通过
    up-d运行第一个docker compose项目
  • 查找第一个docker compose by的网络名称:
    docker network ls
    (它包含根目录项目的名称)
  • 然后在下面的第二个docker compose文件中使用该名称
  • 第二个docker-compose.yml

    version: '3'
    services:
      service-on-second-compose:  # Define any names that you want.
        .
        .
        .
        networks:
          - <put it here(the network name that comes from "docker network ls")>
    
    networks:
      - <put it here(the network name that comes from "docker network ls")>:
        external: true
    
    版本:“3”
    服务:
    第二次合成时的服务:#定义您想要的任何名称。
    .
    .
    .
    网络:
    - 
    网络:
    - :
    外部:正确
    
    更新:自docker compose文件版本3.5起:

    我遇到了一个类似的问题,我通过在我的docker-compose.yml项目中添加一个小更改来解决它

    例如,我们有两个API
    评分
    ner
    Scoring
    API需要向
    ner
    API发送请求以处理输入请求。为了做到这一点,他们都应该共享同一个网络

    注意:每个容器都有自己的网络,该网络在docker内部运行应用程序时自动创建。例如,ner API网络将像
    ner\u default
    一样创建,评分API网络将命名为
    scoring defaultversion: '3'
    services:
      ner:
        container_name: "ner_api"
        build: .
        ...
    
    networks:
      default:
          external:
            name: scoring_default
    
    version: '3'
    services:
      api:
        build: .
        ...
    
    {
        "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": ""
        },
        ...
    }
    
    import socket
    def get_ip():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            # doesn't even have to be reachable
            s.connect(('10.255.255.255', 1))
            IP = s.getsockname()[0]
        except:
            IP = '127.0.0.1'
        finally:
            s.close()
        return IP
    
    networks:
      app-tier:
        driver: bridge
    
    services:
      api:
        container_name: api_a
        image: api_a:latest
        depends_on:
          - postgresql
        networks:
          - app-tier
    
    networks:
      app-tier:
        driver: bridge
    
    services:
      api:
        container_name: api_b
        image: api_b:latest
        depends_on:
          - postgresql
        networks:
          - app-tier