“Docker 子网”有什么用?

she*_*ale 6 docker docker-networking docker-desktop

docker-desktop 中有一个选项可以更改“ Docker 子网”。而且我没有看到192.168.65.0/28在任何地方使用这个默认子网。

Docker 子网

我尝试docker network inspect在每个 Docker 内部网络上检查 docker-desktop WSL2 发行版和我的 Windows 主机的路由或 IP,但我没有看到在任何地方使用默认子网(即使在设置自定义子网时)。

这不会更改使用的子网docker network inspect bridge或任何其他子网。

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

Dan*_*owe 6

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

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

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

docker run -it --rm --privileged --pid=host justincormack/nsenter1
Run Code Online (Sandbox Code Playgroud)

(我不确定这个命令在 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
Run Code Online (Sandbox Code Playgroud)

不过,您从此环境中启动的容器不使用该网络。它们也通过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
Run Code Online (Sandbox Code Playgroud)

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

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


Dav*_*aze 5

在大多数情况下,它是您无需担心的内部实现细节。

您真正需要更改此值的唯一时间是您的主机网络是否具有相同的地址。在这种情况下,您可以将其更改为任何不冲突的内容。例如,如果您的主机网络恰好是 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这真是太奇怪了……看似简单的问题,却无人能帮忙解答。 (2认同)