Bridge 网络驱动程序
在联网方面,桥接网络是链路层设备 在网段之间转发流量。网桥可以是硬件 设备或在主机内核中运行的软件设备。
就 Docker 而言,桥接网络使用软件桥接,它允许 连接到同一桥接网络的容器进行通信,同时提供 与未连接到该桥接网络的容器隔离。这 Docker bridge 驱动程序会自动在主机中安装规则,以便 不同桥接网络上的容器无法直接与每个 其他。
桥接网络适用于在同一 Docker 守护程序主机上运行的容器。 对于在不同 Docker 守护程序主机上运行的容器之间的通信,您可以 可以在作系统级别管理路由,也可以使用覆盖网络。
启动 Docker 时,默认的桥接网络(以及
叫bridge),并且新启动的容器会连接
除非另有说明。您还可以创建用户定义的自定义网桥
网络。用户定义的桥接网络优于默认bridge网络。
用户定义的桥接和默认桥接之间的差异
用户定义的网桥在容器之间提供自动 DNS 解析。
默认桥接网络上的容器只能通过 IP 相互访问 addresses 的 URL 中的 URL 中,除非您使用
--link选择,即 被认为是遗产。在用户定义的桥接网络上,容器可以解析 彼此按名称或别名。假设有一个应用程序具有 Web 前端和数据库后端。如果您调用 您的容器
web和db,Web 容器可以连接到数据库容器 在db,无论应用程序堆栈在哪个 Docker 主机上运行。如果您在默认桥接网络上运行相同的应用程序堆栈,则需要 要在容器之间手动创建链接(使用旧版
--link标志)。这些链接需要在两个方向上创建,因此您可以看到这一点 如果有两个以上的容器需要通信,则变得复杂。 或者,您可以作/etc/hostscontainers 中的文件, 但这会产生难以调试的问题。用户定义的网桥提供更好的隔离。
所有没有
--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_ipv4com.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 地址。 |
其中一些选项也可以作为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.json或dockerd --bridge旗。
使用此配置时,除非您手动作,否则南北向流量将不起作用 配置了网桥的 IP 地址。
后续步骤
- 命令补全独立联网教程
- 从容器的角度了解网络
- 了解叠加网络
- 了解 Macvlan 网络