Вы пропустили одну важную вещь:
Даже просто сделайте docker build
, он будет использовать контейнер, он будет использовать контейнер для сборки не непосредственно на вашем хост-компьютере.Далее идет процесс, когда docker build
:
Docker создаст временный контейнер сборки из базового образа, который вы упоминали в Dockerfile с FROM
.
Запустите все инструкции Dockerfile в указанном выше контейнере временной сборки.
Сохраните контейнер временной сборки как образ.
Итак, каквы сказали, что видели совместимость версий для контейнера от Microsoft, так что теперь я думаю, что вы также можете понять, зачем сборке это нужно, просто потому, что он также создаст контейнер (только этот временный контейнер будет удален после сборки).
ОБНОВЛЕНИЕ:
Вся история такова:
ДА, в Linux, нет проблем для старого хоста OS для сборки / запускановый образ / контейнер os, поскольку хост и контейнер просто совместно используют одно и то же ядро, rootfs предоставляется самим контейнером.
НО, вы говорите о windows, из windows official , мы могли бысм. далее:
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, новый контейнер OS должен был использовать новые функции ядра, поэтому новый контейнер не может использовать старый хост Windows.Помните, что контейнер и хост будут использовать одно и то же ядро.
И, docker build -t xxx .
найдет Dockerfile
с FROM $baseImageName
в нем, а затем запустит базу контейнера на изображении $baseImageName
, этот контейнервременный контейнер.Все инструкции в Dockerfile будут выполняться в этом временном контейнере, а не в хосте Docker.И, наконец, этот временный контейнер сборки будет удален, поэтому вы не видели этот временный контейнер.
Итак, как вы видите, оба docker run
& docker build
запустят контейнер, который должен использовать новыйФункция хоста Windows, не может использовать ядро старого Windows.Это предел для Microsoft, если вы уже поняли ограничение для docker run
на Windows, причина такая же, как docker build
на Windows.