Bridge 网络驱动程序
在联网方面,桥接网络是链路层设备 在网段之间转发流量。网桥可以是硬件 设备或在主机内核中运行的软件设备。
就 Docker 而言,桥接网络使用软件桥接,它允许 连接到同一桥接网络的容器进行通信,同时提供 与未连接到该桥接网络的容器隔离。这 Docker bridge 驱动程序会自动在主机中安装规则,以便 不同桥接网络上的容器无法直接与每个 其他。
桥接网络适用于在同一 Docker 守护程序主机上运行的容器。 对于在不同 Docker 守护程序主机上运行的容器之间的通信,您可以 可以在操作系统级别管理路由,也可以使用覆盖网络。
启动 Docker 时,默认的桥接网络(以及
调用 ),并且新启动的容器会连接
除非另有说明。您还可以创建用户定义的自定义网桥
网络。用户定义的桥接网络优于默认桥接
网络。bridge
用户定义的桥接和默认桥接之间的差异
用户定义的网桥在容器之间提供自动 DNS 解析。
默认桥接网络上的容器只能通过 IP 相互访问 地址,除非您使用
--link
选项,即 被认为是遗产。在用户定义的桥接网络上,容器可以解析 彼此按名称或别名。假设有一个应用程序具有 Web 前端和数据库后端。如果您调用 您的容器和 Web 容器可以连接到数据库容器 ,无论应用程序堆栈在哪个 Docker 主机上运行。
web
db
db
如果您在默认桥接网络上运行相同的应用程序堆栈,则需要 在容器之间手动创建链接(使用 legacy 标志)。这些链接需要在两个方向上创建,因此您可以看到这一点 如果有两个以上的容器需要通信,则变得复杂。 或者,您可以操作容器中的文件, 但这会产生难以调试的问题。
--link
/etc/hosts
用户定义的网桥提供更好的隔离。
所有未指定 的容器都将连接到默认桥接网络。这可能是一个风险,因为不相关的堆栈/服务/容器随后能够进行通信。
--network
使用用户定义的网络提供了一个范围网络,在该网络中,只有连接到该网络的容器才能进行通信。
容器可以动态地从用户定义的网络中附加和分离。
在容器的生命周期内,您可以连接容器或从容器中断开它 用户定义的动态网络。从默认容器中删除容器 bridge 网络,你需要停止容器,并使用不同的 网络选项。
每个用户定义的网络都会创建一个可配置的网桥。
如果您的容器使用默认桥接网络,您可以对其进行配置,但 所有容器都使用相同的设置,例如 MTU 和规则。 此外,配置默认桥接网络发生在 Docker 之外 本身,并且需要重新启动 Docker。
iptables
用户定义的桥接网络是使用 创建和配置的。如果不同的应用程序组具有不同的 Network Requirements,您可以单独配置每个用户定义的网桥, 创建它时。
docker network create
默认桥接网络上的链接容器共享环境变量。
最初,在两个容器之间共享环境变量的唯一方法 是使用
--link
标志链接它们。这种类型的 用户定义的网络无法进行变量共享。然而,那里 是共享环境变量的卓越方法。一些想法:
连接到同一个用户定义的桥接网络的容器可以有效地暴露所有端口
彼此。对于容器或非 Docker 主机可以访问的端口
不同的网络,则必须使用 OR 标志发布该端口。-p
--publish
选项
下表描述了在使用驱动程序创建自定义网络时可以传递给的特定于驱动程序的选项。--option
bridge
选择 | 违约 | 描述 |
---|---|---|
com.docker.network.bridge.name | 创建 Linux 网桥时使用的接口名称。 | |
com.docker.network.bridge.enable_ip_masquerade | true | 启用 IP 伪装。 |
com.docker.network.bridge.gateway_mode_ipv4 com.docker.network.bridge.gateway_mode_ipv6 | nat | 启用 NAT 和伪装 (),或仅允许直接路由到容器 ()。nat routed |
com.docker.network.bridge.enable_icc | true | 启用或禁用容器间连接。 |
com.docker.network.bridge.host_binding_ipv4 | 所有 IPv4 和 IPv6 地址 | 绑定容器端口时的默认 IP。 |
com.docker.network.driver.mtu | 0 (无限制) | 设置容器网络的最大传输单位 (MTU)。 |
com.docker.network.container_iface_prefix | eth | 为容器接口设置自定义前缀。 |
com.docker.network.bridge.inhibit_ipv4 | false | 阻止 Docker 为网络分配 IP 地址。 |
其中一些选项也可用作 CLI 的标志,而您
可以使用它们在启动 Docker 时配置默认网桥
守护 进程。下表显示了哪些选项在 CLI 中具有等效的标志。dockerd
docker0
dockerd
选择 | 旗 |
---|---|
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
默认主机绑定地址
当端口发布选项(如 或 )中未给出主机地址时,默认是使容器的端口 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 端口,因此外部
客户端可以访问该端口。连接到网络的任何其他容器都可以访问容器上的所有端口,反之亦然。--network
my-net
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
在创建网络时,您可以指定标志以启用 IPv6。--ipv6
$ docker network create --ipv6 --subnet 2001:db8:1234::/64 my-net
使用默认桥接网络
默认网络被视为 Docker 的遗留详细信息,而不是
建议用于生产。配置它是一个手动操作,并且存在技术缺陷。bridge
将容器连接到默认桥接网络
如果您未使用该标志指定网络,并且指定了
network 驱动程序,则您的容器会通过以下方式连接到默认网络
违约。连接到默认网络的容器可以通信,
但只能通过 IP 地址,除非它们使用旧版 --link
标志进行链接。--network
bridge
bridge
配置默认桥接网络
要配置默认网络,请在 中指定选项。
下面是一个指定了多个选项的示例。仅指定
您需要自定义的设置。bridge
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 与默认桥接网络一起使用
可以使用 中的以下选项为默认网桥启用 IPv6 或其命令行等效项。daemon.json
这三个选项只影响默认网桥,它们不被 用户定义的网络。下面的地址是 IPv6 文档范围。
- option 是必需的
ipv6
- 选项是必需的,它指定要使用的网络前缀。
fixed-cidr-v6
- 前缀通常应为或更短。
/64
- 对于本地网络上的实验,最好使用 Unique Local
prefix (匹配 ) 比 Link Local prefix (匹配) 。
fd00::/8
fe80::/10
- 前缀通常应为或更短。
- option 是可选的。如果未指定,则默认值为第一个
地址。
default-gateway-v6
fixed-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,使用 或 标志中的选项。bridge
daemon.json
dockerd --bridge
使用此配置时,除非您手动操作,否则南北向流量将不起作用 配置了网桥的 IP 地址。
后续步骤
- 完成独立联网教程
- 从容器的角度了解网络
- 了解叠加网络
- 了解 Macvlan 网络