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


当前回答

继续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]

其他回答

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

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

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

每个人都解释得很好,所以我将添加必要的代码,只做一个简单的解释。

使用docker-compose 3.5+版本在docker-compose之外创建的网络(“外部”网络)。

进一步的解释可以在这里找到。

第一个docker-compose。yml文件应该定义名为giveItANamePlease的网络,如下所示。

networks:
  my-network:
    name: giveItANamePlease
    driver: bridge

第一码头的服务。Yml文件可以使用网络如下:

networks:
  - my-network

在第二个docker-compose文件中,我们需要使用我们在第一个docker-compose文件中使用的网络名来代理网络,在本例中是giveItANamePlease:

networks:
  my-proxy-net:
    external:
      name: giveItANamePlease

现在你可以在第二个docker-compose服务中使用my-proxy-net了。Yml文件如下。

networks:
  - my-proxy-net

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

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

对于使用另一个docker-compose网络,你只需要做这些(在docker-compose之间共享网络): 使用up -d运行第一个docker-compose项目 找到第一个docker的网络名称-通过: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

您可以在所有项目中添加包含COMPOSE_PROJECT_NAME= someename的.env文件。

COMPOSE_PROJECT_NAME覆盖了用于命名资源的前缀,因此所有的项目都将使用somename_default作为它们的网络,使得服务可以相互通信,因为它们在同一个项目中。

注意:您将得到从其他项目创建的“孤立”容器的警告。