有一个问题没有出现在论坛中,有什么理由需要讨论,恕我直言:为什么不能在旧主机系统上拉取或构建 windows docker 映像(即 nanoserver 2019)?在官方网站上,记录在案,运行不兼容,是的: 版本兼容性
但是,正如我所说,“跑”。我不需要在较旧的主机系统上运行较新的 Windows 容器映像,我只想拉取并构建它,以便稍后将其分发到兼容的系统。
因此,有没有办法处理这个不应该的问题?
有一个问题没有出现在论坛中,有什么理由需要讨论,恕我直言:为什么不能在旧主机系统上拉取或构建 windows docker 映像(即 nanoserver 2019)?在官方网站上,记录在案,运行不兼容,是的: 版本兼容性
但是,正如我所说,“跑”。我不需要在较旧的主机系统上运行较新的 Windows 容器映像,我只想拉取并构建它,以便稍后将其分发到兼容的系统。
因此,有没有办法处理这个不应该的问题?
你错过了一件重要的事情:
即使只是这样做docker build
,它也会使用容器,它使用容器来构建而不是直接在您的主机上。接下来是以下过程docker build
:
Docker 将从您在 Dockerfile 中提到的基础镜像创建一个临时构建容器FROM
。
在上述临时构建容器中运行 Dockerfile 的所有指令。
将临时构建容器保存为镜像。
所以,正如你所说,你已经从微软看到了容器的版本兼容性,所以现在我想你也可以看到为什么构建也需要这个,只是因为它也会创建一个容器(只是这个临时容器将在构建后被删除)。
更新:
整个故事是:
是的,在 linux 中,旧的主机操作系统构建/运行新的操作系统映像/容器没有问题,因为主机和容器只是共享同一个内核,rootfs 是由容器本身提供的。
但是,您在谈论 windows,来自windows 官方,我们可以看到下一个:
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 .
会在其中找到Dockerfile
with FROM $baseImageName
,然后基于 image 启动一个容器$baseImageName
,这个容器是一个临时容器。Dockerfile 中的所有指令都将在这个临时容器中执行,而不是在 docker 主机中。最后,这个临时构建容器将被删除,所以你没有看到这个临时容器。
所以,如你所见,docker run
&docker build
都将启动需要利用新 windows 主机功能的容器,不能使用旧 windows 的内核。这就是微软的限制,如果你已经了解了docker run
windows的限制,原因和windows是一样的docker build
。