Compose 中的网络
重要Docker 文档引用并描述了 Compose V2 功能。
自 2023 年 7 月起,Compose V1 已停止接收更新,并且不再包含在新的 Docker Desktop 版本中。Compose V2 已取代它,并已集成到所有当前的 Docker Desktop 版本中。有关更多信息,请参阅 迁移到 Compose V2。
默认情况下,Compose 会为您的应用程序设置一个单独的网络。服务的每个容器都加入默认网络,并且既可以被该网络上的其他容器访问,也可以通过服务的名称被发现。
注意您的应用程序的网络名称是基于“项目名称”的,而项目名称又基于它所在的目录名称。您可以使用
--project-name标志或COMPOSE_PROJECT_NAME环境变量来覆盖项目名称。
例如,假设您的应用程序在一个名为 myapp 的目录中,并且您的 compose.yaml 如下所示
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"当您运行 docker compose up 时,会发生以下情况:
- 会创建一个名为
myapp_default的网络。 - 使用
web的配置创建一个容器。它以web的名称加入myapp_default网络。 - 使用
db的配置创建一个容器。它以db的名称加入myapp_default网络。
现在,每个容器都可以查找服务名称 web 或 db 并获取相应的容器 IP 地址。例如,web 的应用程序代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。
区分 HOST_PORT 和 CONTAINER_PORT 很重要。在上面的示例中,对于 db,HOST_PORT 是 8001,容器端口是 5432 (Postgres 默认)。服务到服务的网络通信使用 CONTAINER_PORT。当定义了 HOST_PORT 时,服务也可以在 Swarm 外部访问。
在 web 容器内,您连接到 db 的连接字符串将是 postgres://db:5432;在宿主机上,连接字符串将是 postgres://{DOCKER_IP}:8001,例如,如果您的容器在本地运行,则为 postgres://:8001。
更新网络上的容器
如果您对服务进行了配置更改并运行 docker compose up 进行更新,则旧容器将被移除,新容器将以不同的 IP 地址但相同的名称加入网络。运行中的容器可以查找该名称并连接到新地址,但旧地址将停止工作。
如果任何容器与旧容器有打开的连接,它们将被关闭。容器有责任检测此情况,再次查找名称并重新连接。
提示尽可能通过名称而不是 IP 地址引用容器。否则,您将需要不断更新所使用的 IP 地址。
链接容器
链接允许您定义额外的别名,通过这些别名,一个服务可以从另一个服务访问。它们不是实现服务通信所必需的。默认情况下,任何服务都可以通过该服务的名称访问任何其他服务。在以下示例中,web 可以通过主机名 db 和 database 访问 db:
services:
web:
build: .
links:
- "db:database"
db:
image: postgres有关更多信息,请参阅链接参考。
多主机网络
当在启用了 Swarm 模式的 Docker Engine 上部署 Compose 应用程序时,您可以使用内置的 overlay 驱动程序来实现多主机通信。
覆盖网络始终创建为 attachable。您可以选择将 attachable 属性设置为 false。
请查阅 Swarm 模式部分,了解如何设置 Swarm 集群,并查阅 多主机网络入门,了解多主机覆盖网络。
指定自定义网络
除了使用默认应用程序网络之外,您还可以使用顶级 networks 键指定自己的网络。这允许您创建更复杂的拓扑并指定自定义网络驱动程序和选项。您还可以使用它将服务连接到不由 Compose 管理的外部创建的网络。
每个服务都可以使用服务级 networks 键指定要连接到的网络,该键是引用顶级 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使用现有网络
如果您使用 docker network create 命令在 Compose 外部手动创建了桥接网络,您可以通过将网络标记为 external 来将您的 Compose 服务连接到它。
如果您希望容器加入预先存在的网络,请使用external 选项。
services:
# ...
networks:
network1:
name: my-pre-existing-network
external: trueCompose 不会尝试创建名为 [projectname]_default 的网络,而是寻找名为 my-pre-existing-network 的网络,并将您的应用程序容器连接到它。
进一步参考信息
有关可用网络配置选项的完整详细信息,请参阅以下参考资料: