Compose 中的联网

重要

Docker 的文档引用并介绍了 Compose V2 功能。

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

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

注意

您的应用网络根据 “项目名称” 命名。 它基于它所在的目录的名称。您可以覆盖 带有 --project-name 标志COMPOSE_PROJECT_NAME 环境变量的 project name。

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

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

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

  1. 将创建一个名为myapp_default
  2. 使用 的配置创建容器。它以名称 . 加入网络webmyapp_defaultweb
  3. 使用 的配置创建容器。它以名称 . 加入网络dbmyapp_defaultdb

现在,每个容器都可以查找服务名称或 取回相应容器的 IP 地址。例如,的 应用程序代码可以连接到 URL 并启动 使用 Postgres 数据库。webdbwebpostgres://db:5432

请务必注意 和 之间的区别。 在上面的示例中,对于 ,is 和容器端口 is(postgres 默认)。网络化的服务到服务 通信使用 .定义 When , 该服务也可以在 Swarm 之外访问。HOST_PORTCONTAINER_PORTdbHOST_PORT80015432CONTAINER_PORTHOST_PORT

在容器中,连接字符串 to 将类似于 ,而在主机上,连接字符串将 例如,如果您的容器在本地运行。webdbpostgres://db:5432postgres://{DOCKER_IP}:8001postgres://localhost:8001

更新网络上的容器

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

如果任何容器打开了与旧容器的连接,则它们将被关闭。容器负责检测此情况,再次查找名称并重新连接。

提示

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

链接允许您定义额外的别名,通过这些别名可以从其他服务访问服务。它们不需要启用 Services 进行通信。默认情况下,任何服务都可以访问该服务名称的任何其他服务。在以下示例中,可从 hostnames 和 处访问:dbwebdbdatabase

services:

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

有关更多信息,请参阅链接参考

多主机联网

启用了 Swarm 模式的 Docker Engine 上部署 Compose 应用程序时, 您可以使用内置驱动程序来启用多主机通信。overlay

叠加网络始终创建为 .您可以选择将 attachable 属性设置为 。attachablefalse

请参阅 Swarm 模式部分,了解如何设置 一个 Swarm 集群,以及多主机网络入门,以了解多主机覆盖网络。

指定自定义网络

您可以使用顶级键指定自己的网络,而不仅仅是使用默认应用程序网络。这样,您就可以创建更复杂的拓扑并指定自定义网络驱动程序和选项。您还可以使用它将服务连接到外部创建的不受 Compose 管理的网络。networks

每个服务都可以使用服务级别密钥指定要连接的网络,该服务级别密钥是引用顶级密钥下条目的名称列表。networksnetworks

以下示例显示了一个 Compose 文件,该文件定义了两个自定义网络。该服务与服务隔离,因为它们不共享一个共同的网络。只能与两者对话。proxydbapp

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

配置默认网络

除了指定您自己的网络之外,您还可以通过在 named 下定义一个条目来更改应用程序范围默认网络的设置:networksdefault

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]_defaultmy-pre-existing-network

更多参考信息

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