撰写网络

预计阅读时间:6分钟

此页面适用于版本2更高版本的撰写文件格式。撰写文件版本1(不建议使用)不支持网络功能。

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

笔记

为应用程序的网络提供一个基于“项目名称”的名称,该名称基于其所在目录的名称。您可以使用--project-nameflagCOMPOSE_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的配置创建的。它myapp_default以的名称加入网络 web
  3. 容器是使用db的配置创建的。它myapp_default以的名称加入网络 db

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

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

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

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

要注意区分是很重要的HOST_PORTCONTAINER_PORT。在上面的示例中,对于dbHOST_PORTis是8001,容器端口为 5432(postgres默认)。联网的服务到服务通信使用CONTAINER_PORT。当HOST_PORT定义,服务以及虫群外部访问。

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

更新容器

如果对服务进行配置更改并运行docker-compose up以对其进行更新,则会删除旧容器,而新容器将使用其他IP地址但名称相同的网络加入网络。运行中的容器可以查找该名称并连接到新地址,但是旧地址会停止工作。

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

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

version: "3.9"
services:

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

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

多主机联网

启用S​​warm模式的Docker引擎上部署Compose应用程序时,可以使用内置overlay驱动程序来启用多主机通信。

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

指定自定义网络

您不仅可以使用默认的应用程序网络,还可以使用顶级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

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

配置默认网络

除了(或同时)指定自己的网络,您还可以通过在networksnamed下定义一个条目来更改应用程序范围内默认网络的设置default

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

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

使用预先存在的网络

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

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

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

文档文档泊坞窗撰写编排容器联网