一、简介

配置 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-tierback-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:
# 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"

上面的 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.projectcom.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 tags

#Docker