dockur/windows does something that sounds like it shouldn't work: it runs a full Windows install inside a Docker container. You pick a version, start the container, and it downloads the installer, runs a hands-free setup, and gives you a Windows desktop in your browser. No ISO hunting, no clicking through the installer.
How it works
It's not Windows running natively in a container. Under the hood the container runs QEMU with KVM acceleration, so Windows gets a real virtual machine with near-native speed. Docker is the packaging: one image, one config file, and a volume that holds the virtual disk. That makes Windows as easy to spin up, back up and throw away as any other container.
What it can do
- Automatic download and unattended install.
- A web viewer on port
8006, plus RDP on3389for a proper client. - Adjustable CPU cores, RAM and disk size.
- A shared folder between host and guest, extra disks, and USB passthrough.
- Custom ISOs, if you'd rather bring your own installer.
- Several networking modes, including giving Windows its own IP on your LAN.
Every Windows you can think of
The VERSION variable picks the release. A few of the options:
11 Windows 11 Pro 7.9 GB
11l Windows 11 LTSC 4.7 GB
10 Windows 10 Pro 5.7 GB
10l Windows 10 LTSC 4.6 GB
7u Windows 7 Ultimate 3.1 GB
xp Windows XP Professional 0.6 GB
98 Windows 98 0.7 GB
95 Windows 95 0.6 GB
2025 Windows Server 2025 7.6 GB
2022 Windows Server 2022 6.0 GB
tiny11 Tiny11 5.3 GB
reactos ReactOS 0.1 GB
The full list is in the project README, and there's a separate dockur/windows-arm for ARM64 hosts. Yes, you can boot Windows 95 in a container. Fitting for a site that looks like this one.
Quick start
Save this as compose.yml:
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
Then:
docker compose up -d
# open http://localhost:8006 and watch it install
Or as a single command:
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
The install takes a while. When the desktop appears, you're in. The default login is Docker / admin. Change it with the USERNAME and PASSWORD variables before the first boot.
Tuning it
Defaults are 2 cores, 4 GB of RAM and a 64 GB disk. Raise them in the environment block:
environment:
VERSION: "11"
RAM_SIZE: "8G"
CPU_CORES: "4"
DISK_SIZE: "128G"
To share files, mount a folder at /shared and it shows up as a Shared folder on the Windows desktop:
volumes:
- ./windows:/storage
- ./example:/shared
Before you try it
- You need KVM. A Linux host with hardware virtualization enabled works. So does Windows 11 with nested virtualization turned on. Docker Desktop on macOS, on Linux and on Windows 10 doesn't expose KVM, so it won't run there.
- Budget at least 2 GB of free RAM and 32 GB of free disk, and more for a modern Windows that you'll actually use.
- Port
8006is a full remote desktop. Don't expose it to the internet without something in front of it. - The project is MIT-licensed and contains only open-source code. It doesn't distribute Windows itself. You're still responsible for having a valid Windows license and following Microsoft's terms.
Why it's worth a look
Needing Windows for one app, testing something on an old release, or keeping a throwaway Windows box in the homelab used to mean setting up a VM by hand. Here it's a config file and one command. With over 50,000 stars on GitHub, plenty of people agree.
The links are in the downloads directory and the resource index. Start with the project README, which covers the FAQ in depth.
End of transmission.