Совместимость с контейнером версии Docker для Windows

Есть один вопрос, который не появляется на форумах, и у которого есть причина для обсуждения, ИМХО: почему невозможно вытащить или создать образы докеров Windows (например, nanoserver 2019) на более старой хост-системе? На официальном сайте задокументировано, что несовместимо для запуска, да: Совместимость версий

Но, как я уже сказал, «на бегу». Мне не нужно запускать этот новый образ контейнера Windows на старой хост-системе, я просто хочу извлечь и собрать его, чтобы позже распространить его на совместимую систему.

Таким образом, есть ли способ справиться с этой проблемой, которой не должно быть?


person kvirk    schedule 28.09.2019    source источник


Ответы (1)


Вы упустили одну важную вещь:

Даже просто сделайте docker build, он будет использовать контейнер, он использует контейнер для сборки не непосредственно на вашей хост-машине. Далее идет процесс, когда docker build:

  1. Docker создаст временный контейнер сборки из базового образа, который вы упомянули в Dockerfile с помощью FROM.

  2. Запустите все инструкции Dockerfile в указанном выше временном контейнере сборки.

  3. Сохраните контейнер временной сборки как образ.

Итак, как вы сказали, вы видели совместимость версий для контейнера от Microsoft, так что теперь я думаю, вы также можете понять, почему сборка также нуждается в этом, просто потому, что она также создаст контейнер (просто этот временный контейнер будет удален после сборки).

ОБНОВЛЕНИЕ:

Вся история такова:

ДА, в Linux нет проблем для старой ОС хоста для создания/запуска нового образа/контейнера ОС, потому что хост и контейнер просто используют одно и то же ядро, rootfs предоставляется самим контейнером.

НО, вы говорите об окнах из официального окна мы могли видеть следующее:

Windows Server 2016 и Windows 10 Anniversary Update (обе версии 14393) были первыми выпусками Windows, которые могли создавать и запускать контейнеры Windows Server. Контейнеры, созданные с использованием этих версий, могут работать в более новых выпусках, таких как Windows Server версии 1709, но есть несколько вещей, которые необходимо знать перед началом работы.

Поскольку мы улучшали функции контейнера Windows, нам пришлось внести некоторые изменения, которые могут повлиять на совместимость. Старые контейнеры будут работать так же на новых хостах с изоляцией Hyper-V и будут использовать ту же (более старую) версию ядра. Однако если вы хотите запустить контейнер на основе более новой сборки Windows, он может работать только на более новой сборке хоста.

Выше приведена причина, по которой старая ОС Windows не могла запустить новый контейнер Windows.

Более того, я хочу сказать, что docker build по той же причине, что и docker run:

docker run $theImageName необходимо запустить базу контейнера на образе theImageName, и, как сказал Microsoft, новый контейнер ОС должен был использовать новые функции ядра, поэтому новый контейнер не может использовать старый хост Windows. Помните, что контейнер и хост будут использовать одно и то же ядро.

И docker build -t xxx . найдет Dockerfile с FROM $baseImageName в нем, затем запустит базу контейнера на образе $baseImageName, этот контейнер является временным контейнером. Все инструкции в Dockerfile будут выполняться в этом временном контейнере, а не в хосте докеров. И, наконец, этот временный контейнер сборки будет удален, чтобы вы не видели этот временный контейнер.

Итак, как вы видите, и docker run, и docker build запустят контейнер, который должен использовать новую функцию хоста Windows, не может использовать старое ядро ​​Windows. Это ограничение Microsoft, если вы уже поняли ограничение для docker run в Windows, причина та же, что и для docker build в Windows.

person atline    schedule 29.09.2019
comment
Хорошая дополнительная информация, спасибо, но все же я не понимаю, почему это должно избегать сборки более нового образа ОС? Образы докеров предоставляют файловую систему с несколькими файлами и каталогами, почему старая версия ОС не может справиться с этим, если в обоих случаях файловая система NTFS. Есть ли другая причина, я не вижу? - person kvirk; 29.09.2019
comment
Ладно, понял, для сборки тоже нужно предварительно запустить образ, а из-за внесенных Microsoft изменений, влияющих на совместимость, контейнерная версия новой ОС не может работать со старой версией ядра ОС. - person kvirk; 29.09.2019