“Docker 子网”有什么用?

问题描述 投票:0回答:3

docker-desktop 中有一个选项允许更改“Docker 子网”。而且我没有看到这个默认子网

192.168.65.0/28
在任何地方使用。

我尝试在每个 Docker 内部网络上

docker network inspect
,检查 docker-desktop WSL2 发行版和我的 Windows 主机的路由或 IP,但我没有看到在任何地方使用默认子网(即使在设置自定义子网时也是如此)。

这不会更改

docker network inspect bridge
或任何其他子网中使用的子网。

我正在努力寻找任何有关它是什么和/或它的用途的文档。

docker docker-networking docker-desktop
3个回答
8
投票

在很大程度上,这是您无需担心的内部实现细节。

您真正需要更改此值的唯一时间是您的主机网络具有相同的地址。在这种情况下,您可以将其更改为不冲突的任何内容。例如,如果您的主机网络恰好是 192.168.65.0/24,那么您可以将 Docker 网络更改为 192.168.66.0/24(或 /28),这样就可以正常工作了。

内部容器具有单独的 IP 地址,这是它们分配的默认子网。如果您

docker network create
网络或者您正在使用 Docker Compose,则会分配一个新的子网。这几乎完全是一个实现细节,您永远不需要知道这些地址:从 Docker 外部您无法到达这些地址 (*),而在 Docker 内部,它提供了一个 DNS 系统,因此您可以使用容器名称作为主机名。

更具体地说,如果您

docker run --rm busybox ifconfig

您将看到来自该子网的地址。

(*) ...除了从实际运行容器的本机 Linux 主机的控制台进行连接的一种非常特殊的情况;但绝不会来自其他主机,或者如果您使用 Docker Toolbox 或 Docker Desktop。


5
投票

在 Docker Desktop(适用于 Windows 或 macOS)中,容器不直接在系统内核上运行,它们在 Linux VM 内(对于 macOS)或 Hyper-V 内的容器内运行(对于 WSL 2)在 Windows 上)。

此子网是用于在 VM 或 Hyper-V 容器中运行的 Docker 守护程序环境的网络。

在 macOS 上,您可以使用以下命令进入 Docker VM 并查看周围。

docker run -it --rm --privileged --pid=host justincormack/nsenter1

(我不确定这个命令在Windows上是否有效,而且我没有系统可以测试它,但你可以尝试一下。)

在 Docker VM 中,您可以查看网络配置,您会在那里找到该子网。

/ # ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:50:00:00:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.65.3/24 brd 192.168.65.255 scope global dynamic noprefixroute eth0
       valid_lft 7019sec preferred_lft 5579sec
    inet6 fe80::50:ff:fe00:1/64 scope link
       valid_lft forever preferred_lft forever

/ # ip route show | grep 192.168.65
default via 192.168.65.1 dev eth0 proto dhcp src 192.168.65.3 metric 202
192.168.65.0/24 dev eth0 proto dhcp scope link src 192.168.65.3 metric 202
192.168.65.5 dev services1 proto kernel scope link src 192.168.65.4

/ # cat /etc/resolv.conf
# DNS requests are forwarded to the host. DHCP DNS options are ignored.
nameserver 192.168.65.5
不过,您从此环境中启动的“容器”不使用此网络。它们也是从

RFC 1918 网络寻址的,但是是不同的网络,如下所示: 15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # ip route default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 scope link src 172.17.0.2

在这里您可以看到172.17.0.0/16正在使用中。这是
RFC 1918
中发现的较大 172.16.0.0/12 分配的一部分。

如果您询问的子网用于容器,您很快就会用完地址,因为 /28 网络只有 14 个可用地址(13 个,如果您意识到 Docker VM 自己使用一个)。而容器的 /16 网络有 65,534 个可用地址。


0
投票

Docker Desktop 使用私有 IPv4 网络来提供内部服务,例如 DNS 服务器和 HTTP 代理。如果子网的选择与您环境中的某些内容发生冲突,请使用网络设置指定自定义子网

Windows 版 Docker Desktop 用户手册

您可以配置 Docker Desktop 网络以在虚拟专用网络 (VPN) 上工作。指定网络地址转换 (NAT) 前缀和子网掩码

以启用互联网连接。

Docker Desktop\Windows 版 Docker Desktop 中的网络功能

了解 Docker 网络并解决与 Docker 子网 IP 范围的冲突!

在这里您可以找到一个示例案例,通过更改 Docker 子网 IP 范围来解决连接 IP 在 172.17.

.

范围内的外部资源时出现的网络冲突和NoRouteToHostException 错误 注:

默认情况下,每个容器都连接到 Docker Bridge Network 并获取 IP 或范围

172.17.. 将容器默认网桥 IP 范围更改为 172.26.

.

解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.