你错过了一件重要的事情:
即使只是做docker build,它也会使用容器,它使用容器而不是直接在您的主机上构建。接下来是docker build时的过程:
-
Docker 将根据您在 Dockerfile 中使用FROM 提到的基本映像创建一个临时构建容器。
-
在上述临时构建容器中运行 Dockerfile 的所有指令。
-
将临时构建容器保存为镜像。
所以,正如你所说,你已经看到了来自微软的容器Version compatibility,所以现在我想你也可以看到为什么构建也需要这个,因为它也会创建一个容器(只是这个临时容器将在之后被删除构建)。
更新:
整个故事是:
是的,在linux中,旧的主机操作系统构建/运行新的操作系统镜像/容器没有问题,因为主机和容器只是共享同一个内核,rootfs由容器本身提供。
但是,你在谈论 windows,来自windows official,我们可以看到下一个:
Windows Server 2016 和 Windows 10 周年更新(均为版本 14393)是第一个可以构建和运行 Windows Server 容器的 Windows 版本。使用这些版本构建的容器可以在较新的版本(例如 Windows Server 1709 版)上运行,但在开始之前您需要了解一些事项。
由于我们一直在改进 Windows 容器功能,因此我们不得不进行一些可能会影响兼容性的更改。旧容器将在具有 Hyper-V 隔离的新主机上运行相同,并将使用相同(旧)内核版本。但是,如果您想基于较新的 Windows 构建运行容器,它只能在较新的主机构建上运行。
以上就是老windows os无法运行新windows容器的原因。
还有,我想说的是docker build和docker run的道理一样:
docker run $theImageName需要基于镜像theImageName启动一个容器,而正如微软所说,新的os容器必须使用内核的新特性,所以新容器不能使用旧的windows主机。请记住,容器和主机将共享同一个内核。
并且,docker build -t xxx . 会在其中找到带有FROM $baseImageName 的Dockerfile,然后基于图像$baseImageName 启动一个容器,这个容器是一个临时容器。 Dockerfile 中的所有指令都将在这个临时容器中执行,而不是在 docker 主机中。最后,这个临时构建容器将被删除,所以你没有看到这个临时容器。
所以,如您所见,docker run 和docker build 都将启动需要利用新 windows 主机功能的容器,不能使用旧 windows 内核。这是微软的限制,如果你已经了解了docker run在windows上的限制,原因和docker build在windows上的限制是一样的。