Docker Windows版本的容器兼容性

问题描述 投票:1回答:1

论坛上没有出现一个问题,恕我直言,有什么要讨论的原因:为什么无法在较旧的主机系统上拉出或构建Windows Docker映像(即nanoserver 2019)?在官方站点上有文档记录,它与运行不兼容,是的:Version compatibility

但是,正如我所说,“要奔跑”。我不需要在较旧的主机系统上运行该较新的Windows容器映像,我只想拉并构建它,以后再将其分发给兼容的系统。

因此,有没有一种方法可以解决这个不应该成为一个问题?

windows docker docker-container windows-server-2019
1个回答
0
投票

您错过了一件重要的事情:

即使只是执行docker build,它也会使用容器,而不是直接在您的主机上使用容器。接下来是docker build

时的过程
  1. Docker将从您在Dockerfile中使用FROM提及的基础映像创建一个临时构建容器。

  2. 在上述临时构建容器中运行Dockerfile的所有指令。

  3. 将临时构建容器另存为图像。

所以,正如您所说的,您已经从Microsoft看到了容器的Version compatibility,所以现在我想您也可以看到为什么build也需要它,因为它也会创建一个容器(只是在构建后将删除此临时容器)。

UPDATE:

整个故事是:

是的,在Linux中,旧主机os可以构建/运行新的os映像/容器没有问题,因为主机和容器仅共享同一内核,因此rootfs由容器本身提供。

但是,您正在谈论窗户,从windows official,我们可以看到下一个:

Windows Server 2016和Windows 10周年更新(均为版本14393)是最早可以构建和运行Windows Server容器的Windows版本。使用这些版本构建的容器可以在较新的版本(例如Windows Server 1709版)上运行,但是在开始之前,您需要了解一些知识。

由于我们一直在改进Windows容器功能,因此我们不得不进行一些可能影响兼容性的更改。较旧的容器将在具有Hyper-V隔离的较新主机上运行相同的容器,并使用相同(较旧)的内核版本。但是,如果您要基于更新的Windows构建运行容器,则只能在更新的主机构建上运行。

以上是旧的Windows操作系统无法运行新的Windows容器的原因。

此外,我想说的是docker builddocker run完全相同:

docker run $theImageName需要基于映像theImageName启动一个容器,并且正如微软所说,新的os容器必须使用内核的新功能,因此新的容器不能使用旧的Windows主机。记住,容器和主机将共享相同的内核。

并且,docker build -t xxx .将找到其中包含DockerfileFROM $baseImageName,然后基于图像$baseImageName启动一个容器,该容器是一个临时容器。 Dockerfile中的所有指令都将在此临时容器中执行,而不是在Docker主机中执行。最后,此临时构建容器将被删除,因此您没有看到此临时容器。

因此,如您所见,docker rundocker build都将启动容器,该容器需要利用新的Windows主机功能,而不能使用旧的Windows内核。这是Microsoft的限制,如果您已经了解Windows上docker run的限制,则原因与Windows上docker build的限制相同。

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