我有两个独立的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]

其他回答

继续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,写“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

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

这么多答案!

首先,避免在实体名称中使用连字符,如服务、网络等。它们会导致名称解析问题。

例如:my-api不能工作。Myapi或API可以工作。

对我有用的是:

# api/docker-compose.yml
version: '3'

services:
  api:
    container_name: api
    ...
    ports:
      - 8081:8080
    networks:
      - mynetwork

networks:
  mynetwork:
    name: mynetwork

and

# front/docker-compose.yml
version: '3'

services:
  front:
    container_name: front
    ...
    ports:
      - 81:80
    networks:
      - mynetwork

networks:
  mynetwork:
    name: mynetwork

注意:我添加端口是为了展示服务如何相互访问,以及如何从主机访问它们。

重要提示:如果您没有指定网络名称,docker-compose将为您创建一个。它使用文件夹的名称docker_compose。Yml文件已导入。本例中为api_mynetwork和front_mynetwork。这将阻止容器之间的通信,因为它们将位于不同的网络上,具有非常相似的名称。

请注意,两个文件中对网络的定义完全相同,因此可以先启动其中一个服务,然后它就可以工作了。不需要指定哪个是外部的,docker-compose会为你管理它。

来自主持人

你可以使用docker-compose.yml中定义的已发布端口来访问任何一个容器。

您可以访问Front容器:curl http://localhost:81

您可以访问API容器:curl http://localhost:8081

从API容器

您可以使用原始端口访问Front容器,而不是您在docker-compose.yml中发布的端口。

例如:curl http://front:80

从前面的容器

你可以使用原始端口访问API容器,而不是你在docker-compose.yml中发布的端口。

例如:curl http://api:8080

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

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

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

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