1. 概述

我们通常使用一个名为 docker-compose.yml 的文件来引用Docker Compose。然而,在某些情况下,我们需要使用多个 YAML 文件,并且仍然能够使运行的容器位于同一网络中。

在这篇简短教程中,我们将看到如何通过使用 网络 来连接多个 Docker Compose 项目,并通过一些 docker-compose.yml 示例进行说明。

2. 使用网络连接多个 Docker Compose 项目

由于Docker Compose引入了网络功能,我们可以使我们的容器意识到现有网络并允许它们加入该网络。

例如,假设我们希望Redis缓存和Web应用成为同一个网络的一部分,但它们是两个不同的 YAML 文件。

2.1. 加入现有网络

首先,让我们创建一个网络:

docker network create network-example

然后,我们可以在 YAML 模板中定义对现有网络的引用。

让我们看看 Redis 的定义:

services:
  db:
    image: redis:latest
    container_name: redis
    ports:
      - '6379:6379'
    networks:
      - network-example

networks:
  network-example:
    external: true

同样地,我们也可以在另一个文件中为 Web 应用定义它:

services:
  my_app:
    image: "web-app:latest"
    container_name: web-app
    ports:
      - "8080:8080"
    networks:
      - network-example

networks:
  network-example:
    external: true

2.2. 在 YAML 模板中定义网络

*同样地,我们也可以在模板内部定义一个 网络,例如我们的 redis_network*

services:
  db:
    image: redis:latest
    container_name: redis
    ports:
      - '6379:6379'
    networks:
      - network

networks:
  network:
    driver: bridge
    name: redis_network

这次,当我们设置 Web 应用的模板时,我们需要引用 Redis 的现有网络:

services:
  my_app:
    image: "web-app:latest"
    container_name: web-app
    ports:
      - "8080:8080"
    networks:
      - my-app

networks:
  my-app:
    name: redis_network
    external: true

3. 运行和检查容器

最后,我们可以使用 updown 命令来启动或停止服务。

如果我们在服务定义中创建了一个网络,我们需要先启动那个服务,就像我们 Redis 的例子一样:

docker-compose -f docker-compose-redis-service.yaml up -d && docker-compose -f docker-compose-my-app-service.yaml up -d

让我们使用 inspect 命令检查运行中的容器,例如我们的 Redis 服务:

docker inspect 5c7f8b28480b

我们会看到 redis_network 的条目。对于 Web 应用的检查也会得到同样的输出:

"Networks": {
    "redis_network": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": [
            "redis",
            "4d23d918eb2c"
        ],
        "NetworkID": "e122aa15d5ad150a66d87f3145084520bde540447a14a73f446ec6ea0603aba9",
        "EndpointID": "8904a3389d0b20c6785884c702cb6ae1101522af1f99c079067171cbc9ca97e5",
        "Gateway": "172.28.0.1",
        "IPAddress": "172.28.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:1c:00:02",
        "DriverOpts": null
    }
}

同样地,我们也可以检查 redis_network

docker network inspect redis_network

我们的两个服务都属于同一个网络:

"Containers": {
    "5c7f8b28480ba638ce993c6714841265c0a98d746b27205a756936bbe1850ac2": {
        "Name": "redis",
        "EndpointID": "238bb136d634100eccb7677e87ba07eb43f33be1dc320c795685230f04b809f9",
        "MacAddress": "02:42:ac:1c:00:02",
        "IPv4Address": "172.28.0.2/16",
        "IPv6Address": ""
    },
    "8584ce3bb2ab1cd3d182346c67179a3aa5e40c71e806c35cc4ce7ea91cae7902": {
        "Name": "web-app",
        "EndpointID": "9cf0e484e5af1baf968249c312489a83f57a194098a51652c3f6eac19ed0d557",
        "MacAddress": "02:42:ac:1c:00:03",
        "IPv4Address": "172.28.0.3/16",
        "IPv6Address": ""
    }
}

4. 结论

在这篇文章中,我们看到了如何将多个 Docker Compose 服务连接到相同的网络。我们可以让它们加入现有的网络,或者从服务定义创建网络。

如往常一样,我们可以在这里找到我们示例的源 docker-compose.yml 文件:GitHub仓库