Bridge 网络驱动程序

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

选项

下表描述了可以传递给--option使用bridge司机。

选择违约描述
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 和伪装 (nat),或者只允许直接路由到容器 (routed).
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 地址

其中一些选项也可以作为dockerdCLI 和您 可以使用它们来配置默认的docker0启动 Docker 时的 bridge 守护 进程。下表显示了哪些选项在dockerdCLI 的

选择
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 守护程序支持--bridge标志,可用于定义 你自己的docker0桥。如果要运行多个守护进程,请使用此选项 实例。有关详细信息,请参阅运行多个守护程序

默认主机绑定地址

当端口发布选项(如-p 80-p 8080:80,则默认为使容器的端口 80 在所有 主机地址、IPv4 和 IPv6。

网桥网络驱动程序选项com.docker.network.bridge.host_binding_ipv4可用于修改已发布端口的默认地址。

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

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

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

要将已发布的端口限制为仅 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用于删除 User-defined Bridge 的命令 网络。如果容器当前已连接到网络,请先断开它们

$ docker network rm my-net

到底发生了什么?

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

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

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

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

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

$ docker network connect my-net my-nginx

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

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

$ docker network disconnect my-net my-nginx

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

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

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

使用默认桥接网络

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

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

如果未使用--network标志,并且您确实指定了 network 驱动程序,则您的容器会连接到默认的bridge网络依据 违约。连接到默认bridge网络可以通信, 但只能通过 IP 地址进行链接,除非它们使用遗产--link.

配置默认桥接网络

配置默认bridgenetwork 中,您可以在daemon.json. 这是一个例子daemon.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 与默认桥接网络一起使用

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

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

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

网桥网络的连接限制

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

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

跳过 IP 地址配置

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

要使用此选项,您应该首先将 Docker 守护进程配置为使用 自我管理的网桥,使用bridge选项中的daemon.jsondockerd --bridge旗。

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

后续步骤