Вы упустили одну важную вещь:
Даже просто сделайте docker build
, он будет использовать контейнер, он использует контейнер для сборки не непосредственно на вашей хост-машине. Далее идет процесс, когда docker build
:
Docker создаст временный контейнер сборки из базового образа, который вы упомянули в Dockerfile с помощью FROM
.
Запустите все инструкции Dockerfile в указанном выше временном контейнере сборки.
Сохраните контейнер временной сборки как образ.
Итак, как вы сказали, вы видели совместимость версий для контейнера от 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