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


当前回答

我正在运行多个相同的docker-compose。Yml文件放在不同的目录下,使用.env文件做一些细微的区别。并使用Nginx Proxy Manage与其他服务通信。这是我的文件:

确保已创建公共网络

docker network create nginx-proxy-man

/domain1.com/docker-compose.yml, /domain2.com/docker-compose.yml,…

version: "3.9"

services:
  webserver:
    build:
      context: ./bin/${PHPVERSION}
    container_name: "${COMPOSE_PROJECT_NAME}-${PHPVERSION}"
    ...
    networks:
      - default    # network outside
      - internal   # network internal
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: "${COMPOSE_PROJECT_NAME}-${DATABASE}"
    ...
    networks:
      - internal   # network internal


networks:
  default:
    external: true
    name: nginx-proxy-man
  internal:
    internal: true

.env文件只需更改COMPOSE_PROJECT_NAME

COMPOSE_PROJECT_NAME=domain1_com
.
.
.
PHPVERSION=php56

DATABASE=mysql57

网络服务器。container_name: domain1_com-php56 -将加入默认网络(名称:Nginx - Proxy -man),之前为Nginx代理管理器创建,以便从外部访问。

备注:container_name在同一网络中是唯一的。

数据库。Container_name: domain1_com-mysql57—更容易区分

在同样的docker-compose中。Yml,由于相同的网络domain1_com_internal,服务将通过服务名称相互连接。为了更加安全,请使用internal: true选项设置此网络

注意,如果您没有显式地为每个服务指定网络,而只是为两个docker-compose使用一个公共的外部网络。嗯,那么domain1_com很可能会使用domain2_com的数据库。

其他回答

我正在运行多个相同的docker-compose。Yml文件放在不同的目录下,使用.env文件做一些细微的区别。并使用Nginx Proxy Manage与其他服务通信。这是我的文件:

确保已创建公共网络

docker network create nginx-proxy-man

/domain1.com/docker-compose.yml, /domain2.com/docker-compose.yml,…

version: "3.9"

services:
  webserver:
    build:
      context: ./bin/${PHPVERSION}
    container_name: "${COMPOSE_PROJECT_NAME}-${PHPVERSION}"
    ...
    networks:
      - default    # network outside
      - internal   # network internal
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: "${COMPOSE_PROJECT_NAME}-${DATABASE}"
    ...
    networks:
      - internal   # network internal


networks:
  default:
    external: true
    name: nginx-proxy-man
  internal:
    internal: true

.env文件只需更改COMPOSE_PROJECT_NAME

COMPOSE_PROJECT_NAME=domain1_com
.
.
.
PHPVERSION=php56

DATABASE=mysql57

网络服务器。container_name: domain1_com-php56 -将加入默认网络(名称:Nginx - Proxy -man),之前为Nginx代理管理器创建,以便从外部访问。

备注:container_name在同一网络中是唯一的。

数据库。Container_name: domain1_com-mysql57—更容易区分

在同样的docker-compose中。Yml,由于相同的网络domain1_com_internal,服务将通过服务名称相互连接。为了更加安全,请使用internal: true选项设置此网络

注意,如果您没有显式地为每个服务指定网络,而只是为两个docker-compose使用一个公共的外部网络。嗯,那么domain1_com很可能会使用domain2_com的数据库。

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

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

root@ubuntu-s-1vcpu-1gb-tor1-01:~# 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

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

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

这么多答案!

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

例如: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

回答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

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