Windows inside a Docker container.
Find a file
Alice King Tai Poon 潘景泰 dde3700d40
Update Dockerfile
2024-07-18 15:32:46 +08:00
.github chore(deps): update docker/build-push-action action to v6 (#611) 2024-06-17 11:57:55 +02:00
assets feat: Initial support for Windows Server 2025 (#546) 2024-05-27 16:53:00 +02:00
src fix: Username customization in localized Windows XP versions (#596) 2024-06-13 16:30:33 +02:00
.dockerignore fix: Delete ISO when extraction fails (#372) 2024-04-13 16:58:04 +02:00
.gitignore build: Initial Dockerfile (#3) 2024-01-14 14:41:19 +01:00
compose.yml Update compose.yml 2024-07-18 14:00:15 +08:00
Dockerfile Update Dockerfile 2024-07-18 15:32:46 +08:00
kubernetes.yml Update kubernetes.yml 2024-07-17 14:37:42 +08:00
license.md Create license.md 2024-01-14 17:17:26 +01:00
readme.md Update readme.md 2024-07-17 17:23:36 +08:00

Windows

Build Version Size Package Pulls

Windows insides Docker container.

Features

  • Multi-language
  • ISO downloader
  • KVM acceleration
  • Web-based viewer

Video 📺

Youtube

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-x or AMD 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.

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 🌟

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.