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. 运行和检查容器
最后,我们可以使用 up 或 down 命令来启动或停止服务。
如果我们在服务定义中创建了一个网络,我们需要先启动那个服务,就像我们 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仓库。