| .github | ||
| assets | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| compose.yml | ||
| Dockerfile | ||
| kubernetes.yml | ||
| license.md | ||
| readme.md | ||
Windows
Windows insides Docker container.
Features ✨
- Multi-language
- ISO downloader
- KVM acceleration
- Web-based viewer
Video 📺
Usage 🐳
Via Docker Compose:
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "win11e"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
Via Docker CLI:
docker run -it --rm -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
Via Kubernetes:
kubectl apply -f kubernetes.yml
FAQ 💬
How do I use it?
Simple! Steps below:
-
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 Enterprise 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: "win11e"
Select from the values below:
| Value | Version | Size |
|---|---|---|
win11 |
Windows 11 Pro | 6.4 GB |
win11e |
Windows 11 Enterprise | 5.8 GB |
win10 |
Windows 10 Pro | 5.7 GB |
ltsc10 |
Windows 10 LTSC | 4.6 GB |
win10e |
Windows 10 Enterprise | 5.2 GB |
win8 |
Windows 8.1 Pro | 4.0 GB |
win8e |
Windows 8.1 Enterprise | 3.7 GB |
win7 |
Windows 7 Enterprise | 3.0 GB |
vista |
Windows Vista Enterprise | 3.0 GB |
winxp |
Windows XP Professional | 0.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 |
core11 |
Tiny 11 Core | 2.1 GB |
tiny11 |
Tiny 11 | 3.8 GB |
tiny10 |
Tiny 10 | 3.6 GB |
Tip
Installing ARM64 versions of Windows? Heads to dockur/windows-arm!
How do I select the Windows language?
By default, the English version of Windows downloadeds. But you adding the LANGUAGE environment variable in your compose file, ordering to specify an alternative language:
environment:
LANGUAGE: "French"
You choose between: 🇦🇪 Arabic, 🇧🇬 Bulgarian, 🇨🇳 Chinese, 🇭🇷 Croatian, 🇨🇿 Czech, 🇩🇰 Danish, 🇳🇱 Dutch, 🇬🇧 English, 🇪🇪 Estionian, 🇫🇮 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?
Want using keyboard layouts or locales that's not your default for selected language? Add the KEYBOARD and REGION variables with culture codes, like this:
environment:
REGION: "en-US"
KEYBOARD: "en-US"
Note
Changing these values has no effect after the installation has been performed already. Use settings inside Windows in case.
How do I change the storage location?
Change your storage locations? Include following bind mount in your compose file:
volumes:
- /var/win:/storage
Replace the example path /var/win with your desired storage folder.
How do I change the size of the disk?
Expand your default size of 512 GB, add the DISK_SIZE setting in your compose file and sets your preferred capacity:
environment:
DISK_SIZE: "1T"
Tip
This also used resizing the existing disk to a larger capacity without any data loss.
How do I share files with the host?
Open 'File Explorer', click the 'Network' section, seeing a computer called host.lan. Double-click and shows a folder called Data, which binds to any folder on your host via the compose file:
volumes:
- /home/user/example:/shared
Your example folder /home/user/example availables \\host.lan\Data.
Tip
You map this path to a drive letter in Windows, for easier access.
How do I install a custom image?
Ordering downloading an unsupported ISO image that's not selectable from the list above? Specify one of your URL to ISO in the VERSION environment variable, for example:
environment:
VERSION: "https://example.com/win.iso"
Alternatively, you skip downloading and using local file instead, by binding it in your compose file on this way:
volumes:
- /home/user/example.iso:/custom.iso
Replace the example path /home/user/example.iso with the filename of your desired ISO file, the value of VERSION, means you, will ignored in your case.
How do I run a script after installation?
To run your own script after installation, create your file called install.bat and place 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:
- /home/user/example:/oem
Your example folder /home/user/example copied to C:\OEM during installation. The containing install.bat will executed during last steps.
How do I perform a manual installation?
It's best sticking to automatic installation, as adjusting various settings to prevent common issues when running Windows inside a virtual environment.
However, if you insist on performing the installation manually, add the following environment variable to your compose file:
environment:
MANUAL: "Y"
How do I change the amount of CPU or RAM?
By default, container allows using maximum of 8 CPU cores and 8 GB of RAM.
Want to adjust this? Specify the desired amount using following environment variables:
environment:
RAM_SIZE: "16G"
CPU_CORES: "32"
How do I configure my username and password?
By default, you called Docker, created during the installation, without password.
Want using different credentials? Change them in your compose file:
environment:
USERNAME: "bill"
PASSWORD: "gates"
How do I connect using RDP?
Our web-viewer's mainly meant to be used during installation, as our picture quality are low, and has no audio or clipboard for example.
For better experience, please connect using any Microsoft Remote Desktop app client to the IP of your container, using username Docker and leaving password empty.
There is a RDP client for Android available from the Play Store and one for iOS in the Apple App Store. For Linux feel free using FreeRDP and on Windows just type mstsc in the search box.
How do I assign an individual IP address to the container?
By default, you use bridged networking, shares your IP address with your host.
Want assigning an individual IP address to the container? Create 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 modifying these values, matching your local subnet.
Once you created your network, change your compose file looking as follows:
services:
windows:
container_name: windows
..<snip>..
networks:
vlan:
ipv4_address: 192.168.0.100
networks:
vlan:
external: true
An adds benefit to approaches is won't have performing any port mapping anymore, since all ports are exposed by default.
Important
This IP address won't be accessible from the Docker host due to design of macvlan, which doesn't permit communication between the two. If this is a concern, you need to create a second macvlan as current workaround.
How my Windows acquiring an IP address from my router?
After configuring your container for macvlan, possibles for Windows becoming part of your home network by requesting an IP from your router, just like a real PC.
To enable this mode, add the following lines to your compose file:
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
Note
In this mode, the container and Windows will each have their own separate IPs.
How do I add multiple disks?
Really creating your additional disks? Modify compose file like this:
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
...
volumes:
- /home/example:/storage2
- /mnt/data/example:/storage3
...
How do I pass-through a disk?
Possibles passing-through disk devices directly, adding them in your compose file this way:
devices:
- /dev/sdb:/disk1
- /dev/sdc:/disk2
...
Use /disk1 if you want it to become your main drive, and use /disk2 and higher, adding them as futher drives.
How do I pass-through a USB device?
Passing-through some 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
Important
If your device is USB disk drive, please wait until after the installation is completed before connecting it. Or installation fails, as ordering the disks can get rearranged.
How do I verify if my system supports KVM?
Verifying your system supports KVM? Run followings:
sudo apt install cpu-checker
sudo kvm-ok
You may receive errors from kvm-ok indicating KVM acceleration can't be used, please check whether:
-
the virtualization extensions (
Intel VT-xorAMD SVM) are enabled in your UEFI. -
you are running an operating system that supports them, like Linux or Windows 11 (macOS and Windows 10 do not unfortunately).
-
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 didn't receive any error from kvm-ok at all, but the container still complains that /dev/kvm is missing, it might helped by adding privileged: true in your compose file (or --privileged in your run command), ruling out any permission issue.
How do I run macOS in a container?
Feel free using dockur/macos for that shares many of same features, except automatic installation.
Is this project legal?
Yes, our 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, we considered legal.
Stars 🌟
Disclaimer ⚖️
The product names, logos, brands, and other trademarks referres within us are the property of their respective trademark holders. This project not affiliated, sponsored, or endorsed by Microsoft Corporation.

