docker-compose文件属性(3)顶部元素networks

networks使服务能够相互通信。默认情况下,Compose 会为您的应用程序设置一个单一的网络。每个服务的容器都会加入 default 网络,并且可以在该网络中的其他容器之间被访问到,同时还能通过服务的名称发现该服务。顶级的 networks 元素允许配置具有名称的网络,这些网络可以在多个服务中重复使用。

若要在多个服务中使用网络,必须通过在"services"顶级元素内使用"networks"属性来明确授予每个服务访问权限。该"networks"顶级元素具有更复杂的语法,可提供更精细的控制。

基本实例:在以下示例中,在运行时会创建网络 front-tier 和 back-tier,并且 frontend 服务会与 front-tier 和 back-tier 网络相连接。

复制代码
services:
  frontend:
    image: example/webapp
    networks:
      - front-tier
      - back-tier

networks:
  front-tier:
  back-tier:

高级实例:此示例展示了一个"Compose"文件,该文件定义了两个自定义网络。proxy 服务与 db 服务相互隔离,因为它们不共用同一网络。只有 app 服务能够与两者进行通信。

复制代码
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres:18
    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

default网络:当一个 Compose 文件未明确指定网络时,Compose 会使用一个隐式的 default 网络。未明确指定网络的服务会通过 Compose 连接到这个默认网络:

复制代码
services:
  some-service:
    image: foo

#该示例与虾下面的示例相同            
services:
  some-service:
    image: foo
    networks:
      default: {}  
networks:
  default: {}      

可以通过明确的声明来自定义 default 网络:

复制代码
networks:
  default: 
    name: a_network # Use a custom name
    driver_opts:    # pass options to driver for network creation
      com.docker.network.bridge.host_binding_ipv4: 127.0.0.1

networks子属性:

  • attachable:如果该属性设置为 true ,那么独立容器应能够连接到此网络,除了服务之外。如果一个独立容器连接到该网络,它就能够与同样连接到该网络的服务以及其他独立容器进行通信。

    networks:
    mynet1:
    driver: overlay
    attachable: true

  • driver:指定此网络应使用何种驱动程序。如果该驱动程序在当前平台上不可用,Compose 将返回错误信息。

    networks:
    db-data:
    driver: bridge

  • driver_options:以键值对的形式指定一系列选项,以便传递给驱动程序。这些选项取决于具体的驱动程序。

    networks:
    frontend:
    driver: bridge
    driver_opts:
    com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"

  • enable_ipv4:需要Docker Compose 2.33.1 及以上版本。启用 IPv4 地址分配。

  • enable_ipv6:启用IPv6地址分配

    复制代码
    networks:
      ip6net:
        enable_ipv4: false
        enable_ipv6: true
  • external:如果设置为 true,指定该网络的生命周期独立于应用程序的生命周期。Compose 不会尝试创建这些网络,如果不存在此类网络则会返回错误信息。除了 name 之外的所有其他属性均无关紧要。如果 Compose 发现有任何其他属性,它就会将该 Compose 文件判定为无效。
    在以下示例中,proxy 是通往外部世界的入口。它并非试图构建网络,而是向平台查询一个名为 outside 的现有网络,并将 proxy 服务的容器连接到该网络上。

    services:
    proxy:
    image: example/proxy
    networks:
    - outside
    - default
    app:
    image: example/app
    networks:
    - default

    networks:
    outside:
    external: true

  • ipam:IPAM 指定了一个自定义的 IPAM 配置。这是一个具有若干属性的对象,其中每个属性都是可选的:

  • driver:自定义 IPAM 驱动程序,而非默认的。

  • config:包含零个或多个配置元素的列表,每个元素包含:

    • subnet:以 CIDR 格式表示的网络段,代表一个网络区域
    • ip_range:用于分配容器 IP 的 IP 范围
    • gateway:主子网的 IPv4 或 IPv6 网关
    • aux_addresses:由网络驱动程序使用的辅助 IPv4 或 IPv6 地址,以主机名到 IP 的映射形式呈现
  • options:作为键值对表示的驱动程序特定选项。

    networks:
    mynet1:
    ipam:
    driver: default
    config:
    - subnet: 172.28.0.0/16
    ip_range: 172.28.5.0/24
    gateway: 172.28.5.254
    aux_addresses:
    host1: 172.28.1.5
    host2: 172.28.1.6
    host3: 172.28.1.7
    options:
    foo: bar
    baz: "0"

  • nternal:默认情况下,Compose 提供了与外部网络的连接功能。而当"internal"设置为"true"时,便能够创建一个与外部网络完全隔离的网络。

  • labels:通过标签为容器添加元数据。可以使用数组或者字典的方式来进行操作。建议您使用反向 DNS 标记法,以避免标签与其他软件所使用的标签发生冲突。

    networks:
    mynet1:
    labels:
    com.example.description: "Financial transaction network"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""

    networks:
    mynet1:
    labels:
    - "com.example.description=Financial transaction network"
    - "com.example.department=Finance"
    - "com.example.label-with-empty-value"

Compose会设置com.docker.compose.project 和 com.docker.compose.network 标签

  • name:用于为网络设置自定义名称。名称字段可用于引用包含特殊字符的网络。该名称将直接使用,且不会与项目名称绑定。

    networks:
    network1:
    name: my-app-net

它还可以与外部属性结合使用,以定义 Compose 应该获取的平台网络,通常通过使用一个参数来实现,这样 Compose 文件就不必硬编码运行时特定的值了:

复制代码
networks:
  network1:
    external: true
    name: "${NETWORK_ID}"
相关推荐
小p1 天前
docker学习7:docker 容器的通信方式
docker
小p1 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p1 天前
docker学习3:docker是怎么实现的?
docker
小p2 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p3 天前
docker学习: 1. docker基本使用
docker
蝎子莱莱爱打怪3 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀3 天前
Docker部署Nacos
docker·容器
缓解AI焦虑3 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter4 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet