Compose 中的网络

重要的

Docker 的文档引用并描述了 Compose V2 功能。

自 2023 年 7 月起,Compose V1 停止接收更新,并且不再出现在新的 Docker Desktop 版本中。 Compose V2 已取代它,并且现已集成到所有当前的 Docker Desktop 版本中。有关更多信息,请参阅 迁移到 Compose V2

默认情况下,Compose 会为您的应用程序设置一个 网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过服务的名称发现。

笔记

您的应用程序的网络根据“项目名称”指定名称,该名称基于其所在目录的名称。您可以使用标志--project-name 环境 COMPOSE_PROJECT_NAME变量覆盖项目名称。

例如,假设您的应用程序位于名为 的目录中myapp,并且您的compose.yml应用程序如下所示:

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

当您运行时docker compose up,会发生以下情况:

  1. myapp_default创建了一个名为的网络。
  2. web使用的配置创建容器。它myapp_default以 的名义加入网络 web
  3. db使用的配置创建容器。它myapp_default以 的名义加入网络 db

现在,每个容器都可以查找服务名称webdb获取相应容器的 IP 地址。例如,web的应用程序代码可以连接到 URLpostgres://db:5432并开始使用 Postgres 数据库。

HOST_PORT重要的是要注意和之间的区别CONTAINER_PORT。在上面的示例中,对于dbHOST_PORTis8001和容器端口是 5432(postgres 默认值)。网络服务到服务通信使用CONTAINER_PORT.定义后HOST_PORT,服务也可以在集群外部访问。

web容器内,您的连接字符串将db类似于 postgres://db:5432,并且从主机来看,连接字符串将类似于postgres://{DOCKER_IP}:8001例如,postgres://localhost:8001如果您的容器在本地运行。

更新网络上的容器

如果您对服务进行配置更改并运行docker compose up更新它,旧容器将被删除,新容器会以不同的 IP 地址但名称相同的方式加入网络。正在运行的容器可以查找该名称并连接到新地址,但旧地址将停止工作。

如果任何容器与旧容器打开连接,它们就会被关闭。容器有责任检测这种情况,再次查找名称并重新连接。

提示

尽可能按名称而不是 IP 引用容器。否则,您将需要不断更新您使用的 IP 地址。

链接允许您定义额外的别名,通过这些别名可以从另一个服务访问一个服务。它们不需要使服务能够通信。默认情况下,任何服务都可以通过该服务的名称访问任何其他服务。在以下示例中,db可从web主机名db和访问database

services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

请参阅 链接参考以获取更多信息。

多主机网络

在启用 Swarm 模式的Docker 引擎上部署 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:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

通过为每个连接的网络设置ipv4_address 和/或 ipv6_address,可以为网络配置静态 IP 地址 。

还可以为网络指定 自定义名称

services:
  # ...
networks:
  frontend:
    name: custom_frontend
    driver: custom-driver-1

配置默认网络

networks您还可以通过在name下定义一个条目来更改应用程序范围内的默认网络的设置,而不是指定您自己的网络,或者同时指定您自己的网络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

Compose不会尝试创建名为 的网络[projectname]_default,而是查找名为 的网络my-pre-existing-network并将应用程序的容器连接到该网络。

更多参考信息

有关可用网络配置选项的完整详细信息,请参阅以下参考资料: