Can Windows containers be hosted on Linux?
Is it possible to run Windows containers on Linux? The scenario is based on an application written in .NET (old net) and the Linux user that wants to run this with Docker needs to provide a net462 written API on the localhost . I am using the beta version of Docker Desktop for Windows. If no, then why can Windows run Linux containers and not vice-versa? As some time has passed and this question is a popular one, I’d like to add one note here that the workaround is to use the new .NET Standard. It allowed me to pack the 4.6.2 framework into a new library.
Not possible — To build and run Windows containers, a Windows system with container support is required.
@Sebastian506563 because docker runs VirtualBox virtualization behind the scenes to make Linux containers to run on Windows. I would guess theoretically it will be possible the other way as well, just docker did not implement it.
With VMs, each vm has its own operating system. With containers, there is base OS image and each container is adding a new thin layer on top the base. In docker’s this base OS linux based. i.e. your windows container cannot user the base as it is different. blog.risingstack.com/…
10 Answers 10
Q: Can Windows containers run on Linux?
A: No. They cannot.
Containers are using the underlying operating system resources and drivers, so Windows containers can run on Windows only, and Linux containers can run on Linux only.
Q: But what about Docker for Windows? Or other VM-based solutions?
A: Docker for Windows allows you to simulate running Linux containers on Windows, but under the hood a Linux VM is created, so still Linux containers are running on Linux, and Windows containers are running on Windows.
Bonus: Read this very nice article about running Linux docker containers on Windows.
Q: So, what should I do with a .NET Framework 462 application, if I would like to run in a container?
A: It depends. Consider the following recommendations:
- If it is possible, move to .NET Core. Since .NET Core brings support to most major features of .NET Framework, and .NET Framework 4.8 will be the last version of .NET framework
- If you cannot migrate to .NET Core — As @Sebastian mentioned — you can convert your libraries to .NET Standard, and have two versions of the application — one on .NET Framework 4.6.2, and one on .NET Core — it is not always obvious. Visual Studio supports it pretty well (with multi-targeting), but some dependencies can require extra care.
- (Less recommended) In some cases, you can run Windows containers. Windows containers are becoming more and more mature, with better support in platforms like Kubernetes. But to be able to run .NET Framework code, you still need to run on base image of «Server Core», which occupies about 1.4 GB. In same rare cases, you can migrate your code to .NET Core, but still run on Windows Nano server, with an image size of 95 MB.
Leaving also the old updates for history
Update 2: 08.2018
If you are using Docker-for-Windows, you can run now both Windows and Linux containers simultaneously: Running Docker Windows and Linux Containers Simultaneously
Bonus: Not directly related to the question, but you can now run not only the Linux container itself, but also an orchestrator like Kubernetes: Kubernetes is Now Available In Docker Desktop Stable Channel
Updated at 2018:
Original answer in general is right, BUT several months ago, Docker added experimental feature LCOW (official GitHub repository).
Doesn’t Docker for Windows already run Linux containers? That’s right. Docker for Windows can run Linux or Windows containers, with support for Linux containers via a Hyper-V Moby Linux VM (as of Docker for Windows 17.10 this VM is based on LinuxKit).
The setup for running Linux containers with LCOW is a lot simpler than the previous architecture where a Hyper-V Linux VM runs a Linux Docker daemon, along with all your containers. With LCOW, the Docker daemon runs as a Windows process (same as when running Docker Windows containers), and every time you start a Linux container Docker launches a minimal Hyper-V hypervisor running a VM with a Linux kernel, runc and the container processes running on top.
Because there’s only one Docker daemon, and because that daemon now runs on Windows, it will soon be possible to run Windows and Linux Docker containers side-by-side, in the same networking namespace. This will unlock a lot of exciting development and production scenarios for Docker users on Windows.
As mentioned in comments by @PanagiotisKanavos, containers are not for virtualization, and they are using the resources of the host machine. As a result, for now a Windows container cannot run «as-is» on a Linux machine.
But — you can do it by using VM — as it works on Windows. You can install a Windows VM on your Linux host, which will allow to run Windows containers.
With it, IMHO running it this way in a production environment will not be the best idea.
Also, this answer provides more details.
Установка Windows Server 2008 по сети с Linux PXE сервера. Кастомизация образа WinPE
Мы хотим не только пиарить себя и свои услуги здесь, но и поделиться опытом и знаниями, полученными в ходе администрирования огромного количества проектов, и в конечном итоге сделать достойный и полезный блог. Для этого мы попросили наших инженеров поучаствовать в этом. А на будущее хотим понять: будет это интересно хабровчанам? И если да — то в какой форме?
Под катом в этот раз пойдет речь об установке Windows Server 2008 по сети с Linux PXE сервера.
Меню загруженного WinPE.
Каждый ленивый хороший системный администратор стремится автоматизировать как можно больше неинтересной ручной работы, дабы больше времени посвещать медитации и дзен.
Пишутся скрипты, файлы ответов для различных визардов, настраиваются системы мониторинга и оповещения, системы управления конфигурациям…
Ничто не должно отвлекать на пути к просветлению.
- Выполнение каких-либо административных действий(обновление прошивки RAID контроллера например)
- Установка Windows Server 2008 в «ручном» режиме.
- Полностью автоматическая установка Windows Server 2008
Этап № 1. Windows
Для подготовки образа WinPE потребуется компьютер с Windows 7 либо Windows Server 2008, а так же установленный пакет Windows AIK
Когда нужная ОС установлена и пакет инсталирован.
Монтируем образ winpe.wim для внесения изменений, а так же подготовим загрузчик.
В открывшейся консоли последовательно вводим команды:
mkdir c:\winpe mkdir c:\winpe\mount cd c:\winpe copype.cmd amd64 c:\winpe mkdir c:\netboot\win\boot imagex /mountrw winpe.wim 1 mount xcopy c:\winpe\mount\windows\boot\pxe\pxeboot.n12 c:\netboot\win xcopy c:\winpe\mount\windows\boot\pxe\bootmgr.exe c:\netboot\win xcopy c:\winpe\iso\boot\boot.sdi c:\netboot\win\boot
Запуск оболочки WinPE осуществляет файл startnet.cmd
Так как меню у нас на русском языке, нужен редактор позволяющий менять кодировку текста(CP866 в нашем случае).
Я использую Notepad++
Путь к файлу: C:\winpe\mount\Windows\System32\startnet.cmd
Отредактируем его для добавления меню, как на скриншоте выше.
@echo off echo. echo Запускаю wpeinit. echo Подожди немного. echo. wpeinit echo На выбор доступно три режима работы WinPE: echo 1) Просто монтируется шара echo и командная строка ждет дальнейших действий. echo. echo 2) Монтируется smb шара и запускается установщик echo Windows 2008 R2. echo. echo 3) Монтируется smb шара и запускается автоматическая echo установка Windows 2008 R2 Standart Full echo. echo Для выбора пункта меню введи соответсвующую ему цифру, echo а затем нажми клавишу Enter(ошибочный ввод = 1 пункт). set /p %ID%==1 goto :first if %ID%==2 goto :second if %ID%==3 goto :third if %ID% GTR 3 goto :failure if %ID% LSS 3 goto :failure exit /b :second echo Ты выбрал пункт меню под номером 2 echo. echo Монтирую smb шару. net use j: \\1.2.3.4\public echo Запускаю j:\win2008s_x64\setup.exe j:\win2008s_x64\setup.exe exit /b :third echo Ты выбрал пункт меню под номером 3 echo. echo Монтирую smb шару. net use j: \\1.2.3.4\public echo Запускаю автоматическую установку: j:\win2008s_x64\setup.exe /unattend:j:\autounattend.xml j:\win2008s_x64\setup.exe /unattend:j:\autounattend.xml exit /b :first echo Ты выбрал пункт меню под номером 1 echo. :failure echo. echo Монтирую smb шару. net use j: \\1.2.3.4\public exit /b
Сохраняем изменения в startnet.cmd .
Отмонтируем winpe.wim закомитив изменения и скопируем полученный образ к остальным файлам.
imagex.exe /unmount /commit mount xcopy c:\winpe\winpe.wim c:\netboot\win\boot
Что такое хранилище данных конфигурации загрузки?
Хранилище данных конфигурации загрузки содержит параметры конфигурации загрузки и контролирует запуск операционных систем Microsoft Windows Vista и Microsoft Windows Server 2008. Эти параметры ранее хранились в файле Boot.ini (для операционных систем на базе BIOS) либо в памяти NVRAM (для операционных систем на базе EFI (Extensible Firmware Interface)). Для изменения кода Windows, который запускается перед загрузкой операционной системы, можно воспользоваться программой командной строки Bcdedit.exe, с помощью которой можно добавлять, удалять, изменять и дополнять записи в хранилище данных конфигурации загрузки.
Создадим новый скрипт createbcd.cmd. Он обеспечит генерацию нужной BCD.
Вновь открываем текстовый редактор и вставляем туда следующий код:
bcdedit -createstore %1\BCD bcdedit -store %1\BCD -create /d "Ramdisk options" bcdedit -store %1\BCD -set ramdisksdidevice boot bcdedit -store %1\BCD -set ramdisksdipath \boot\boot.sdi for /F "tokens=2 delims=<>" %%i in ('bcdedit -store %1\BCD -create /d "MyWinPE Boot Image" /application osloader') do set guid= bcdedit -store %1\BCD -set %guid% systemroot \Windows bcdedit -store %1\BCD -set %guid% detecthal Yes bcdedit -store %1\BCD -set %guid% winpe Yes bcdedit -store %1\BCD -set %guid% osdevice ramdisk=[boot]\Boot\winpe.wim, bcdedit -store %1\BCD -set %guid% device ramdisk=[boot]\Boot\winpe.wim, bcdedit -store %1\BCD -create /d "Windows BootManager" bcdedit -store %1\BCD -set timeout 30 bcdedit -store %1\BCD -set displayorder %guid%
createbcd.cmd c:\netboot\win\boot
Приготовим файл ответов autounattend.xml для автоматической установки Windows Server 2008.
На первом диске сервера создается один раздел, занимающий все пространство диска. ОС ставится в этот раздел, устанавливается пароль для учетной записи Administrator, вводится ключ, но Windows не активируется.
Never OnError 0 true 1 Primary true 1 1 NTFS /IMAGE/NAME Windows Server 2008 R2 SERVERSTANDARD false OnError 0 1 OnError false OnError true serverclub serverclub en-US OnError en-US en-US en-US en-US en-US en-US en-US en-US CHANGE-ME XXX-ZZZ-YYY-RRR-QQQ serverclub serverclub true UTC false ServerMegaSecurePassword111 true j:\
Файл нужно скопировать в корень smb шары, которая монтируется скриптом startnet.cmd .
Подготовительный этап в Windows близится к завершению, остается скопировать папку c:\netboot\win в корень tftp сервера, а так же разместить в папке доступной для монтирования по протоколу sbm файлы с установочного диска/образа Windows Server 2008.
Этап № 2. Linux
PROMPT 0
UI vesamenu.c32
MENU BACKGROUND pxelinux.cfg/logo.jpg
MENU TITLE ServerClub PXE Boot Menu
MENU TIMEOUT 50
MENU COLOR TITLE 0 #ffffffff #00000000
MENU COLOR SEL 7 #ffffffff #ff000000
LABEL CentOS ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/centos
LABEL Debian ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/debian
LABEL Ubuntu ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/ubuntu
LABEL BSD ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/bsd
LABEL ArchLinux ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/arch
LABEL Windows ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/windows
LABEL VmWare ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/vmware
LABEL LiveCD`s ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/live
LABEL Utilities ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/utils
PROMPT 0
UI vesavesamenu.c32
MENU BACKGROUND pxelinux.cfg/logo.jpg
MENU TITLE Windows
MENU TIMEOUT 50
MENU COLOR TITLE 0 #ffffffff #00000000
MENU COLOR SEL 7 #ffffffff #ff000000
LABEL < — Main Menu
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default
LABEL Windows2003_x64
kernel w2k3.0
LABEL Windows2008_x64_R2(menu inside)
kernel Boot/pxeboot.n12
LABEL < — Main Menu
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default
Небольшая демонстрация =)
На этом все.
Благодарю за внимание!
При подготовке статьи использовались следующие источники:
Автор статьи и по совместительству инженер ServerClub — FessAectan