Networking in Compose

预计阅读时间:6分钟

此页面适用于 Compose 文件格式版本 2更高版本. Compose 文件版本 1(已弃用)不支持网络功能.

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

Note

您的应用程序网络的名称基于"项目名称",该名称基于其所在目录的名称.您可以使用--project-name标志COMPOSE_PROJECT_NAME环境变量覆盖项目名称.

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

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

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

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

在 v2.1+ 中,覆盖网络始终是attachable

从 Compose 文件格式 2.1 开始,覆盖网络始终创建为attachable ,这是不可配置的. 这意味着独立容器可以连接到覆盖网络.

在 Compose 文件格式 3.x 中,您可以选择将attachable属性设置为false .

每个容器现在都可以查找主机名webdb并取回相应容器的 IP 地址. 例如, web的应用程序代码可以连接到 URL postgres://db:5432并开始使用 Postgres 数据库.

注意HOST_PORTCONTAINER_PORT之间的区别很重要. 在上面的示例中,对于dbHOST_PORT8001 ,容器端口是5432 (postgres 默认值). 网络服务到服务通信使用CONTAINER_PORT . 当HOST_PORT被定义时,服务也可以在 swarm 之外访问.

web容器中,您到db的连接字符串看起来像postgres://db:5432 ,而从主机上,连接字符串看起来像postgres://{DOCKER_IP}:8001 .

Update containers

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

如果任何容器与旧容器的连接打开,它们将被关闭. 检测这种情况、再次查找名称并重新连接是容器的责任.

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

version: "3.9"
services:

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

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

Multi-host networking

启用 Swarm 模式的 Docker 引擎上部署 Compose 应用程序时,您可以利用内置的overlay驱动程序来启用多主机通信.

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

Specify custom networks

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

每个服务都可以使用服务级networks键指定要连接的网络,该键是引用顶级networks键下条目的名称列表.

这是一个定义两个自定义网络的示例 Compose 文件. proxy服务与db服务是隔离的,因为它们不共享一个共同的网络——只有app可以与两者通信.

version: "3.9"

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 地址.

网络也可以被赋予一个自定义名称(从 3.5 版开始):

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

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

Configure the default network

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

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

Use a pre-existing network

如果您希望您的容器加入预先存在的网络,请使用external选项

services:
  # ...
networks:
  default:
    external:
      name: my-pre-existing-network

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

documentation, docs, docker, compose, orchestration, containers, networking

by  icopy.site