"Docker子网"用于什么?

21

在docker桌面版中有一个选项可以更改"Docker子网"。我没有看到默认子网192.168.65.0/28在任何地方被使用。

Docker子网

我尝试对每个Docker内部网络进行docker network inspect,检查docker桌面版WSL2发行版和我的Windows主机的路由或IP,但我没有看到该默认子网被使用(即使设置自定义子网也是如此)。

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

我很难找到任何关于它是什么或用途的文档。

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。


1
我运行了您的命令,但容器没有IP在默认子网中。我还刚刚注意到更奇怪的事情,我设置的DNS服务器IP不在容器中,而是属于默认子网的IP!请看这里 https://i.imgur.com/jYHFUQ4.png使用docker network create而不指定子网(不带--subnet)也不使用默认子网。请参见:https://i.imgur.com/BZxHFmx.png - shellwhale
1
这个问题的浏览量很高,但两年后我仍然认为这不是一个足够完整的答案。请查看我的先前评论。 - shellwhale
2
这真是奇怪... 这似乎是一个简单的问题,但是没有人能帮忙回答。 - DrizzleX
同意,也许是时候来一次赏金了。 - shellwhale

4
在Docker桌面版中(无论是Windows还是macOS),容器并不直接运行在系统内核上,它们运行在Linux虚拟机(在macOS上)或Hyper-V容器内部(在WSL 2上的Windows情况下)。
该子网是用于在VM或Hyper-V容器中运行的Docker守护程序环境的网络。
在macOS上,您可以使用以下命令进入Docker VM并查看其内容。
docker run -it --rm --privileged --pid=host justincormack/nsenter1

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

在Docker虚拟机内部,您可以查看网络配置,您会在那里找到此子网。

/ # 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个可用地址(如果您意识到Docker VM自己使用一个地址,则只有13个)。而容器的/16网络中有65534个可用地址。


0

Docker Desktop for Linux 用户手册

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

Docker Desktop for Windows 用户手册

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

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

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

在这里,您可以找到一个示例案例,解决了连接到IP范围为172.17. 的外部资源时出现的网络冲突和NoRouteToHostException错误,方法是更改Docker子网IP范围。

注意:默认情况下,每个容器都附加到Docker Bridge Network,并获得IP或范围172.17.

将容器的默认Bridge IP范围更改为172.26. 解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接