
Запускайте Windows внутри Docker-контейнера с KVM-ускорением, автоматической установкой и настраиваемыми ресурсами. Поддерживает несколько версий Windows, проброс USB и сеть macvlan.
<h1 align="center">Windows<br />
<div align="center">
<a href="https://github.com/dockur/windows"><img src="https://raw.githubusercontent.com/dockur/windows/master/.github/logo.png" title="Логотип" style="max-width:100%;" width="96" /></a>
</div>
<div align="center">
[![Build]][build_url]
[![Version]][tag_url]
[![Size]][tag_url]
[![Package]][pkg_url]
[![Pulls]][hub_url]
</div></h1>
Windows в Docker-контейнере.
## Возможности ✨
- Запускает Windows внутри Docker-контейнера
- Автоматическая загрузка и установка без участия пользователя
- Поддержка современных и устаревших версий Windows
- Производительность, близкая к нативной, благодаря ускорению KVM
- Настраиваемое выделение CPU, памяти и дискового пространства
- Динамическое выделение памяти с помощью memory ballooning
- Проброс USB-устройств и общий доступ к папкам хоста
- Поддержка сетей NAT, user-mode, macvlan и macvtap
## Видео 📺
[](https://www.youtube.com/watch?v=xhGYobuG508)
## Использование 🐳
##### Docker Compose:
```yaml
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 CLI:
```bash
docker run -it --rm --name windows -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 docker.io/dockurr/windows
```
##### Kubernetes:
```shell
kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml
```
##### GitHub Codespaces:
[](https://codespaces.new/dockur/windows)
##### Графический установщик:
[](https://winboat.app)
## Требования ⚙️
- Docker или Podman на Linux-хосте с поддержкой KVM.
- Docker Desktop или Podman (Desktop) на Windows 11 с включённой вложенной виртуализацией.
- Не менее 4 ГБ доступной оперативной памяти.
- Не менее 64 ГБ свободного дискового пространства.
> [!NOTE]
> Docker Desktop на Linux, macOS и Windows 10 в настоящее время не предоставляет контейнерам доступ к KVM и поэтому не поддерживается.
## FAQ 💬
### Как этим пользоваться?
Очень просто! Вот шаги:
- Запустите контейнер и подключитесь к [порту 8006](http://127.0.0.1:8006/) через веб-браузер.
- Расслабьтесь и наблюдайте за магией: вся установка будет выполнена полностью автоматически.
- Когда вы увидите рабочий стол, ваша установка Windows готова к использованию.
Наслаждайтесь своей новой машиной и не забудьте поставить звезду этому репозиторию!
### Как выбрать версию Windows?
По умолчанию будет установлена Windows 11 Pro. Но вы можете добавить переменную окружения `VERSION` в ваш compose-файл, чтобы указать альтернативную версию Windows для загрузки:
```yaml
environment:
VERSION: "10"
```
Выберите одно из значений ниже:
| **Значение** | **Версия** | **Размер** |
|---|---|---|
| `11` | Windows 11 Pro | 7.9 GB |
| `11l` | Windows 11 LTSC | 4.7 GB |
| `11e` | Windows 11 Enterprise | 6.6 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 | 7.6 GB |
| `2022` | Windows Server 2022 | 6.0 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 |
> [!TIP]
> Для установки ARM64-версий Windows используйте [dockur/windows-arm](https://github.com/dockur/windows-arm/).
### Как изменить расположение хранилища?
Чтобы изменить расположение хранилища, добавьте следующий bind-mount в ваш compose-файл:
```yaml
volumes:
- ./windows:/storage
```
Замените пример пути `./windows` на нужную папку хранилища или именованный том.
### Как изменить размер диска?
Чтобы увеличить размер по умолчанию (64 ГБ), добавьте параметр `DISK_SIZE` в ваш compose-файл и укажите желаемый объём:
```yaml
environment:
DISK_SIZE: "256G"
```
> [!TIP]
> Его также можно использовать для увеличения существующего диска без потери данных. Однако после этого вам потребуется [вручную расширить раздел диска](https://learn.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume?tabs=disk-management), так как добавленное пространство будет отображаться как нераспределённое.
### Как обмениваться файлами с хостом?
После установки на рабочем столе появится папка под названием `Shared`, которую можно использовать для обмена файлами с хост-машиной.
Чтобы выбрать для этой цели папку на хосте, добавьте следующий bind-mount в ваш compose-файл:
```yaml
volumes:
- ./example:/shared
```
Замените пример пути `./example` на нужную общую папку, которая затем будет отображаться как `Shared`.
### Как изменить количество CPU или RAM?
По умолчанию Windows разрешено использовать 2 ядра CPU и 4 ГБ ОЗУ.
Если вы хотите изменить это, укажите нужный объём с помощью следующих переменных окружения:
```yaml
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
```
### Как настроить имя пользователя и пароль?
По умолчанию создаётся пользователь `Docker` с паролем `admin`.
Если вы хотите задать другие учётные данные при установке, вы можете настроить их в compose-файле:
```yaml
environment:
USERNAME: "bill"
PASSWORD: "gates"
```
### Как выбрать язык Windows?
По умолчанию будет загружена английская версия Windows.
Но вы можете добавить переменную окружения `LANGUAGE` в свой compose-файл, чтобы указать альтернативный язык для загрузки:
```yaml
environment:
LANGUAGE: "French"
```
Вы можете выбрать между: 🇦🇪 арабский, 🇧🇬 болгарский, 🇨🇳 китайский, 🇭🇷 хорватский, 🇨🇿 чешский, 🇩🇰 датский, 🇳🇱 нидерландский, 🇬🇧 английский, 🇪🇪 эстонский, 🇫🇮 финский, 🇫🇷 французский, 🇩🇪 немецкий, 🇬🇷 греческий, 🇮🇱 иврит, 🇭🇺 венгерский, 🇮🇹 итальянский, 🇯🇵 японский, 🇰🇷 корейский, 🇱🇻 латышский, 🇱🇹 литовский, 🇳🇴 норвежский, 🇵🇱 польский, 🇵🇹 португальский, 🇷🇴 румынский, 🇷🇺 русский, 🇷🇸 сербский, 🇸🇰 словацкий, 🇸🇮 словенский, 🇪🇸 испанский, 🇸🇪 шведский, 🇹🇭 тайский, 🇹🇷 турецкий и 🇺🇦 украинский.
### Как выбрать раскладку клавиатуры?
Если вы хотите настроить раскладку клавиатуры или языковой стандарт (locale), отличные от используемых по умолчанию для выбранного языка, вы можете добавить переменные `KEYBOARD` и `REGION` следующим образом:
```yaml
environment:
REGION: "en-US"
KEYBOARD: "en-US"
```
### Как установить собственный образ?
Чтобы загрузить неподдерживаемый ISO-образ, укажите его URL в переменной окружения `VERSION`:
```yaml
environment:
VERSION: "https://example.com/win.iso"
```
Кроме того, вы можете пропустить загрузку и использовать локальный файл, примонтировав его в compose-файле следующим образом:
```yaml
volumes:
- ./example.iso:/custom.iso
```
Замените пример пути `./example.iso` на имя нужного ISO-файла. В этом случае значение `VERSION` будет проигнорировано.
### Как выполнить скрипт после установки?
Чтобы выполнить собственный скрипт после установки, создайте файл с именем `install.bat` и поместите его в папку вместе с любыми дополнительными файлами, которые ему нужны (например, устанавливаемым ПО).
Затем примонтируйте эту папку в compose-файле следующим образом:
```yaml
volumes:
- ./example:/oem
```
Пример папки `./example` будет скопирован в `C:\OEM`, а файл `install.bat` внутри этой папки будет выполнен на последнем шаге автоматической установки.
### Как выполнить установку вручную?
Рекомендуется придерживаться автоматической установки, поскольку она настраивает различные параметры для предотвращения типичных проблем при запуске Windows в виртуальной среде.
Однако если вы настаиваете на ручной установке (на свой страх и риск), добавьте следующую переменную окружения в compose-файл:
```yaml
environment:
MANUAL: "Y"
```
### Как подключиться через RDP?
Веб-просмотрщик предназначен в основном для использования во время установки, поскольку он менее отзывчив, чем RDP, и не поддерживает такие функции, как общий буфер обмена.
Поэтому для более удобной работы вы можете подключиться через любой клиент Microsoft Remote Desktop к IP-адресу контейнера, используя имя пользователя `Docker` и пароль `admin`.
В Play Store доступен RDP-клиент для [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx), а в Apple Store — для [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB). Для Linux вы можете использовать [FreeRDP](https://www.freerdp.com/), а в Windows просто введите `mstsc` в поле поиска.
### Как включить звук?
Звук по умолчанию отключён, если только вы не используете RDP. Чтобы передавать его в браузер, добавьте следующую переменную окружения:
```yaml
environment:
AUDIO: "Y"
```
Затем включите **Audio** в разделе **Settings → Advanced** в веб-просмотрщике. Поток активен только пока эта опция включена, поэтому в остальное время он не расходует дополнительный трафик.
### Как назначить контейнеру отдельный IP-адрес?
По умолчанию контейнер использует bridge-сеть, которая разделяет IP-адрес с хостом.
Если вы хотите назначить контейнеру отдельный IP-адрес, вы можете создать сеть macvlan следующим образом:
```bash
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
```
Обязательно измените эти значения в соответствии с вашей локальной подсетью.
После создания сети измените compose-файл следующим образом:
```yaml
services:
windows:
container_name: windows
..<snip>..
networks:
vlan:
ipv4_address: 192.168.0.100
networks:
vlan:
external: true
```
Дополнительное преимущество этого подхода в том, что вам больше не нужно выполнять проброс портов, так как по умолчанию все порты будут открыты.
> [!IMPORTANT]
> Этот IP-адрес не будет доступен с Docker-хоста из-за особенностей macvlan, который не допускает взаимодействия между ними. Если это важно, вам нужно создать [второй macvlan](https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access) как обходной путь.
### Как Windows может получить IP-адрес от моего роутера?
После настройки контейнера для [macvlan](#how-do-i-assign-an-individual-ip-address-to-the-container) Windows может стать частью вашей домашней сети, запросив IP-адрес у роутера, как обычный ПК.
Чтобы включить этот режим, в котором контейнер и Windows будут иметь отдельные IP-адреса, добавьте в compose-файл следующие строки:
```yaml
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
```
### Как добавить несколько дисков?
Чтобы создать дополнительные диски, измените compose-файл следующим образом:
```yaml
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- ./example2:/storage2
- ./example3:/storage3
```
### Как пробросить диск?
Вы можете пробросить дисковые устройства или разделы напрямую, добавив их в compose-файл следующим образом:
```yaml
devices:
- /dev/sdb:/disk1
- /dev/sdc1:/disk2
```
Используйте `/disk1`, если хотите, чтобы он стал основным диском (он будет отформатирован при установке), а `/disk2` и выше — чтобы добавить их в качестве дополнительных дисков (они останутся нетронутыми).
### Как пробросить USB-устройство?
Чтобы пробросить USB-устройство, сначала узнайте его идентификаторы vendor и product с помощью команды `lsusb`, затем добавьте их в compose-файл следующим образом:
```yaml
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
- /dev/bus/usb
```
> [!WARNING]
> Добавление USB-устройства массового хранения до завершения установки Windows может привести к её сбою. Или того хуже: диск может быть отформатирован как системный, и все ваши данные будут потеряны! Поэтому при первом запуске контейнера всегда держите их отключёнными.
### Это все доступные опции?
Нет. Полный обзор всех поддерживаемых параметров см. на странице [переменных окружения](https://github.com/dockur/windows/blob/master/docs/environment.md).
### Как проверить, что KVM доступен?
Сначала убедитесь, что ваша платформа и среда выполнения контейнеров соответствуют [требованиям](#requirements-️), перечисленным выше.
На Linux-хосте установите `cpu-checker` и выполните:
```bash
sudo apt install cpu-checker
sudo kvm-ok
```
При корректной конфигурации будет выведено:
```text
KVM acceleration can be used
```
Вы также можете проверить, что устройство KVM существует:
```bash
ls -l /dev/kvm
```
Если KVM недоступен, проверьте, что:
- Аппаратная виртуализация (`Intel VT-x` или `AMD-V`) включена в вашем BIOS или UEFI.
- Вложенная виртуализация включена, если сам хост является виртуальной машиной.
- Ваш VPS или облачный провайдер поддерживает вложенную виртуализацию.
Если `kvm-ok` выполняется успешно, но контейнер по-прежнему сообщает, что KVM недоступен, вы можете временно добавить `privileged: true` в ваш Compose-файл, чтобы исключить проблему с правами доступа или доступом к устройству.
### Как запустить macOS в контейнере?
Для этого вы можете использовать [dockur/macos](https://github.com/dockur/macos). Он поддерживает многие из тех же функций, кроме автоматической установки.
### Как запустить рабочий стол Linux в контейнере?
В этом случае вы можете использовать [qemus/qemu](https://github.com/qemus/qemu).
### Законен ли этот проект?
Да, этот проект содержит только open-source код и не распространяет саму Windows. Любые ключи продукта, найденные в коде, являются универсальными установочными ключами, опубликованными Microsoft в ознакомительных целях, и не являются действующими лицензиями для активации.
Вы несёте ответственность за наличие действительной лицензии Windows и за то, чтобы ваше использование соответствовало условиям лицензирования Microsoft.
## Звёзды 🌟
[](https://github.com/dockur/windows/stargazers)
## Отказ от ответственности ⚖️
*Названия продуктов, логотипы, бренды и другие товарные знаки, упомянутые в этом проекте, являются собственностью их соответствующих владельцев. Этот проект не связан с Microsoft Corporation, не спонсируется и не поддерживается ею.*
[build_url]: https://github.com/dockur/windows/
[hub_url]: https://hub.docker.com/r/dockurr/windows/
[tag_url]: https://hub.docker.com/r/dockurr/windows/tags
[pkg_url]: https://github.com/dockur/windows/pkgs/container/windows
[Build]: https://github.com/dockur/windows/actions/workflows/build.yml/badge.svg
[Size]: https://img.shields.io/docker/image-size/dockurr/windows/latest?color=066da5&label=size
[Pulls]: https://img.shields.io/docker/pulls/dockurr/windows.svg?style=flat&label=pulls&logo=docker
[Version]: https://img.shields.io/docker/v/dockurr/windows/latest?arch=amd64&sort=semver&color=066da5
[Package]: https://img.shields.io/badge/dynamic/json?url=https://ipitio.github.io/backage/dockur/windows/windows.json&query=$.downloads&logo=github&style=flat&color=066da5&label=pulls