我有两个独立的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项目如何相互通信?


当前回答

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

其他回答

回答Docker,写“3”以上

默认情况下,Docker Compose使用网桥网络来提供容器之间的通信。有关容器间网络的更多信息,请阅读本文。

重要的是,默认情况下,Docker Compose会创建一个与Docker - Compose中的服务名相同的主机名。yml文件。考虑下面的docker-compose.yml:

version: '3.9'
services:
  server:
    image: node:16.9.0
    container_name: server
    tty: true
    stdin_open: true
    depends_on:
       - mongo
    command: bash

  mongo:
    image: mongo
    environment:
      MONGO_INITDB_DATABASE: my-database

当你运行Docker -compose up时,Docker将创建一个默认网络,并为mongo和server分配服务名作为主机名。

你现在可以通过以下方式访问后端容器:

docker exec -it server bash

现在你可以使用Dockers内部网络(默认端口为27017)来ping mongo容器:

curl -v http://mongo:27017/my-database

就是这样。这同样适用于您的设置。

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

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

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

继续JohnHarris的回答,只是添加一些可能对某些人有用的细节:让我们取两个docker-compose文件,并通过网络将它们连接起来:

第一文件夹/ docker-compose . yml:

version: '2'
services:
  some-contr:
    container_name: []
    build: .
    ...
    networks:
      - somenet
    ports:
      - "8080:8080"
    expose:
      # Opens port 8080 on the container
      - "8080"
    environment:
      PORT: 8080
    tty: true
networks:
  boomnet:
    driver: bridge

docker-compose.yml 2:

version: '2'
services: 
  pushapiserver:
    container_name: [container_name]
    build: .
    command: "tail -f /dev/null"
    volumes:
      - ./:/[work_dir]
    working_dir: /[work dir]
    image: [name of image]
    ports:
      - "8060:8066"
    environment:
      PORT: 8066
    tty: true
    networks:
      - foldername_somenet
networks:
  foldername_somenet:
    external: true

现在你可以对另一个服务(b/w diff容器)进行api调用,比如: 第一个docker-compose.yml文件中的一些代码调用http://pushapiserver:8066/send_push

两个常见错误(至少我犯过几次):

注意docker-compose所在的[foldername]。Yml文件存在。请看上面的第二篇docker-compose。我已经在网络BC docker中添加了文件夹名,通过[foldername]_[networkname]创建网络 Port:这个很常见。请注意,我在尝试连接时使用了8066,即http://pushapiserver:8066/…8066是docker容器的端口(第二个docker-compose.yml),所以当尝试与不同的docker compose对话时。

Docker将使用Docker容器端口[8066],而不是主机映射端口 [8060]

另一种选择是运行第一个模块,使用“docker-compose”检查与模块相关的ip,并将第二个模块与之前的网络连接,如外部,并指向内部ip

例子 App1 -在服务行中创建的new-network,在底部标记为external: true App2 -表示由app1创建的“新网络”,在底部标记为external: true,并在配置中设置为连接,app1在此网络中的IP。

有了这个,你们就能互相交谈了

*这种方法只是针对局部测试,为了不做过于复杂的配置 **我知道这是非常“补丁的方式”,但对我来说很管用,我认为这是如此简单,其他人可以利用这一点

更新:从docker-compose文件3.5版开始:

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

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

注意:每个容器都有自己的网络,这是在docker中运行应用程序时自动创建的。例如,一个API网络将创建像ner_default和评分API网络将命名为评分默认。此解决方案适用于版本:'3'。

在上面的场景中,我的评分API想要与另一个API通信,然后我将添加以下行。这意味着每当我为ner API创建容器时,它会自动添加到scoring_default网络。

networks:
  default:
      external:
        name: scoring_default

ner/docker-compose.yml

version: '3'
services:
  ner:
    container_name: "ner_api"
    build: .
    ...

networks:
  default:
      external:
        name: scoring_default

得分/ docker-compose.yml

version: '3'
services:
  api:
    build: .
    ...

我们可以看到上面的容器现在是同一个名为scoring_default的网络的一部分:

Docker检查scoring_default

{
    "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": ""
    },
    ...
}