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}"
相关推荐
liu****5 小时前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术
池央6 小时前
CANN 诊断工具链深度解析:oam-tools 的自动化故障信息收集、软硬件状态快照与 AI Core 错误溯源机制
运维·人工智能·自动化
云边有个稻草人6 小时前
打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车
运维·服务器·cpolar
乾元6 小时前
终端安全(EDR):用深度学习识别未知勒索软件
运维·人工智能·网络协议·安全·网络安全·自动化·安全架构
logocode_li6 小时前
OCI/CRI 双标准下:从 dockerd 到 containerd 的 K8s 运行时迭代史
docker·云原生·容器·k8s
wbs_scy6 小时前
Linux 进阶指令实操指南:文件查看、时间管理、搜索压缩全场景覆盖(附高频案例)
linux·运维·服务器
安科瑞刘鸿鹏176 小时前
高速路灯故障难定位?用 ASL600 实现精确单灯监测与维护预警
运维·网络·物联网·安全
馨谙6 小时前
Ansible 事实(Facts)全面指南:自动化运维中的主机信息管理
运维·ansible
Lethehong6 小时前
实测可用|一文搞定OpenClaw部署,免费kimi-k2.5+飞书远程,新手也能秒上手
linux·运维·服务器·玩转openclaw·云端创意实践
馨谙7 小时前
Ansible处理程序完全指南:实现智能的任务触发机制
运维·ansible