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:
- defaultnetworks:
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}"