首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Compose网络 | Networking in Compose

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

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

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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只能与两者通话。

代码语言:javascript
复制
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

代码语言:javascript
复制
version: "3"
services:

  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

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

使用预先存在的网络

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

代码语言:javascript
复制
networks:
  default:
    external:
      name: my-pre-existing-network

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

扫码关注腾讯云开发者

领取腾讯云代金券