Windows inside a Docker container.
Features ✨
- ISO downloader
- KVM acceleration
- Web-based viewer
Video 📺
Usage 🐳
Via Docker Compose:
services: windows: image: dockurr/windows container_name: windows environment: VERSION: "11" devices: - /dev/kvm - /dev/net/tun cap_add: - NET_ADMIN ports: - 8006:8006 - 3389:3389/tcp - 3389:3389/udp volumes: - ./windows:/storage restart: always stop_grace_period: 2m
Via Docker CLI:
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 dockurr/windows
Via Kubernetes:
kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml
Via Github Codespaces:
FAQ 💬
How do I use it?
Very simple! These are the steps:
-
Start the container and connect to port 8006 using your web browser.
-
Sit back and relax while the magic happens, the whole installation will be performed fully automatic.
-
Once you see the desktop, your Windows installation is ready for use.
Enjoy your brand new machine, and don’t forget to star this repo!
How do I select the Windows version?
By default, Windows 11 Pro will be installed. But you can add the VERSION environment variable to your compose file, in order to specify an alternative Windows version to be downloaded:
environment: VERSION: "11"
Select from the values below:
| Value | Version | Size |
|---|---|---|
11 |
Windows 11 Pro | 5.4 GB |
11l |
Windows 11 LTSC | 4.7 GB |
11e |
Windows 11 Enterprise | 4.0 GB |
10 |
Windows 10 Pro | 5.7 GB |
10l |
Windows 10 LTSC | 4.6 GB |
10e |
Windows 10 Enterprise | 5.2 GB |
8e |
Windows 8.1 Enterprise | 3.7 GB |
7u |
Windows 7 Ultimate | 3.1 GB |
vu |
Windows Vista Ultimate | 3.0 GB |
xp |
Windows XP Professional | 0.6 GB |
2k |
Windows 2000 Professional | 0.4 GB |
2025 |
Windows Server 2025 | 5.6 GB |
2022 |
Windows Server 2022 | 4.7 GB |
2019 |
Windows Server 2019 | 5.3 GB |
2016 |
Windows Server 2016 | 6.5 GB |
2012 |
Windows Server 2012 | 4.3 GB |
2008 |
Windows Server 2008 | 3.0 GB |
2003 |
Windows Server 2003 | 0.6 GB |
How do I change the storage location?
To change the storage location, include the following bind mount in your compose file:
volumes: - ./windows:/storage
Replace the example path ./windows with the desired storage folder or named volume.
How do I change the size of the disk?
To expand the default size of 64 GB, add the DISK_SIZE setting to your compose file and set it to your preferred capacity:
environment: DISK_SIZE: "256G"
Tip
This can also be used to resize the existing disk to a larger capacity without any data loss.
How do I share files with the host?
Open ‘File Explorer’ and click on the ‘Network’ section, you will see a computer called host.lan.
Double-click it and it will show a folder called Data, which can be bound to any folder on your host via the compose file:
volumes: - ./example:/data
The example folder ./example will be available as \\host.lan\Data.
Tip
You can map this path to a drive letter in Windows, for easier access.
How do I change the amount of CPU or RAM?
By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM.
If you want to adjust this, you can specify the desired amount using the following environment variables:
environment: RAM_SIZE: "8G" CPU_CORES: "4"
How do I configure the username and password?
By default, a user called Docker is created during installation and its password is admin.
If you want to use different credentials, you can configure them in your compose file (only before installation):
environment: USERNAME: "bill" PASSWORD: "gates"
How do I select the Windows language?
By default, the English version of Windows will be downloaded.
But before installation you can add the LANGUAGE environment variable to your compose file, in order to specify an alternative language:
environment: LANGUAGE: "French"
You can choose between: 🇦🇪 Arabic, 🇧🇬 Bulgarian, 🇨🇳 Chinese, 🇭🇷 Croatian, 🇨🇿 Czech, 🇩🇰 Danish, 🇳🇱 Dutch, 🇬🇧 English, 🇪🇪 Estonian, 🇫🇮 Finnish, 🇫🇷 French, 🇩🇪 German, 🇬🇷 Greek, 🇮🇱 Hebrew, 🇭🇺 Hungarian, 🇮🇹 Italian, 🇯🇵 Japanese, 🇰🇷 Korean, 🇱🇻 Latvian, 🇱🇹 Lithuanian, 🇳🇴 Norwegian, 🇵🇱 Polish, 🇵🇹 Portuguese, 🇷🇴 Romanian, 🇷🇺 Russian, 🇷🇸 Serbian, 🇸🇰 Slovak, 🇸🇮 Slovenian, 🇪🇸 Spanish, 🇸🇪 Swedish, 🇹🇭 Thai, 🇹🇷 Turkish and 🇺🇦 Ukrainian.
How do I select the keyboard layout?
If you want to use a keyboard layout or locale that is not the default for your selected language, you can add KEYBOARD and REGION variables like this (before installation):
environment: REGION: "en-US" KEYBOARD: "en-US"
How do I select the edition?
Windows Server offers a minimalistic Core edition without a GUI. To select those non-standard editions, you can add a EDITION variable like this (before installation):
environment: EDITION: "core"
How do I install a custom image?
In order to download an unsupported ISO image, specify its URL in the VERSION environment variable:
environment: VERSION: "https://example.com/win.iso"
Alternatively, you can also skip the download and use a local file instead, by binding it in your compose file in this way:
volumes: - ./example.iso:/boot.iso
Replace the example path ./example.iso with the filename of your desired ISO file. The value of VERSION will be ignored in this case.
How do I run a script after installation?
To run your own script after installation, you can create a file called install.bat and place it in a folder together with any additional files it needs (software to be installed for example).
Then bind that folder in your compose file like this:
volumes: - ./example:/oem
The example folder ./example will be copied to C:\OEM and the containing install.bat will be executed during the last step of the automatic installation.
How do I perform a manual installation?
It’s recommended to stick to the automatic installation, as it adjusts various settings to prevent common issues when running Windows inside a virtual environment.
However, if you insist on performing the installation manually at your own risk, add the following environment variable to your compose file:
How do I connect using RDP?
The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example.
So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username Docker and password admin.
There is a RDP client for Android available from the Play Store and one for iOS in the Apple Store. For Linux you can use FreeRDP and on Windows just type mstsc in the search box.
How do I assign an individual IP address to the container?
By default, the container uses bridge networking, which shares the IP address with the host.
If you want to assign an individual IP address to the container, you can create a macvlan network as follows:
docker network create -d macvlan \
--subnet=192.168.0.0/24 \
--gateway=192.168.0.1 \
--ip-range=192.168.0.100/28 \
-o parent=eth0 vlan
Be sure to modify these values to match your local subnet.
Once you have created the network, change your compose file to look as follows:
services: windows: container_name: windows ..<snip>.. networks: vlan: ipv4_address: 192.168.0.100 networks: vlan: external: true
An added benefit of this approach is that you won’t have to perform any port mapping anymore, since all ports will be exposed by default.
Important
This IP address won’t be accessible from the Docker host due to the design of macvlan, which doesn’t permit communication between the two. If this is a concern, you need to create a second macvlan as a workaround.
How can Windows acquire an IP address from my router?
After configuring the container for macvlan, it is possible for Windows to become part of your home network by requesting an IP from your router, just like a real PC.
To enable this mode, in which the container and Windows will have separate IP addresses, add the following lines to your compose file:
environment: DHCP: "Y" devices: - /dev/vhost-net device_cgroup_rules: - 'c *:* rwm'
How do I add multiple disks?
To create additional disks, modify your compose file like this:
environment: DISK2_SIZE: "32G" DISK3_SIZE: "64G" volumes: - ./example2:/storage2 - ./example3:/storage3
How do I pass-through a disk?
It is possible to pass-through disk devices or partitions directly by adding them to your compose file in this way:
devices: - /dev/sdb:/disk1 - /dev/sdc1:/disk2
Use /disk1 if you want it to become your main drive (which will be formatted during installation), and use /disk2 and higher to add them as secondary drives (which will stay untouched).
How do I pass-through a USB device?
To pass-through a USB device, first lookup its vendor and product id via the lsusb command, then add them to your compose file like this:
environment: ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234" devices: - /dev/bus/usb
If the device is a USB disk drive, please wait until after the installation is fully completed before connecting it. Otherwise the installation may fail, as the order of the disks can get rearranged.
How do I verify if my system supports KVM?
First check if your software is compatible using this chart:
| Product | Linux | Win11 | Win10 | macOS |
|---|---|---|---|---|
| Docker CLI | ✅ | ✅ | ❌ | ❌ |
| Docker Desktop | ❌ | ✅ | ❌ | ❌ |
| Podman CLI | ✅ | ✅ | ❌ | ❌ |
| Podman Desktop | ✅ | ✅ | ❌ | ❌ |
After that you can run the following commands in Linux to check your system:
sudo apt install cpu-checker sudo kvm-ok
If you receive an error from kvm-ok indicating that KVM cannot be used, please check whether:
-
the virtualization extensions (
Intel VT-xorAMD SVM) are enabled in your BIOS. -
you enabled «nested virtualization» if you are running the container inside a virtual machine.
-
you are not using a cloud provider, as most of them do not allow nested virtualization for their VPS’s.
If you did not receive any error from kvm-ok but the container still complains about a missing KVM device, it could help to add privileged: true to your compose file (or sudo to your docker command) to rule out any permission issue.
How do I run macOS in a container?
You can use dockur/macos for that. It shares many of the same features, except for the automatic installation.
How do I run a Linux desktop in a container?
You can use qemus/qemu in that case.
Is this project legal?
Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project will be considered legal.
Stars 🌟
Disclaimer ⚖️
The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation.
Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров10K
Если на компьютере под Linux нужно быстренько запустить Windows или MacOS, самый простой и быстрый способ сделать это — ввести команду для скачивания и загрузки докер-контейнера с этой ОС.
В маркетплейсе RuVDS много готовых образов с установленными операционными системами. Там разные дистрибутивы Linux, Windows Server и CentOS. Но нет контейнеров с операционными системами.
Операционная система в докер-контейнере (в QEMU) не требует ручной инсталляции ОС. Всего одна команда в консоли — и контейнер Windows скачивается и запускается.
Набор контейнеров Dockur
Хороший набор докер-контейнеров с готовыми образами операционных систем в виртуальных машинах QEMU можно найти в репозитории Dockur.
Для выбора версии Windows при установке контейнера нужно изменить соответствующее значение в переменной окружения конфигурационного файла:
environment:
VERSION: "11"
В наличии следующие контейнеры Windows:
Предупреждение. Windows 8 потребляет очень много ресурсов CPU и RAM.
Есть также контейнеры MacOS, тут выбор поменьше:
Запуск через Docker Compose:
services:
macos:
image: dockurr/macos
container_name: macos
environment:
VERSION: "13"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 5900:5900/tcp
- 5900:5900/udp
volumes:
- ./macos:/storage
restart: always
stop_grace_period: 2m
Из консоли:
docker run -it --rm --name macos -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v ${PWD:-.}/macos:/storage --stop-timeout 120 dockurr/macos
Для выбора версии тоже следует изменить значение в переменной окружения конфигурационного файла:
environment:
VERSION: "13"
Версии MacOS перечислены в таблице выше.
Запуск контейнера Windows на сервере
Установить контейнер можно через Docker Compose, вот файл compose.yaml, который практически идентичен файлу для MacOS:
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "11"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
volumes:
- ./windows:/storage
restart: always
stop_grace_period: 2m
Или из командной строки:
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v ${PWD:-.}/windows:/storage --stop-timeout 120 dockurr/windows
По умолчанию устанавливается Windows 11 Pro, другие версии можно указать, изменив параметр переменной окружения, как написано выше.
Дальнейший процесс полностью автоматический, нужно дождаться, пока контейнер скачается и запустится. Docker будет доступен через браузер на порту 8006.
Если зайти по нашему IP-адресу и указанному порту, мы увидим процесс скачивания ISO-образа Windows с сервера Microsoft:
Потом автоматическая установка и настройка Windows:
Это специальная версия Windows for Docker, она свободно распространяется с сайта Microsoft и требует активации для полноценной работы. Более старые версии Windows работают 30 дней без активации.
После завершения процесса в браузере откроется рабочий стол Windows:
Через браузер у нас работает система удалённого доступа к рабочему столу VNC (Virtual Network Computing), которая заметно подтормаживает, не поддерживает передачу звука и некоторых других функций. Для максимального комфорта рекомендуется настроить удалённый доступ через RDP. Собственно, этот доступ уже настроен в вышеуказанном файле compose.yaml, в котором присутствуют такие строки:
- 3389:3389/tcp
- 3389:3389/udp
По этим портам и осуществляется удалённый доступ к системе из RDP-клиента, такого как Microsoft Remote Desktop, можно на той же физической системе.
В командной строке для запуска контейнера мы видим параметр --device=/dev/kvm. Это указывает на использование виртуальной машины KVM (Kernel-based Virtual Machine), опенсорсной технологии виртуализации, встроенной в Linux. В частности, KVM позволяет превратить Linux в гипервизор для запуска нескольких изолированных виртуальных окружений, то есть виртуальных машин.
KVM — это часть Linux с 2006 года (с версии ядра 2.6.20), то есть в данном случае мы работаем с нативной виртуальной машиной Linux. Чтобы это стало возможным, материнская плата должна поддерживать технологию виртуализации на аппаратном уровне:
Чтобы проверить наличие поддержки KVM на сервере под Linux, можно запустить следующую команду:
sudo apt install cpu-checker
sudo kvm-ok
Если kvm-ok выдаёт ошибку, то нужно проверить, что:
- в BIOS включены соответствующие расширения виртуализации (Intel VT-x, VT-d или AMD SVM),
- включена «вложенная виртуализация», если контейнер запускается внутри виртуальной машины.
К сожалению, большинство облачных провайдеров не разрешают вложенную виртуализацию на своих VPS:
Поэтому Windows в докер-контейнере запустится только на выделенном сервере или на домашнем сервере/ПК.
Если kvm-ok не выдаёт никакой ошибки, но контейнер всё равно сообщает об отсутствии KVM-устройства, причиной может быть проблема с правами, в качестве решения можно добавить параметр privileged: true в файл compose (или sudo в команду docker).
KVM обеспечивает виртуальной машине доступ к USB-устройствам и другим аппаратным ресурсам. Он позволит даже редактировать BIOS, как в примере выше.
По умолчанию, контейнеру Windows выделяется два ядра CPU и 4 ГБ RAM, это минимальные требования для запуска Windows 11. Чтобы изменить объём выделяемых ресурсов, следует добавить следующие строчки в конфигурационный файл:
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
Увеличение объёма дискового пространства со стандартных 64 ГБ (по умолчанию) до 100 ГБ:
environment:
DISK_SIZE: "100G"
Виртуальная машина будет занимать столько места на диске, сколько реально занимает контейнер с файлами, а не максимальное указанное значение.
Добавить несколько дисков:
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- ./example2:/storage2
- ./example3:/storage3
Зачем это нужно
Распространённая причина запуска Windows в контейнере — если у нас чисто линуксовое (или яблочное) окружение, вокруг нет ни одного компьютера под Windows, но срочно понадобилось запустить какую-то специфическую программу, которая работает только под Windows. В окружении виртуализации типа Wine эта программа не полностью функциональна. Например, старая утилита для редактирования BIOS (как AMIBCP на скриншоте) запускается под Wine, но не даёт реально изменять значения BIOS, то есть не сохраняет образ ROM:
Конечно, можно установить на ПК мультизагрузчик и вторую ОС или запустить виртуальную машину, но это тоже непростой и многоступенчатый процесс: сконфигурировать гипервизор, выделить аппаратные ресурсы.
Копия Windows в контейнере — самый простой и быстрый способ, если срочно нужна эта ОС. И самое удобное то, что не нужно проходить через процесс инсталляции системы вручную, потому что она устанавливается автоматически и сразу готова к работе. Вся процедура скачивания и запуска контейнера занимает несколько минут.
Другие наборы контейнеров
Кроме перечисленных выше, в репозитории Dockur есть и другие наборы докер-контейнеров, а также программы, полезные для самохостинга:
- Windows для ARM64,
- сервер Samba SMB,
- Dnsmasq,
- strfry, рилей-сервер Nostr,
- casa, операционная система CasaOS для самохостинга (личное облако или домашний дата-центр),
- statping — страничка с красивыми графиками, аналитикой и плагинами, всё для мониторинга сайтов и приложений,
- lemmy — агрегатор ссылок и форум, аналог Reddit или Hacker News, только для децентрализованной сети будущего, где у каждого пользователя свой сервер.
Windows на виртуальном сервере
Хотя KVM не работает на VPS, в маркетплейсе RUVDS есть четыре образа с установленной системой Windows Server 2019 и специализированным программным обеспечением:
- METATRADER 5 (MT5) – SERVER CORE с торговым терминалом MT5,
- SQL EXPRESS – SERVER CORE c бесплатной редакцией SQL Server 2019 и SQL Server Management Studio 18.4. Максимальный размер БД в этой редакции ограничен 10 ГБ,
- сервер Minecraft,
- VPN L2TP — позволяет сразу после установки шаблона подключаться к серверу по VPN, целиком меняя IP-адрес подключившегося.
Если выбрать такой образ — мы получаем готовую лицензированную Windows и настроенный софт.
Кроме того, при ручной конфигурации сервера в конфигураторе есть возможность выбрать несколько версий серверной ОС Windows для установки:
- Windows Server 2022.
- Windows Server 2019.
- Windows Server 2016.
- Windows Server 2012 R2.
- Windows Server Core 2022.
Есть и готовые тарифы с Windows:
Самая дешёвая Windows 2012 R2 стоит 588 руб. в месяц (470 руб. при оплате за год).
С 2023 года у российских пользователей возникли проблемы с покупкой Windows в условиях санкций. В такой ситуации выбор VPS с предустановленной Windows или докер-контейнер с официальным образом — легальный выход из ситуации.
Кстати, таким же удобным способом в Docker/QEMU можно запускать и Linux-контейнеры.
© 2025 ООО «МТ ФИНАНС»
Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Содержание:
-
1.
Предыстория -
2.
Windows контейнер -
3.
В мире контейнеров Windows -
4.
Связь с Docker -
5.
Мир Windows
Начиная с Windows Server 2016 в операционной системе от Microsoft включена нативная поддержка контейнеров. Это не Linux контейнеры, это контейнеры, которые работают на Windows, и запускают Windows внутри себя.
Данный факт является результатом присоединения Microsoft к Open Container Initiative (OCI). Контейнеры в Windows позволяют запускать приложения, которые изолированы от остальной части системы в переносимых контейнерах. Эти контейнеры включают в себя все, чтобы ваше приложение было полностью функциональным. Так же как это произошло с Linux, Microsoft надеется, что контейнеры изменят характер поставки программного обеспечения для пользователей и в Windows.
Предыстория
Контейнеры являлись основой вычислений в Linux в течение целого ряда лет. Google, например, уже очень давно использует решения, основанные на контейнерах по всей своей империи, чтобы предоставлять распределенные приложения не только своим сотрудникам, но и своим пользователям по всему миру.
Тем не менее, Google не был долгое время одинок в своем увлечении контейнерными вычислениями. В какой-то момент из ниоткуда появился Docker, который в отличии от Google стандартизировал процессы доставки контейнеров, а также управления ими. Более того, Docker развивался сообществом энтузиастов в мире открытого исходного кода, что сделало его простым и очень популярным решением. С развитием проекта Docker буквально у каждого желающего появилась возможность получить скорость, гибкость и простоту управления программным обеспечением и инфраструктурой, которую предоставляют контейнеры.
Docker революция стала настолько значительной, что даже Microsoft присоединился к этой инициативе в первую очередь за счет поддержки Docker и Linux в Azure, а теперь и за счет интеграции этой технологии в Windows Server 2016. Самое интересное это то, что контейнеры Windows Server не основаны на Linux, это нечто совершенно новое. Windows контейнеры — это контейнеры, которые работают в Windows и запускают Windows внутри себя.
Причем Microsoft настолько серьезно стала относится к контейнерам, что сейчас активно участвует в Open Container Initiative (OCI), пытаясь перетягивать одеяло на себя так, как будто бы она сама придумала эту технологию.
Windows контейнер
Контейнер в Windows имеет много общего с его аналогом в Linux. Оба обеспечивают изолированную среду для запуска приложений. И там и там контейнеры используют передовые технологии изоляции для обеспечения портативной, но одновременно ограниченной среды, которая включает в себя практически все, чтобы приложение могло быть полностью функциональным.
Контейнер очень похож на виртуальную машину (ВМ) и часто рассматривается как отдельный тип виртуализации, но это два совершенно разные понятия. Да, каждый работает под управлением операционной системы (ОС), предоставляет внутри себя локальную файловую систему и может быть доступен по сети так же как физический компьютер. Тем не менее, при использовании ВМ вы имеете дело с полной и независимой ОС вместе с виртуальными драйверами устройств, управлением памятью и другими компонентами, которые добавляют к накладные расходы.
Контейнер переиспользует большее количество общих ресурсов хост-системы нежели виртуальная машина, а значит, он более легкий, быстрее разворачивается и проще масштабируется между различными датацентрами. Таким образом, контейнер может предложить более эффективный механизм для инкапсулирования приложения, обеспечивая ему при этом необходимые интерфейсы хост-системы — все из этого приводит к более эффективному использованию ресурсов и улучшению переносимости приложений.
Microsoft планирует предложить два типа контейнеров в Windows Server 2016: контейнер Windows Server и Hyper-V контейнер. Оба типа функционируют одинаковым образом, и могут быть созданы и управляются одинаково. Там, где они различаются — это в уровне изоляции, который каждый из них обеспечивает.
Контейнер Windows Server разделяет ядро с ОС работает на хост-машине, что означает, что все контейнеры, работающие на этой машине, разделяют одно и то же ядро. В то же время, каждый контейнер поддерживает свой собственный вид на операционную систему, реестр, файловую систему, IP-адреса и другие компоненты, сочетая это с изоляцией, предоставляемой каждому контейнеру при помощи процессов, пространства имен и технологий управления ресурсами.
Контейнер Windows Server хорошо подходит для ситуаций, в которых и основная ОС, и приложения в контейнерах лежат в пределах той же зоны доверия, например для приложений, которые охватывают несколько контейнеров или образуют общую службу. Тем не менее, контейнеры Windows Server обсуждаются в связи с их зависимостью от процесса обновления ОС хост-системы, который может осложнить обслуживание и препятствовать процессам. Например, патч примененный к хосту может сломать приложение, работающее в контейнере. Что еще более важно, в таких ситуациях, как многопользовательские среды, модель разделяемого ядра может раскрыть систему для уязвимостей приложений и кросс-контейнерных атак.
Hyper-V контейнер решает эти проблемы, предоставляя виртуальную машину, в которой нужно запустить контейнер Windows. При таком подходе контейнер больше не разделяет ядро хост-машины и не имеет зависимости от патчей ОС этой машины. Конечно, такой подход означает некоторую потерю скорости и эффективности упаковки, которые вы получаете с обычным контейнером в Windows Server, но взамен вы получаете более изолированную и безопасную среду.
Вне зависимости от типа контейнера, который вы используете, теперь у вас есть возможность использовать контейнеры с такими технологиями Windows как .NET или PowerShell, что не было возможно раньше. Контейнер для Windows предоставляет все необходимое для обеспечения работы приложения на любом компьютере под управлением Windows Server 2016, давая вам тот уровень переносимости, который был не доступен на протяжении большей части истории Windows. Вы можете создавать свои контейнеры локально, делать их доступными процессов для тестирования и контроля качества, а затем отправить их в команде, занимающейся продуктивом, без необходимости беспокоиться о сложных установках и конфигурациях на каждом шаге этого пути.
В мире контейнеров Windows
Ряд компонентов принимают участие в процессе создании и запуска контейнеров, начиная с хоста, на котором они должны работать. Хост может быть как физическим компьютером, так и ВМ с Windows 2016 Server. Единственное, что важно, чтобы была включена функция контейнеризации для Windows.
Вы можете разместить контейнеры на любой версии Windows: Server Full UI или же Core, которая устанавливается по умолчанию. Microsoft также представляет Nano издание для Windows Server 2016 — минимальную версию ОС, которая не включает в себя локальный графический пользовательский интерфейс или консоль.
Microsoft также добавила вложенную виртуализацию для Windows Server 2016, так что вы можете запустить Hyper-V контейнеры, если хостом является ВМ. Если вы планируете запускать такой тип контейнера, необходимо включить функцию Hyper-V на хост-ОС. Microsoft также добавляет поддержку контейнера для Windows 10, хотя только для Hyper-V контейнеров.
Как и с контейнерами Docker, вы разворачиваете контейнеры для Windows из образов. Каждый образ начинается с образа ОС контейнера — базового образа, включающего в себя операционную систему, которая будет работать внутри контейнера. В настоящее время Microsoft предоставляет два базовых образа: образ Server Core и образ Nano Server. Вы должны загрузить хотя бы один из этих образов ОС от Microsoft, прежде чем сможете развернуть контейнер.
Microsoft строго определяет, какие образы вы можете использовать с каким типом контейнера на основании хост-ОС, как описано в следующей таблице.
|
Хост-ОС |
Контейнер Windows Server |
Контейнер Hyper-V |
|
Windows Server Full UI |
Образ Server Core |
Образ Nano Server |
|
Windows Server Core |
Образ Server Core |
Образ Nano Server |
|
Windows Server Nano |
Образ Nano Server |
Образ Nano Server |
|
Windows 10 |
N/A |
Образ Nano Server |
Как вы можете видеть, Hyper-V контейнеры в настоящее время поддерживают только образ Nano сервера, но ваш выбор контейнеров Windows Server зависит от того, с какой версией Windows Server вы работаете.
Для этого типа контейнера, образ ОС должен также соответствовать хост-системы в отношении сборки и уровня обновления. Несоответствие может привести к непредсказуемому поведению как для контейнера, так и хоста. Это означает, что вы должны обновить образ базового контейнера ОС при обновлении ОС хоста. Это также означает, что вы не будете иметь возможность запускать Linux контейнер на Windows машине, или наоборот, и это также верно для Hyper-V контейнеров.
Образы обеспечивают высокую степень гибкости, когда речь идет о развертывании контейнеров. Вы можете создавать образы на основе существующего образа и обновлять новые образы так часто, как это необходимо. После этого вы можете развернуть один или несколько контейнеров из этого образа.
Например, предположим, что вы создаете образ, основанный на Server Core. В новый образ, вы устанавливаете приложение, которое в настоящее время находится в разработке вместе со всеми зависимостями этого приложения. Затем вы можете развернуть один или несколько контейнеров из этого образа. Каждый контейнер функционирует как песочница, которая включает все компоненты, необходимые для полной работоспособности приложения.
Образ может быть развернут так часто, как это необходимо, а также совместно использоваться любым количеством контейнеров. Вы создаете контейнеры по мере необходимости, а затем избавляетесь от них, когда вы с ними закончите. Но лучше всего то, что вы можете обновить и повторно развернуть образ в любое время, а затем создать из него новые контейнеры, которые содержат последние изменения.
Вам не нужно выбирать тип контейнера (Windows Server или Hyper-V) до тех пор, пока вы не будете готовы запустить фактический контейнер. Тип контейнера не имеет никакого отношения к тому, как вы собираете ваши образы. Образы хранятся в репозитории и доступны по запросу для разворачивания контейнеров, где и когда они необходимы, будь то контейнеры Windows Server или Hyper-V.
Связь с Docker
Помимо компании, Docker также является проектом с открытым кодом, которая облегчает процесс развертывания и управления контейнерами. Контейнеры Windows теперь являются частью этого проекта, и сообщество Docker интенсивно работает, чтобы полностью интегрировать контейнеры Windows в экосистему Docker. В рамках этой же инициативы Docker предлагает Docker Engine для Windows, и Docker Client для Windows.
Docker Engine обеспечивает функциональность, необходимую для управления Docker окружением. Например, Docker Engine позволяет автоматизировать создание контейнеров из образов. Хотя вы можете создавать образы вручную, Docker Engine предлагает целый ряд преимуществ, т.к. возможность хранения образов как кода, легкого пересоздания этих образов или включения их в цикл непрерывной интеграции в процессе разработки.
Тем не менее, Docker Engine не является частью установки Windows. Вы должны загрузить, установить и настроить его отдельно от Windows. Docker Engine работает как служба Windows. Можно настроить эту службу, используя файл конфигурации или Windows Service Control Manager (SCM). Например, вы можете установить отладку по умолчанию и параметры журнала или настроить, как Docker Engine принимает сетевые запросы. Microsoft рекомендует использовать файл конфигурации, а не SCM, но отмечает, что не каждый параметр конфигурации в файле применим к контейнерам Windows.
Docker Engine по существу делает всю рутинную работу по управлению контейнером за вас, расширяя API, необходимый для клиента Docker для взаимодействия Docker Engine. Клиент представляет собой интерфейс командной строки, который предоставляет набор команд для управления образами и контейнерами. Это те же самые команды, которые позволяют создавать и запускать контейнеры Docker в Linux. Хотя вы и не можете запустить контейнер для Windows на Linux или контейнер Linux на Windows, вы можете использовать один и тот же клиент для управления как Linux и Windows контейнерами, будь то контейнеры Windows Server или Hyper-V.
Как и с Docker Engine, вам необходимо загрузить и установить клиент Docker самостоятельно. Клиент может работать как на Windows 10 или Windows Server 2016. Вам нужно только указать клиенту Docker службу, которой необходимо начать управлять.
Мир Windows
Microsoft и Docker осталось сделать еще много работы, прежде чем контейнеры для Windows будут полностью функциональны, но то, что мы видим уже сейчас представляет собой значительный шаг вперед. Пользователям Windows, наконец, получат возможность пользоваться всеми преимуществами гибкости и переносимости, которые контейнеры предлагали миру Linux на протяжении более десяти лет.
Running Windows in a Docker container might sound like a complex task, but it’s perfectly achievable with the right tools and a clear guide. This blog post will walk you through the entire process, ensuring you have a Windows environment up and running in a Docker container in no time.
Plus, if you’re new to Docker, I’ve got a handy video tutorial covering how to install it on your machine, be it Windows, macOS, or Ubuntu.
Requirements
Before we dive in, ensure Docker is installed and running on your system. If you need help with this, check out my video tutorial or blog post on installing Docker on Ubuntu. If you’re using macOS, the process is slightly different; I’ve covered that in my guide on how to install Docker on macOS, which is essential for this tutorial.
The Project
We’ll utilize a project from GitHub, specifically designed for this purpose. You can find it at https://github.com/dockur/windows. This project uses KVM (a virtual machine) to run Windows inside a Docker container, giving you the full functionality of a Windows environment.
Setting Up Your Environment
First, let’s set up the Docker environment for running Windows. Open your terminal and follow these steps:
- Create a new directory for your project:
mkdir windows
cd windows
- Create a
compose.yamlfile to define your Docker environment:
version: "3"
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3390:3389/tcp
- 3390:3389/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: "win11"
RAM_SIZE: "8G"
CPU_CORES: "4"
DISK_SIZE: "256G"
volumes:
- ./data:/storage
- With your
compose.yamlready, bring up your Docker container:
docker compose up -d
Now, your Windows environment should be initialized. You can view the installation process by navigating to localhost:8006 your web browser.
Accessing Your Windows Environment
There are a couple of ways to access your new Windows container:
- Remini: A convenient tool for connecting to your Windows Docker container.
- Remote Desktop Protocol (RDP): Use RDP to connect directly using the server IP where your container is running. The default credentials are
user: dockerandpass: "".
Monitoring and Management
- To view the resources being used by your Windows container, simply open the Task Manager.
- Network volumes and mounts can be checked to ensure your data is correctly linked.
- Remember, to stop the virtual machine, use:
docker stop windows
If you don’t want the container to start with your computer, update its settings with:
docker update --restart=no windows
Configuration and Usage
- To inspect your container’s configuration:
docker inspect windows
To start the container:
docker start windows
- While you can’t play 3D games, many software applications and simpler games will run smoothly.
Legality
Concerned about the legality of this project? Fear not. This project comprises entirely open-source code and doesn’t distribute any copyrighted material. Any product keys found within are generic placeholders provided by Microsoft for trial purposes, making this project legal under all applicable laws.
Conclusion
Running Windows in a Docker container is an excellent way to leverage the flexibility of Docker with the familiarity of Windows. Whether for development, testing, or running specific Windows-only applications, this setup provides a robust solution. Remember, for those new to Docker, ensure you’re comfortable with the basics – my video tutorial and other blog posts, like application monitoring with Docker or guide to deploy Kubernetes, can help you get started.
Feel free to share your thoughts, questions, or feedback in the comments section below. Happy Docking!
Introduction
Ever wondered if you could run a full Windows system inside a Docker container? What once seemed impossible is now a reality thanks to dockur/windows, a groundbreaking solution that lets you run Windows 11, 10, and even classic Windows 7 smoothly within Docker containers.
This guide will walk you through the process of achieving this seemingly impossible task, transforming your Docker container into a fully functional Windows workstation.
💡 If you’re interested in running Windows in Docker, this tutorial will guide you step by step through the process.
Why Run Windows in Docker?
Before diving into the technical details, let’s understand the benefits of running Windows in Docker:
- 🚀 Rapid deployment and migration
- 💾 Lower resource overhead
- 🔄 Multiple version coexistence
- 🛠️ Simplified environment management
- 🔒 Enhanced isolation
dockur/windows Features Overview
dockur/windows offers these core capabilities:
- ✨ Support for multiple Windows versions (11/10/8.1/7/XP and more)
- 🔄 Automatic ISO downloading
- ⚡ KVM acceleration support
- 🌐 Web-based remote access
- 🖥️ RDP remote desktop support
- 💽 Flexible storage configuration
- ⚙️ Customizable CPU and memory allocation
- 💪 ARM version support Check ARM version here
System Requirements
Before starting, ensure your system meets these prerequisites:
💡 If you’re testing in VirtualBox, remember to enable virtualization support first.
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Linux (KVM support) | Ubuntu 22.04+ |
| CPU | Virtualization capable | 4+ cores |
| Memory | 4GB | 8GB+ |
| Storage | 20GB free space | SSD storage |
Basic Installation and Configuration
1. Deploy with Docker Compose
Create a compose.yml file:
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "11" # Choose Windows version
devices:
- /dev/kvm # KVM device mapping
cap_add:
- NET_ADMIN
ports:
- 8006:8006 # Web access port
- 3389:3389/tcp # RDP ports
- 3389:3389/udp
volumes:
- /home/vir-docker/data:/storage # Windows image will be created on your local drive
stop_grace_period: 2m # Grace period for clean shutdown
💡 Graceful shutdown enabled
2. Launch the Container
docker-compose up -d
System Configuration Guide
Windows Version Selection
Choose different Windows versions by setting the VERSION environment variable:
| Code | Version | Image Size |
|---|---|---|
| 11 | Windows 11 Pro | 5.4 GB |
| 11l | Windows 11 LTSC | 4.2 GB |
| 11e | Windows 11 Enterprise | 5.8 GB |
| 10 | Windows 10 Pro | 5.7 GB |
| 10l | Windows 10 LTSC | 4.6 GB |
| 10e | Windows 10 Enterprise | 5.2 GB |
| 8 | Windows 8.1 Pro | 4.0 GB |
| 8e | Windows 8.1 Enterprise | 3.7 GB |
| 7e | Windows 7 Enterprise | 3.0 GB |
| ve | Windows Vista Enterprise | 3.0 GB |
| xp | Windows XP Professional | 0.6 GB |
| 2025 | Windows Server 2025 | 5.0 GB |
| 2022 | Windows Server 2022 | 4.7 GB |
| 2019 | Windows Server 2019 | 5.3 GB |
| 2016 | Windows Server 2016 | 6.5 GB |
| 2012 | Windows Server 2012 | 4.3 GB |
| 2008 | Windows Server 2008 | 3.0 GB |
| 2003 | Windows Server 2003 | 0.6 GB |
Storage Configuration
Modify default storage location:
volumes:
- /var/win:/storage # Custom storage path
Adjust disk sizes:
environment:
DISK_SIZE: "256G" # Primary disk size
DISK2_SIZE: "32G" # Secondary disk size
DISK3_SIZE: "64G" # Third disk size
volumes:
- /var/win:/storage # Primary disk path
- /home/win:/storage2 # Secondary disk path
- /mnt/win:/storage3 # Third disk path
System Resource Allocation
Configure CPU and memory:
environment:
RAM_SIZE: "8G" # Allocate 8GB RAM
CPU_CORES: "4" # Allocate 4 CPU cores
Language Customization
By default, Windows installs in English. Set a different language using the LANGUAGE environment variable:
environment:
LANGUAGE: "English" # Set Windows language
Supported languages include:
| Language | Setting | Language | Setting |
|---|---|---|---|
| English | English | Chinese | Chinese |
| Japanese | Japanese | Korean | Korean |
| French | French | German | German |
| Spanish | Spanish | Russian | Russian |
| Italian | Italian | Portuguese | Portuguese |
💡 Tip: Choose officially supported languages for best stability and compatibility.
Remote Access Setup
Web Access
- Access
http://your-host-ip:8006after container launch - Wait for automatic installation
- Installation is complete when Windows desktop appears
RDP Remote Desktop
- Connect using any RDP client to
your-host-ip:3389 - Default username:
Docker - Default password: none
Custom Credentials
environment:
USERNAME: "admin"
PASSWORD: "secure_password"
Advanced Configuration
Custom Installation Scripts
Create and mount install.bat:
volumes:
- /path/to/scripts:/oem
DHCP Network Configuration
Enable DHCP:
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
Troubleshooting
KVM Support Verification
Check KVM support:
sudo apt install cpu-checker
sudo kvm-ok
Performance Optimization Tips
- Enable CPU virtualization extensions
- Use SSD storage
- Allocate sufficient system resources
- Consider macvlan networking for better performance
Conclusion
dockur/windows provides a powerful and flexible solution for running Windows systems in Docker containers. This guide enables you to easily deploy and manage Windows in Docker, opening new possibilities for development, testing, and virtualization scenarios.
References
- dockur/windows GitHub Repository
- Docker Documentation
- Microsoft Remote Desktop Documentation
