Bridge 网络驱动程序
在联网方面,桥接网络是链路层设备 在网段之间转发流量。网桥可以是硬件 设备或在主机内核中运行的软件设备。
就 Docker 而言,桥接网络使用软件桥接,它允许 连接到同一桥接网络的容器进行通信,同时提供 与未连接到该桥接网络的容器隔离。这 Docker bridge 驱动程序会自动在主机中安装规则,以便 不同桥接网络上的容器无法直接与每个 其他。
桥接网络适用于在同一 Docker 守护程序主机上运行的容器。 对于在不同 Docker 守护程序主机上运行的容器之间的通信,您可以 可以在作系统级别管理路由,也可以使用覆盖网络。
启动 Docker 时,默认的桥接网络(以及
叫bridge
),并且新启动的容器会连接
除非另有说明。您还可以创建用户定义的自定义网桥
网络。用户定义的桥接网络优于默认bridge
网络。
用户定义的桥接和默认桥接之间的差异
用户定义的网桥在容器之间提供自动 DNS 解析。
默认桥接网络上的容器只能通过 IP 相互访问 addresses 的 URL 中的 URL 中,除非您使用
--link
选择,即 被认为是遗产。在用户定义的桥接网络上,容器可以解析 彼此按名称或别名。假设有一个应用程序具有 Web 前端和数据库后端。如果您调用 您的容器
web
和db
,Web 容器可以连接到数据库容器 在db
,无论应用程序堆栈在哪个 Docker 主机上运行。如果您在默认桥接网络上运行相同的应用程序堆栈,则需要 要在容器之间手动创建链接(使用旧版
--link
标志)。这些链接需要在两个方向上创建,因此您可以看到这一点 如果有两个以上的容器需要通信,则变得复杂。 或者,您可以作/etc/hosts
containers 中的文件, 但这会产生难以调试的问题。用户定义的网桥提供更好的隔离。
所有没有
--network
指定,将附加到默认桥接网络。这可能是一个风险,因为不相关的堆栈/服务/容器随后能够进行通信。使用用户定义的网络提供了一个范围网络,在该网络中,只有连接到该网络的容器才能进行通信。
容器可以动态地从用户定义的网络中附加和分离。
在容器的生命周期内,您可以连接容器或从容器中断开它 用户定义的动态网络。从默认容器中删除容器 bridge 网络,你需要停止容器,并使用不同的 网络选项。
每个用户定义的网络都会创建一个可配置的网桥。
如果您的容器使用默认桥接网络,您可以对其进行配置,但 所有容器都使用相同的设置,例如 MTU 和
iptables
规则。 此外,配置默认桥接网络发生在 Docker 之外 本身,并且需要重新启动 Docker。用户定义的桥接网络是使用
docker network create
.如果不同的应用程序组具有不同的 Network Requirements,您可以单独配置每个用户定义的网桥, 创建它时。默认桥接网络上的链接容器共享环境变量。
最初,在两个容器之间共享环境变量的唯一方法 是使用
--link
旗.这种类型的 用户定义的网络无法进行变量共享。然而,那里 是共享环境变量的卓越方法。一些想法:
连接到同一个用户定义的桥接网络的容器可以有效地暴露所有端口
彼此。对于容器或非 Docker 主机可以访问的端口
不同的网络,则必须使用-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 地址。 |
其中一些选项也可以作为dockerd
CLI 和您
可以使用它们来配置默认的docker0
启动 Docker 时的 bridge
守护 进程。下表显示了哪些选项在dockerd
CLI 的
选择 | 旗 |
---|---|
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 使用特定于 作系统来管理底层网络基础设施(例如,将 或者删除桥接设备或配置
iptables
rules 的 Linux 上)。这些 细节应被视为实现细节。让 Docker 管理您的 用户定义的网络。
将容器连接到用户定义的网桥
创建新容器时,您可以指定一个或多个--network
标志。
此示例将 Nginx 容器连接到my-net
网络。它还
将容器中的 80 端口发布到 Docker 主机上的 8080 端口,因此外部
客户端可以访问该端口。连接到my-net
network 可以访问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
使用默认桥接网络
默认的bridge
network 被视为 Docker 的遗留细节,而不是
建议用于生产。配置它是一个手动作,并且存在技术缺陷。
将容器连接到默认桥接网络
如果未使用--network
标志,并且您确实指定了
network 驱动程序,则您的容器会连接到默认的bridge
网络依据
违约。连接到默认bridge
网络可以通信,
但只能通过 IP 地址进行链接,除非它们使用遗产--link
旗.
配置默认桥接网络
配置默认bridge
network 中,您可以在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_ipv4
option 允许您创建网络
使用现有网桥,并让 Docker 跳过配置 IPv4 地址
在桥上。如果要为
bridge 手动。例如,如果您向网桥添加物理接口,
并且需要将其 IP 地址移动到桥接接口。
要使用此选项,您应该首先将 Docker 守护进程配置为使用
自我管理的网桥,使用bridge
选项中的daemon.json
或dockerd --bridge
旗。
使用此配置时,除非您手动作,否则南北向流量将不起作用 配置了网桥的 IP 地址。
后续步骤
- 完成独立联网教程
- 从容器的角度了解网络
- 了解叠加网络
- 了解 Macvlan 网络