- Can Windows nanoserver run inside Linux docker?
- Начало работы. Запуск первого контейнера Windows
- Извлечение базового образа контейнера
- Выполнение контейнера Windows
- Запуск контейнера Windows с помощью Windows Admin Center
- Can Windows containers be hosted on Linux?
- 10 Answers 10
- Можно ли запустить Windows приложение в Linux Docker container?
Can Windows nanoserver run inside Linux docker?
Containers provide process isolation on a shared OS, rather than OS isolation on shared hardware that you get with VMs. Since the OS is shared, the host OS needs to be able to run the desired binaries. You will see this in the architecture of the docker engine and the architecture of the image you want to run, they must be compatible:
$ docker system info --format '> >' linux x86_64 $ docker image inspect busybox --format '> >' linux amd64
If you try to run an architecture that isn’t compatible with your host, you will get an error because the binary format isn’t recognized by the kernel:
$ docker image pull --platform arm64 busybox:latest latest: Pulling from library/busybox acafde7ce2e7: Pull complete Digest: sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812 Status: Downloaded newer image for busybox:latest $ docker run -it --rm busybox:latest echo hello standard_init_linux.go:190: exec user process caused "no such file or directory"
Desktop versions of Docker, and the Windows Server version of Docker, include a Linux VM under the covers to run Linux containers (Linux containers are the dominant container environment, so Docker implements this using Linuxkit, to simplify the developer workflow). For Windows, there is a switch in the engine to use the Linux VM or run native Windows containers.
However, Docker does not have an embedded VM for Windows to run their binaries on a Linux host (since Windows is not open source and would require licensing), so the only way to run Windows native containers is on a Windows host.
Начало работы. Запуск первого контейнера Windows
В этой статье объясняется, как запустить первый контейнер Windows после настройки среды, описанной в статье Начало работы. Подготовка Windows для контейнеров. Чтобы запустить контейнер, сначала скачайте (в контейнерах, которые также называются операцией извлечения) базовый образ, который предоставляет базовый уровень служб операционной системы для контейнера. Затем создается и запускается образ контейнера, который основан на базовом образе. Дополнительные сведения см. далее в этой статье.
Извлечение базового образа контейнера
Все контейнеры создаются из образов контейнеров. Корпорация Майкрософт предоставляет для начала работы несколько образов, называемых базовыми образами (дополнительные сведения см. в статье о базовых образах контейнеров). Эти процедуры позволяют получить (скачать и установить) базовый образ Nano Server.
- Откройте окно командной строки (например, встроенную командную строку, PowerShell или терминал Windows), а затем выполните следующую команду, чтобы скачать и установить базовый образ:
docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022
Если Docker не удается запуститься при попытке извлечь образ, управляющая программа Docker может быть недоступна. Чтобы устранить данную неполадку, попытайтесь перезапустить службу Docker.
Совет Если вы увидите сообщение об ошибке с текстом no matching manifest for linux/amd64 in the manifest list entries , убедитесь, что в Docker не настроен запуск контейнеров Linux. Чтобы переключиться на контейнеры Windows в Docker, щелкните значок Docker правой кнопкой мыши и выберите Переключиться на контейнеры Windows. Чтобы использовать командную строку для переключения между контейнерами, выполните команду & $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .
REPOSITORY TAG IMAGE ID CREATED SIZE microsoft/nanoserver latest 105d76d0f40e 4 days ago 652 MB
Выполнение контейнера Windows
В этом простом примере будет создан и развернут образ контейнера «Hello World». Для вашего удобства лучше выполнять эти команды в окне командной строки с повышенными привилегиями. Не используйте интегрированную среду сценариев Windows PowerShell, так как она не работает для интерактивных сеансов с контейнерами и в результате контейнеры перестают отвечать на запросы.
- Запустите контейнер с интерактивным сеансом из образа nanoserver . Для этого введите следующую команду в окне командной строки:
docker run -it mcr.microsoft.com/windows/nanoserver:ltsc2022 cmd.exe
echo "Hello World!" > Hello.txt exit
После завершения вы получите пользовательский образ, содержащий скрипт «Привет мир». Это можно проверить с помощью команды docker images.
REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest a1064f2ec798 10 seconds ago 258MB mcr.microsoft.com/windows/nanoserver 2022 2b9c381d0911 3 weeks ago 256MB
docker run --rm helloworld cmd.exe /s /c type Hello.txt
Запуск контейнера Windows с помощью Windows Admin Center
Вы можете использовать Windows Admin Center для локального запуска контейнеров. А именно, вы можете использовать расширение «Контейнеры» своего экземпляра Windows Admin Center для запуска контейнеров. Сначала откройте узел контейнеров, которым требуется управлять, а затем в области «Сервис» выберите расширение Контейнеры. Затем откройте вкладку Образы в расширении «Контейнеры» в разделе Узел контейнеров.
Если базовый образ контейнера отсутствует для узла, выберите вариант Извлечь, чтобы открыть параметры Извлечение образа контейнера:
В разделе Извлечение образа контейнера укажите URL-адрес и тег образа. Если вы не уверены, какой образ нужно извлечь, ознакомьтесь со списком популярных образов от Майкрософт, предоставляемых в Windows Admin Center. Вы также можете указать учетные данные для извлечения образа из частного репозитория. Внеся необходимые сведения, щелкните Извлечь. Windows Admin Center запустит процесс извлечения на узле контейнеров. После завершения скачивания вы увидите новый образ на вкладке Образы.
Выберите образ для запуска и щелкните Запустить.
В меню Запуск настройте конфигурацию для контейнера, например имя контейнера, тип изоляции, порты для публикации, а также выделение памяти и ЦП. Кроме того, вы можете добавить команды запуска Docker, которые недоступны в пользовательском интерфейсе, такие как -v для постоянного тома. Дополнительные сведения о доступных параметрах запуска Docker см. в документации.
Завершив настройку контейнера, щелкните Запустить. Состояние выполняющихся контейнеров можно просмотреть на вкладке Контейнеры:
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 приложение в Linux Docker container?
Возможно глупый вопрос, но всё же.
Есть машинка с Debian, на ней установлен Docker CE.
И мой вопрос — можно ли запустить в контейнере Docker Windows приложение (например я хочу попробовать www.passmark.com/products/pt.htm)
EN-форумы утверждают, что нет, но это было до выхода Docker for Windows.
Сейчас же на странице Docker висит красивая диаграмма, утверждающая, что можно запустить любое приложение на любой ОС, но видимо речь о собственных приложениях 🙂
Оценить 2 комментария
You can run Windows-based containers on Windows Server 2016 and Windows 10. Windows-based containers require a Windows kernel to run, in the same way that Linux-based containers require a Linux kernel to run. You can even run Windows-based containers on a Windows virtual machine running on an macOS or Linux host. Docker Machine is not necessary if you run macOS 10.10.3 Yosemite, Windows Server 2016, or Windows 10.
Нет.
Докер — это не особо большая НАДСТРОЙКА над ядром Линукса.
Он просто удобным способом позволяет изолировать и запускать родные приложения Линукса.
Из неродных вариантов — разве только запуск Линуксовых приложений из под Докера ФриБСД или напротив запуск Фришных приложение из под Докера Линуха — так как эти операционные системы близки.
С Виндовс сие невозможно в принципе.
Тот Докер что устанавливается в Виндовс — тянет за собой полноценный Линукс. И только это делает возможным запуска Линукс приложений в Докере Виндовс.
Обратная процедура также нетривиальна.
Если вам нужен аналог Докера для запуска приложений Виндовс — обратитесь к технологии Windows Container.