在 Docker Compose 中定义和管理网络
网络允许服务之间进行通信。默认情况下,Compose 为您的应用程序设置一个单独的网络。每个服务的容器都加入默认网络,并且该网络上的其他容器可以访问,也可以通过服务的名称发现。顶层 `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:高级示例
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
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此示例显示了一个定义了两个自定义网络的 Compose 文件。`proxy` 服务与 `db` 服务隔离,因为它们没有共享一个公共网络。只有 `app` 可以与两者通信。
默认网络
当 Compose 文件未声明显式网络时,Compose 会使用隐式 `default` 网络。没有显式 networks 声明的服务由 Compose 连接到此 `default` 网络。
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有关选项,请参阅 Docker Engine 文档。
属性
可连接
如果 `attachable` 设置为 `true`,则除了服务之外,独立容器也应该能够连接到此网络。如果独立容器连接到网络,它就可以与也连接到网络的服务和其他独立容器进行通信。
networks:
mynet1:
driver: overlay
attachable: true驱动程序
`driver` 指定此网络应使用的驱动程序。如果平台中没有可用的驱动程序,Compose 将返回错误。
networks:
db-data:
driver: bridge有关驱动程序和可用选项的更多信息,请参阅 网络驱动程序。
driver_opts
`driver_opts` 指定要传递给驱动程序的键值对列表作为选项。这些选项取决于驱动程序。
networks:
frontend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"有关更多信息,请查阅 网络驱动程序文档。
启用 IPv4
`enable_ipv4` 可用于禁用 IPv4 地址分配。
networks:
ip6net:
enable_ipv4: false
enable_ipv6: true启用 IPv6
`enable_ipv6` 启用 IPv6 地址分配。
networks:
ip6net:
enable_ipv6: true外部的
如果设置为 `true`
- `external` 指定此网络的生命周期在应用程序的生命周期之外维护。Compose 不会尝试创建这些网络,如果不存在则返回错误。
- 除名称以外的所有其他属性均不相关。如果 Compose 检测到任何其他属性,它会将 Compose 文件视为无效。
在以下示例中,`proxy` 是通往外部世界的网关。Compose 不会尝试创建网络,而是向平台查询名为 `outside` 的现有网络,并将 `proxy` 服务的容器连接到该网络。
services:
proxy:
image: example/proxy
networks:
- outside
- default
app:
image: example/app
networks:
- default
networks:
outside:
external: trueIPAM
`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"内部的
默认情况下,Compose 提供对网络的外部连接。当 `internal` 设置为 `true` 时,您可以创建外部隔离的网络。
labels
使用 `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
`name` 设置网络的自定义名称。 `name` 字段可用于引用包含特殊字符的网络。名称按原样使用,不与项目名称作用域。
networks:
network1:
name: my-app-net它还可以与 `external` 属性结合使用,以定义 Compose 应检索的平台网络,通常通过使用参数,这样 Compose 文件就不需要硬编码运行时特定值。
networks:
network1:
external: true
name: "${NETWORK_ID}"其他资源
有关更多示例,请参见 Compose 中的网络。