Docker 17
撰写 | Compose

Compose网络 | Networking in Compose

Compose 网络

注意:只有在使用 Compose 文件格式的版本2或更高版本时,本文才适用。网络功能不支持版本1(传统)撰写文件。

默认情况下,组合设置一个网络你的应用程序。服务的每个容器都加入了默认网络,并且两者都是。可达网络上的其他容器,以及可发现由它们在主机名上与容器名称相同。

:您的应用程序的网络是根据“项目名称”命名的,该名称基于它所在的目录的名称。可以使用--project-name标志或者COMPOSE_PROJECT_NAME环境变量。

例如,假设应用程序位于一个名为myapp,而你的docker-compose.yml看起来是这样的:

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

当运行docker-compose up的时候,发生如下情况:

  • myapp_default被创造了。

  • 容器是使用web的配置。它加入了网络myapp_default以这个名字web

  • 容器是使用db的配置。它加入了网络myapp_default以这个名字db

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

注意区分HOST_PORT和区分是重要的CONTAINER_PORT。在上面的例子中,db中,HOST_PORT8001和容器端口是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" services: web: build: . links: - "db:database" db: image: postgres

见链接参考想了解更多信息。

多主机联网

注意:本节中的指示信息涉及传统的 Docker Swarm 操作,并且仅在针对传统 Swarm 集群时才起作用。有关将撰写项目部署到较新的集成群模式的说明,请参阅 Docker Stacks 文档。

何时将组合应用程序部署到群集集群,您可以使用内置的overlay驱动程序,以启用容器之间的多主机通信,而不更改组合文件或应用程序代码。

请参阅多主机网络入门以了解如何设置 Swarm 群集。群集将overlay默认使用该驱动程序,但如果您愿意,您可以明确指定它 - 请参阅下文了解如何执行此操作。

指定自定义网络

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

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

以下是定义两个自定义网络的示例撰写文件。proxy服务与服务是隔离的db,因为它们不共享共享的网络 - app只能与两者通话。

version: "3" 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 地址。

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

  • 顶层networks

  • 服务级networks

配置默认网络

除了指定您自己的网络外,您还可以通过在networks名称下定义条目来更改应用程序范围的默认网络的设置default

version: "3" services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1

使用预先存在的网络

如果希望容器加入现有网络,请使用external期权*

networks: default: external: name: my-pre-existing-network

而不是试图创建一个名为[projectname]_default,将寻找一个名为my-pre-existing-network并将应用程序的容器连接到它。

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