桥接网络驱动程序

就网络而言,桥接网络是一种在网段之间转发流量的链路层设备。桥接器可以是硬件设备,也可以是在主机内核中运行的软件设备。

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

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

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

用户定义网桥与默认网桥的区别

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

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

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

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

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

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

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

  • 容器可以动态地与用户定义的网络连接和分离

    在容器的生命周期内,您可以即时将其与用户定义的网络连接或断开。要从默认桥接网络中删除容器,您需要停止该容器并使用不同的网络选项重新创建它。

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

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

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

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

    最初,在两个容器之间共享环境变量的唯一方法是使用 flag 链接 --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.enable_icctrue启用或禁用容器间连接。
com.docker.network.bridge.host_binding_ipv4绑定容器端口时的默认IP。
com.docker.network.driver.mtu0(没有限制)设置容器网络最大传输单元 (MTU)。
com.docker.network.container_iface_prefixeth为容器接口设置自定义前缀。

其中一些选项也可作为 CLI 的标志,您可以在启动 Docker 守护进程时dockerd使用它们来配置默认桥。docker0下表显示了哪些选项在 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桥。如果您想在同一主机上运行多个守护程序实例,请使用此选项。有关详细信息,请参阅 运行多个守护程序

管理用户定义的桥

使用该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 会使用特定于操作系统的工具来管理底层网络基础设施(例如添加或删除网桥设备或iptables在 Linux 上配置规则) )。这些细节应被视为实施细节。让 Docker 为您管理用户定义的网络。

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

创建新容器时,您可以指定一个或多个--network标志。此示例将 Nginx 容器连接到my-net网络。它还将容器中的端口 80 发布到 Docker 主机上的端口 8080,以便外部客户端可以访问该端口。连接到网络的任何其他容器my-net 都可以访问该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

如果 Docker 容器需要 IPv6 支持,则需要 在创建任何 IPv6 网络或分配容器 IPv6 地址之前在 Docker 守护进程上启用该选项并重新加载其配置。

创建网络时,您可以指定--ipv6启用 IPv6 的标志。您无法有选择地禁用默认bridge网络上的 IPv6 支持。

使用默认桥接网络

默认bridge网络被认为是 Docker 的遗留细节,不建议用于生产使用。配置是手动操作,存在 技术缺陷

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

如果您没有使用该--network标志指定网络,但指定了网络驱动程序,则容器bridge默认连接到默认网络。连接到默认网络的容器可以进行通信,但只能通过 IP 地址进行通信,除非它们使用标志bridge进行链接 。--link

配置默认桥接网络

要配置默认bridge网络,您可以在 中指定选项daemon.json。这是指定了多个选项的示例daemon.json。仅指定您需要自定义的设置。

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

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

将 IPv6 与默认桥接网络结合使用

如果将 Docker 配置为支持 IPv6(请参阅 使用 IPv6),默认桥接网络也会自动配置为支持 IPv6。与用户定义的网桥不同,您无法有选择地在默认网桥上禁用 IPv6。

桥接网络的连接限制

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

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

下一步