一、简介 配置 networks 以使服务之间可以相互通信。
默认情况下,Compose 会为您的应用设置一个单一的网络。服务中的每一个容器都会加入默认网络,其可以被该网络上的其他容器访问,同时也可以通过服务的名称被发现。
配置 networks 元素允许您配置可以跨多个服务的网络。
要在多个服务之间使用一个网络,必须在 services
顶层元素中使用 networks
属性显式授予每个服务访问权限。networks
顶层元素有额外的语法,提供了更细粒度的控制。
二、示例 1、基础示例 1 2 3 4 5 6 7 8 9 10 services: frontend: image: example/webapp networks: - front-tier - back-tier networks: front-tier: back-tier:
上面的示例中,声明了两个网络 front-tier
和 back-tier
,创建了 frontend
服务,该服务连接到这两个网络中。
2、额外示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 services: proxy: build: ./proxy networks: - frontend app: build: ./app networks: - frontend - backend db: image: postgres networks: - backend networks: frontend: driver: custom-driver-1 backend: driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
上面的 Compose 文件定义了两个自定义网络。proxy
服务与 db
服务是隔离的,因为它们不共享一个公共网络。只有 app 服务可以与两者通信。
三、属性 1、driver driver
属性指定此网络应该使用何种类型的驱动程序,如果该驱动程序在该系统上不能使用,Compose 将报错。
1 2 3 networks: db-data: driver: bridge
取值有:
bridge
host
overlay
ipvlan
macvlan
none
2、driver_opts driver_opts
属性指定了需要传给驱动程序的一个键值对列表。
3、name name
属性指定该网络的自定义名称。
1 2 3 4 networks: zookeeper-net: name: zookeeper-cluster-net driver: bridge
最后创建的网络如下:
1 2 3 4 5 6 $ docker network ls NETWORK ID NAME DRIVER SCOPE 4f5ad219decf bridge bridge local 41f9c7becd47 host host local 00b1cd51ecbb none null local ae43232d9f4b zookeeper-cluster-net bridge local
4、internal 默认情况下,Compose 提供与网络的外部连接。internal
属性设置为 true 时,允许您创建外部隔离的网络。
5、external 如果设置为 true:
external
指定此网络的声明周期在应用程序的生命周期之外进行维护。Compose 不会尝试创建此网络,如果该网络不存在则报错。
除 name
属性外的所有其他属性都是不重要的。如果 Compose 检测到任何其他的属性,它会将 Compose 文件视为无效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 services: proxy: image: example/proxy networks: - outside - default app: image: example/app networks: - default networks: outside: external: true
在上面的例子中,proxy
属性是连接外网的网关。Compose 不会尝试创建 outside
网络,而是在平台上查询一个名为 outside
的现有网络,并将 proxy
服务的容器连接到该网络。
5.1 external 属性示例 现有网络如下:
1 2 3 4 5 6 $ docker network ls NETWORK ID NAME DRIVER SCOPE 4f5ad219decf bridge bridge local 41f9c7becd47 host host local 00b1cd51ecbb none null local ae43232d9f4b zookeeper-cluster-net bridge local
Compose 文件中声明如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 networks: kafka-net: name: kafka-cluster-net driver: bridge zookeeper-net-zyz: name: zookeeper-cluster-net-zyz external: true services: kafka-1: image: bitnami/kafka:3.8.0 container_name: ${container_name}-1 hostname: ${host_name}-1 networks: - kafka-net - zookeeper-net-zyz ports: - 127.0 .0 .1 :9092:9092 volumes: - kafka_data:/bitnami environment: KAFKA_CFG_NODE_ID: 1 KAFKA_CFG_ZOOKEEPER_CONNECT: zoo-1:2181
调用 docker compose config
命令是可以解析成功的。但是调用 docker compose up -d
启动服务启动失败,报错未找到网络 zookeeper-cluster-net-zyz
1 2 3 4 $ docker compose up -d [+] Running 1/0 ✔ Network kafka-cluster-net Created 0.0s Error response from daemon: network zookeeper-cluster-net-zyz not found
6、attachable
attachable
美 /ə’tætʃəbl/ 英 /ə’tætʃəbl/
adj. 可附上的,可连接的,可逮捕的;
如果 attachable
属性设置为 true
,那么该服务之外的独立的容器,也能够连接到这个网络。连接到该网络的独立容器可以与该网络上的服务以及其他连接到网络的独立容器进行通信。
示例如下:
1 2 3 4 networks: mynet1: driver: overlay attachable: true
7、enable_ipv6 enable_ipv6
选项用于启用 IPv6 网络。
8、ipam IPAM 是 IP Address Management(IP 地址管理) 的缩写,用于管理和分配网络中的 IP 地址。它包括分配、跟踪和维护网络设备的 IP 地址,以确保每个设备在网络中拥有一个唯一的 IP。
ipam
属性指定了自定义的 IP 地址管理 (IPAM) 配置。它是一个对象,包含几个可选的属性:
driver
: 自定义 IPAM 驱动程序,替代默认的驱动程序。
config
: 包含零个或多个配置元素的列表,每个元素包含:
subnet
: 以 CIDR 格式表示的子网,代表网络段。
ip_range
: 用于分配容器 IP 地址的 IP 范围。
gateway
: 主子网的 IPv4 或 IPv6 网关。
aux_addresses
: 由网络驱动程序使用的辅助 IPv4 或 IPv6 地址,作为主机名到 IP 的映射。
options
: 驱动程序特定的选项,以键值对形式进行映射。
这个配置主要用于在 Docker 网络中管理 IP 地址的分配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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"
9、lables 为容器添加元数据时,可以使用标签 labels
。你可以选择使用数组或字典格式来添加这些标签。
推荐使用反向 DNS 的命名方式(reverse-DNS notation),以防止标签与其他软件使用的标签发生冲突。
1 2 3 4 5 6 networks: mynet1: labels: com.example.description: "Financial transaction network" com.example.department: "Finance" com.example.label-with-empty-value: ""
1 2 3 4 5 6 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
这两个标签。
这两个标签主要用于标识项目和网络信息:
com.docker.compose.project
:指示容器所属的 Compose 项目名称。
com.docker.compose.network
:指示容器所属的 Compose 网络名称。
上面的两个标签在 Compose 生成的容器上自动添加,用于帮助管理和区分容器之间的关系。
如下示例为 Redis 单节点 Compose 容器的 inspect 中的 labels:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { "Config" : { "Labels" : { "com.docker.compose.config-hash" : "c19d83279198f2e023089f22b0096bb90d2e9cad97f7a8875b2132ef90a5e6b7" , "com.docker.compose.container-number" : "1" , "com.docker.compose.depends_on" : "" , "com.docker.compose.image" : "sha256:36900367459b7ddb7d83b62ff3d0afd2e99b73dd65892e2d3a13dec4a52f18e7" , "com.docker.compose.oneoff" : "False" , "com.docker.compose.project" : "redis-single-demo" , "com.docker.compose.project.config_files" : "E:\\Documents\\notes\\数据库\\Redis\\Docker 部署\\单节点\\compose.yaml" , "com.docker.compose.project.working_dir" : "E:\\Documents\\notes\\数据库\\Redis\\Docker 部署\\单节点" , "com.docker.compose.service" : "redis-single" , "com.docker.compose.version" : "2.29.2" } } }
相关链接 Networks top-level elements | Docker Docs
Network drivers overview | Docker Docs
Networking | Docker Docs
OB links #Docker