Bridge 网络驱动程序

在联网方面,桥接网络是链路层设备 在网段之间转发流量。网桥可以是硬件 设备或在主机内核中运行的软件设备。

就 Docker 而言,桥接网络使用软件桥接,它允许 连接到同一桥接网络的容器进行通信,同时提供 与未连接到该桥接网络的容器隔离。这 Docker bridge 驱动程序会自动在主机中安装规则,以便 不同桥接网络上的容器无法直接与每个 其他。

桥接网络适用于在同一 Docker 守护程序主机上运行的容器。 对于在不同 Docker 守护程序主机上运行的容器之间的通信,您可以 可以在操作系统级别管理路由,也可以使用覆盖网络

启动 Docker 时,默认的桥接网络(以及 调用 ),并且新启动的容器会连接 除非另有说明。您还可以创建用户定义的自定义网桥 网络。用户定义的桥接网络优于默认桥接网络。bridge

用户定义的桥接和默认桥接之间的差异

  • 用户定义的网桥在容器之间提供自动 DNS 解析

    默认桥接网络上的容器只能通过 IP 相互访问 地址,除非您使用 --link 选项,即 被认为是遗产。在用户定义的桥接网络上,容器可以解析 彼此按名称或别名。

    假设有一个应用程序具有 Web 前端和数据库后端。如果您调用 您的容器和 Web 容器可以连接到数据库容器 ,无论应用程序堆栈在哪个 Docker 主机上运行。webdbdb

    如果您在默认桥接网络上运行相同的应用程序堆栈,则需要 在容器之间手动创建链接(使用 legacy 标志)。这些链接需要在两个方向上创建,因此您可以看到这一点 如果有两个以上的容器需要通信,则变得复杂。 或者,您可以操作容器中的文件, 但这会产生难以调试的问题。--link/etc/hosts

  • 用户定义的网桥提供更好的隔离

    所有未指定 的容器都将连接到默认桥接网络。这可能是一个风险,因为不相关的堆栈/服务/容器随后能够进行通信。--network

    使用用户定义的网络提供了一个范围网络,在该网络中,只有连接到该网络的容器才能进行通信。

  • 容器可以动态地从用户定义的网络中附加和分离

    在容器的生命周期内,您可以连接容器或从容器中断开它 用户定义的动态网络。从默认容器中删除容器 bridge 网络,你需要停止容器,并使用不同的 网络选项。

  • 每个用户定义的网络都会创建一个可配置的网桥

    如果您的容器使用默认桥接网络,您可以对其进行配置,但 所有容器都使用相同的设置,例如 MTU 和规则。 此外,配置默认桥接网络发生在 Docker 之外 本身,并且需要重新启动 Docker。iptables

    用户定义的桥接网络是使用 创建和配置的。如果不同的应用程序组具有不同的 Network Requirements,您可以单独配置每个用户定义的网桥, 创建它时。docker network create

  • 默认桥接网络上的链接容器共享环境变量

    最初,在两个容器之间共享环境变量的唯一方法 是使用 --link 标志链接它们。这种类型的 用户定义的网络无法进行变量共享。然而,那里 是共享环境变量的卓越方法。一些想法:

    • 多个容器可以挂载包含共享 信息,使用 Docker 卷。

    • 可以使用 API 中的 compose 文件可以定义共享变量。docker-compose

    • 您可以使用 swarm 服务而不是独立容器,并采用 共享密钥配置的优势。

连接到同一个用户定义的桥接网络的容器可以有效地暴露所有端口 彼此。对于容器或非 Docker 主机可以访问的端口 不同的网络,则必须使用 OR 标志发布该端口。-p--publish

选项

下表描述了在使用驱动程序创建自定义网络时可以传递给的特定于驱动程序的选项。--optionbridge

选择违约描述
com.docker.network.bridge.name创建 Linux 网桥时使用的接口名称。
com.docker.network.bridge.enable_ip_masqueradetrue启用 IP 伪装。
com.docker.network.bridge.gateway_mode_ipv4
com.docker.network.bridge.gateway_mode_ipv6
nat启用 NAT 和伪装 (),或仅允许直接路由到容器 ()。natrouted
com.docker.network.bridge.enable_icctrue启用或禁用容器间连接。
com.docker.network.bridge.host_binding_ipv4所有 IPv4 和 IPv6 地址绑定容器端口时的默认 IP。
com.docker.network.driver.mtu0(无限制)设置容器网络的最大传输单位 (MTU)。
com.docker.network.container_iface_prefixeth为容器接口设置自定义前缀。
com.docker.network.bridge.inhibit_ipv4false阻止 Docker 为网络分配 IP 地址

其中一些选项也可用作 CLI 的标志,而您 可以使用它们在启动 Docker 时配置默认网桥 守护 进程。下表显示了哪些选项在 CLI 中具有等效的标志。dockerddocker0dockerd

选择
com.docker.network.bridge.name-
com.docker.network.bridge.enable_ip_masquerade--ip-masq
com.docker.network.bridge.enable_icc--icc
com.docker.network.bridge.host_binding_ipv4--ip
com.docker.network.driver.mtu--mtu
com.docker.network.container_iface_prefix-

Docker 守护程序支持一个标志,您可以使用该标志来定义 你自己的桥。如果要运行多个守护进程,请使用此选项 实例。有关详细信息,请参阅运行多个守护程序--bridgedocker0

