Compose 中的联网
重要
Docker 的文档引用并介绍了 Compose V2 功能。
自 2023 年 7 月起,Compose V1 停止接收更新,并且不再出现在新的 Docker Desktop 版本中。Compose V2 已取代它,现已集成到所有当前的 Docker Desktop 版本中。有关更多信息,请参阅迁移到 Compose V2。
默认情况下,Compose 会为您的应用设置一个网络。每 容器加入默认网络,并且都可以由 该网络上的其他容器,并且可通过服务名称发现。
注意
您的应用网络根据 “项目名称” 命名。 它基于它所在的目录的名称。您可以覆盖 project name 替换为
--project-name
旗或COMPOSE_PROJECT_NAME
环境变量.
例如,假设您的应用程序位于名为myapp
和compose.yml
如下所示:
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
当您运行docker compose up
,则会出现以下情况:
- 一个名为
myapp_default
已创建。 - 容器是使用
web
的配置。它加入网络myapp_default
在名称下web
. - 容器是使用
db
的配置。它加入网络myapp_default
在名称下db
.
现在,每个容器都可以查找服务名称web
或db
和
取回相应容器的 IP 地址。例如web
的
应用程序代码可以连接到 URLpostgres://db:5432
并开始
使用 Postgres 数据库。
重要的是要注意HOST_PORT
和CONTAINER_PORT
.
在上面的示例中,对于db
这HOST_PORT
是8001
且 container port 为5432
(postgres 默认)。网络化的服务到服务
通信使用CONTAINER_PORT
.什么时候HOST_PORT
定义,
该服务也可以在 Swarm 之外访问。
在web
container,将连接字符串传递给db
看起来像postgres://db:5432
,并且从主机中,连接字符串将
肖postgres://{DOCKER_IP}:8001
例如postgres://localhost:8001
如果您的容器在本地运行。
更新网络上的容器
如果您对服务进行配置更改并运行docker compose up
要更新它,旧容器将被删除,新容器以不同的 IP 地址但名称相同加入网络。正在运行的容器可以查找该名称并连接到新地址,但旧地址将停止工作。
如果任何容器打开了与旧容器的连接,则它们将被关闭。容器负责检测此情况,再次查找名称并重新连接。
提示
尽可能按名称(而不是 IP)引用容器。否则,您需要不断更新您使用的 IP 地址。
链接容器
链接允许您定义额外的别名,通过这些别名可以从其他服务访问服务。它们不需要启用 Services 进行通信。默认情况下,任何服务都可以访问该服务名称的任何其他服务。在以下示例中,db
可从web
在 hostnamesdb
和database
:
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
有关更多信息,请参阅链接参考。
多主机联网
在启用了 Swarm 模式的 Docker Engine 上部署 Compose 应用程序时,
您可以使用内置的overlay
驱动程序来启用多主机通信。
叠加网络始终创建为attachable
.您可以选择设置attachable
property 设置为false
.
请参阅 Swarm 模式部分,了解如何设置 一个 Swarm 集群,以及多主机网络入门,以了解多主机覆盖网络。
指定自定义网络
除了使用默认应用网络外,您还可以使用顶级networks
钥匙。这样,您就可以创建更复杂的拓扑并指定自定义网络驱动程序和选项。您还可以使用它将服务连接到外部创建的不受 Compose 管理的网络。
每个服务都可以指定要连接到的服务级别的网络networks
key,它是引用顶级networks
钥匙。
以下示例显示了一个 Compose 文件,该文件定义了两个自定义网络。这proxy
服务与db
服务,因为它们不共享一个共同的网络。只app
可以与两者交谈。
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Specify driver options
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
backend:
# Use a custom driver
driver: custom-driver
通过为每个连接的网络设置 ipv4_address 和/或 ipv6_address,可以使用静态 IP 地址配置网络。
还可以为网络指定自定义名称:
services:
# ...
networks:
frontend:
name: custom_frontend
driver: custom-driver-1
配置默认网络
除了指定您自己的网络之外,您还可以通过在networks
叫default
:
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
使用预先存在的网络
如果您希望容器加入预先存在的网络,请使用external
选择
services:
# ...
networks:
network1:
name: my-pre-existing-network
external: true
而不是尝试创建名为[projectname]_default
中,Compose 会查找名为my-pre-existing-network
并将应用的容器连接到它。
更多参考信息
有关可用网络配置选项的完整详细信息,请参阅以下参考资料: