Windows in Docker
-

+
[![Build]][build_url]
[![Version]][tag_url]
[![Size]][tag_url]
-[![Package]][pkg_url]
[![Pulls]][hub_url]
-Windows inside a Docker container.
+Windows in a docker container.
-## Features ✨
+## Features
+ - Multi-platform
- ISO downloader
- KVM acceleration
- Web-based viewer
-## Video 📺
+## Usage
-[](https://www.youtube.com/watch?v=xhGYobuG508)
-
-## Usage 🐳
-
-##### Via Docker Compose:
+Via `docker-compose.yml`
```yaml
+version: "3"
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
+ restart: unless-stopped
```
-##### Via Docker CLI:
+Via `docker run`
```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
+docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN dockurr/windows
```
-##### Via Kubernetes:
+## FAQ
-```shell
-kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml
-```
+ * ### How do I use it?
-##### Via Github Codespaces:
+ Very simple! These are the steps:
+
+ - Start the container and get some coffee.
-[](https://codespaces.new/dockur/windows)
+ - Connect to port 8006 of the container in your web browser.
-##### Via a graphical installer:
+ - Sit back and relax while the magic happens, the whole installation will be performed fully automatic.
-[](https://winboat.app)
+ - Once you see the desktop, your Windows installation is ready for use. Enjoy it, and don't forget to star this repo!
-## FAQ 💬
+ * ### How do I select the Windows version?
-### How do I use it?
+ By default, Windows 11 will be installed. But you can add the `VERSION` environment variable to your compose file, in order to specify an alternative Windows version to download:
- Very simple! These are the steps:
-
- - Start the container and connect to [port 8006](http://127.0.0.1:8006/) using your web browser.
+ ```yaml
+ environment:
+ VERSION: "win11"
+ ```
+
+ Select from the values below:
+
+ - ```win11``` (Windows 11)
+ - ```win10``` (Windows 10)
+ - ```win81``` (Windows 8.1)
+ - ```win22``` (Windows Server 2022)
+ - ```win19``` (Windows Server 2019)
+ - ```win16``` (Windows Server 2016)
- - Sit back and relax while the magic happens, the whole installation will be performed fully automatic.
+ * ### How do I increase the amount of CPU or RAM?
- - 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!
+ By default, 2 CPU cores and 4 GB of RAM are allocated to the container, as those are the minimum requirements of Windows 11.
-### How do I select the Windows version?
+ To increase this, add the following environment variables:
- 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:
+ ```yaml
+ environment:
+ RAM_SIZE: "8G"
+ CPU_CORES: "4"
+ ```
- ```yaml
- environment:
- VERSION: "11"
- ```
+ * ### How do I change the size of the disk?
- Select from the values below:
-
- | **Value** | **Version** | **Size** |
- |---|---|---|
- | `11` | Windows 11 Pro | 7.2 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 | 6.7 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 |
+ To expand the default size of 64 GB, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity:
-> [!TIP]
-> To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
+ ```yaml
+ environment:
+ DISK_SIZE: "256G"
+ ```
+
+ This can also be used to resize the existing disk to a larger capacity without any data loss.
+
+ * ### How do I change the storage location?
-### How do I change the storage location?
+ To change the storage location, include the following bind mount in your compose file:
- To change the storage location, include the following bind mount in your compose file:
+ ```yaml
+ volumes:
+ - /var/win:/storage
+ ```
- ```yaml
- volumes:
- - ./windows:/storage
- ```
+ Replace the example path `/var/win` with the desired storage folder.
- Replace the example path `./windows` with the desired storage folder or named volume.
+ * ### How do I verify if my system supports KVM?
-### How do I change the size of the disk?
+ To verify if your system supports KVM, run the following commands:
- To expand the default size of 64 GB, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity:
+ ```bash
+ sudo apt install cpu-checker
+ sudo kvm-ok
+ ```
- ```yaml
- environment:
- DISK_SIZE: "256G"
- ```
-
-> [!TIP]
-> This can also be used to resize the existing disk to a larger capacity without any data loss. However you will need to [manually extend the disk partition](https://learn.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume?tabs=disk-management) since the added disk space will appear as unallocated.
+ If you receive an error from `kvm-ok` indicating that KVM acceleration can't be used, check the virtualization settings in the BIOS.
-### How do I share files with the host?
+ * ### How do I view the screen?
- After installation there will be a folder called `Shared` on your desktop, which can be used to exchange files with the host machine.
-
- To select a folder on the host for this purpose, include the following bind mount in your compose file:
+ The container includes a web-based viewer, so you can visit [http://localhost:8006/](http://localhost:8006/) using any web browser to view the screen and interact with Windows via the keyboard and mouse.
- ```yaml
- volumes:
- - ./example:/shared
- ```
+ This is mainly for use during installation, as afterwards you can use Remote Desktop, TeamViewer or any other software you prefer.
- Replace the example path `./example` with your desired shared folder, which then will become visible as `Shared`.
+ * ### How do I perform a manual installation?
-### How do I change the amount of CPU or RAM?
+ If you prefer to perform the installation manually in order to customize some options, such as selecting another edition, add the following environment variable:
- By default, Windows will be allowed to use 2 CPU cores and 4 GB of RAM.
+ ```yaml
+ environment:
+ MANUAL: "Y"
+ ```
- If you want to adjust this, you can specify the desired amount using the following environment variables:
+ Then follow these steps:
- ```yaml
- environment:
- RAM_SIZE: "8G"
- CPU_CORES: "4"
- ```
+ - Start the container and connect to port 8006 of the container in your web browser. After the download is finished, you will see the Windows installation screen.
-### How do I configure the username and password?
+ - Start the installation by clicking ```Install now```. On the next screen, press 'OK' when prompted to ```Load driver``` and select the ```VirtIO SCSI``` driver from the list that matches your Windows version. So for Windows 11, select ```D:\amd64\w11\vioscsi.inf``` and click 'Next'.
- By default, a user called `Docker` is created and its password is `admin`.
+ - Accept the license agreement and select your preferred Windows edition, like Home or Pro.
- If you want to use different credentials during installation, you can configure them in your compose file:
+ - Choose ```Custom: Install Windows only (advanced)```, and click ```Load driver``` on the next screen. Select 'Browse' and navigate to the ```D:\NetKVM\w11\amd64``` folder, and click 'OK'. Select the ```VirtIO Ethernet Adapter``` from the list and click 'Next'.
- ```yaml
- environment:
- USERNAME: "bill"
- PASSWORD: "gates"
- ```
+ - Select 'Drive 0' and click 'Next'.
-### How do I select the Windows language?
+ - Wait until Windows finishes copying files and completes the installation.
- By default, the English version of Windows will be downloaded.
-
- But you can add the `LANGUAGE` environment variable to your compose file, in order to specify an alternative language to be downloaded:
+ - Once you see the desktop, open File Explorer and navigate to the CD-ROM drive (E:). Double-click on ```virtio-win-gt-x64.msi``` and proceed to install the VirtIO drivers.
- ```yaml
- 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.
+ - Now your Windows installation is ready for use. Enjoy it, and don't forget to star this repo!
-### How do I select the keyboard layout?
+ * ### How do I install an unsupported version?
- 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:
+ You can specify an URL in the `VERSION` environment variable, in order to download a custom ISO file:
+
+ ```yaml
+ environment:
+ VERSION: "https://example.com/win.iso"
+ ```
+
+ During the installation you will need to add some drivers as described in [manual installation](https://github.com/dockur/windows/tree/master?tab=readme-ov-file#how-do-i-perform-a-manual-installation) above.
- ```yaml
- environment:
- REGION: "en-US"
- KEYBOARD: "en-US"
- ```
+ * ### Is this project legal?
-### How do I install a custom image?
+ Yes, this project contains only open-source code and does not distribute any copyrighted material. Neither does it try to circumvent any copyright protection measures. So under all applicable laws, this project would be considered legal.
- In order to download an unsupported ISO image, specify its URL in the `VERSION` environment variable:
-
- ```yaml
- environment:
- VERSION: "https://example.com/win.iso"
- ```
+## Disclaimer
- Alternatively, you can also skip the download and use a local file instead, by binding it in your compose file in this way:
-
- ```yaml
- 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:
-
- ```yaml
- 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:
-
- ```yaml
- environment:
- MANUAL: "Y"
- ```
-
-### 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](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) 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:
-
- ```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
- ```
-
- 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:
-
- ```yaml
- services:
- windows:
- container_name: windows
- ..