默认主机绑定地址

当端口发布选项(如 或 )中未给出主机地址时,默认是使容器的端口 80 在所有 主机地址、IPv4 和 IPv6。-p 80-p 8080:80

bridge network driver 选项可用于修改已发布端口的默认地址。com.docker.network.bridge.host_binding_ipv4

尽管选项的名称不同,但可以指定 IPv6 地址。

当默认绑定地址是分配给特定接口的地址时, 容器的端口只能通过该地址访问。

将默认绑定地址设置为 意味着已发布的端口将仅 在主机的 IPv6 地址上可用。但是,将其设置为 意味着它 将在主机的 IPv4 和 IPv6 地址上可用。::0.0.0.0

要将已发布的端口限制为仅 IPv4,该地址必须包含在 容器的发布选项。例如。-p 0.0.0.0:8080:80

管理用户定义的网桥

使用命令创建用户定义的网桥 网络。docker network create

$ docker network create my-net

您可以指定子网、IP 地址范围、网关和其他 选项。有关详细信息,请参阅 docker network create 参考 或 的输出。docker network create --help

使用命令删除用户定义的网桥 网络。如果容器当前已连接到网络,请先断开它们docker network rm

$ docker network rm my-net

到底发生了什么?

当您创建或删除用户定义的网桥或连接或断开 容器中,Docker 使用特定于 操作系统来管理底层网络基础设施(例如,将 或在 Linux 上删除桥接设备或配置规则)。这些 细节应被视为实现细节。让 Docker 管理您的 用户定义的网络。iptables

将容器连接到用户定义的网桥

创建新容器时,您可以指定一个或多个标志。 此示例将 Nginx 容器连接到网络。它还 将容器中的 80 端口发布到 Docker 主机上的 8080 端口,因此外部 客户端可以访问该端口。连接到网络的任何其他容器都可以访问容器上的所有端口,反之亦然。--networkmy-netmy-netmy-nginx

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

要将正在运行的容器连接到现有的用户定义的网桥,请使用命令。以下命令将正在运行的容器连接到已存在的网络:docker network connectmy-nginxmy-net

$ docker network connect my-net my-nginx

断开容器与用户定义的网桥的连接

要断开正在运行的容器与用户定义的网桥的连接,请使用命令。以下命令断开连接 来自网络的容器。docker network disconnectmy-nginxmy-net

$ docker network disconnect my-net my-nginx

在用户定义的桥接网络中使用 IPv6

在创建网络时,您可以指定标志以启用 IPv6。--ipv6

$ docker network create --ipv6 --subnet 2001:db8:1234::/64 my-net

使用默认桥接网络

默认网络被视为 Docker 的遗留详细信息,而不是 建议用于生产。配置它是一个手动操作,并且存在技术缺陷bridge

将容器连接到默认桥接网络

如果您未使用该标志指定网络,并且指定了 network 驱动程序,则您的容器会通过以下方式连接到默认网络 违约。连接到默认网络的容器可以通信, 但只能通过 IP 地址,除非它们使用旧版 --link 标志进行链接。--networkbridgebridge

配置默认桥接网络

要配置默认网络,请在 中指定选项。 下面是一个指定了多个选项的示例。仅指定 您需要自定义的设置。bridgedaemon.jsondaemon.json

{
  "bip": "192.168.1.1/24",
  "fixed-cidr": "192.168.1.0/25",
  "mtu": 1500,
  "default-gateway": "192.168.1.254",
  "dns": ["10.20.1.2","10.20.1.3"]
}

重新启动 Docker 以使更改生效。

将 IPv6 与默认桥接网络一起使用

可以使用 中的以下选项为默认网桥启用 IPv6 或其命令行等效项。daemon.json

这三个选项只影响默认网桥,它们不被 用户定义的网络。下面的地址是 IPv6 文档范围。

  • option 是必需的ipv6
  • 选项是必需的,它指定要使用的网络前缀。fixed-cidr-v6
    • 前缀通常应为或更短。/64
    • 对于本地网络上的实验,最好使用 Unique Local prefix (匹配 ) 比 Link Local prefix (匹配) 。fd00::/8fe80::/10
  • option 是可选的。如果未指定,则默认值为第一个 地址。default-gateway-v6fixed-cidr-v6
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8::/64",
  "default-gateway-v6": "2001:db8:abcd::89"
}

网桥网络的连接限制

由于 Linux 内核设置的限制,桥接网络变得不稳定,并且 当 1000 个或更多容器连接时,容器间通信可能会中断 到单个网络。

有关此限制的更多信息,请参阅 moby/moby#44973

跳过 IP 地址配置

该选项允许您创建网络 使用现有网桥,并让 Docker 跳过配置 IPv4 地址 在桥上。如果要为 bridge 手动。例如,如果您向网桥添加物理接口, 并且需要将其 IP 地址移动到桥接接口。com.docker.network.bridge.inhibit_ipv4

要使用此选项,您应该首先将 Docker 守护进程配置为使用 self-managed bridge,使用 或 标志中的选项。bridgedaemon.jsondockerd --bridge

使用此配置时,除非您手动操作,否则南北向流量将不起作用 配置了网桥的 IP 地址。

后续步骤