docker-windows/readme.md

340 lines
12 KiB
Markdown
Raw Normal View History

2025-11-12 15:27:57 +05:30
<h1 align="center">Local Windows on Docker<br />
2024-01-14 17:02:53 +01:00
<div align="center">
2025-11-12 15:27:57 +05:30
<a href="https://github.com/dockur/windows"><img src="./.github/logo.png" title="Logo" style="max-width:100%;" width="128" /></a>
2024-01-14 17:02:53 +01:00
</div>
<div align="center">
2025-11-12 15:27:57 +05:30
2024-01-14 17:02:53 +01:00
</div></h1>
2025-11-12 15:27:57 +05:30
Local Windows inside a Docker container.
2024-03-28 16:11:43 +01:00
2024-06-11 20:56:49 +02:00
## Usage 🐳
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
### Building the Image
2024-01-14 17:02:53 +01:00
```bash
2025-11-26 13:50:52 +05:30
docker build -t windows-local:latest .
2024-01-14 17:02:53 +01:00
```
2025-11-26 13:50:52 +05:30
### Preparing Golden Image (First Time)
Mount your Windows ISO and let it install automatically:
2025-11-12 15:27:57 +05:30
```bash
2025-11-26 13:50:52 +05:30
docker run -it --rm \
--name prepare-windows \
--device=/dev/kvm \
--cap-add NET_ADMIN \
--mount type=bind,source=/path/to/windows.iso,target=/custom.iso \
-v /path/to/storage:/storage \
-p 8006:8006 \
-e RAM_SIZE=4G \
-e CPU_CORES=2 \
-e DISK_SIZE=64G \
--stop-timeout 120 \
windows-local:latest
2024-05-16 02:20:23 +02:00
```
2025-11-26 13:50:52 +05:30
The container will automatically:
- Install Windows with automated configuration
- Create a golden image in `/storage`
- Exit when preparation is complete
### Running from Golden Image
After preparation, start Windows from the saved golden image:
2025-03-18 14:02:31 +01:00
2025-11-12 15:27:57 +05:30
```bash
docker run -it --rm \
2025-11-26 13:50:52 +05:30
--name windows \
--device=/dev/kvm \
--cap-add NET_ADMIN \
-v /path/to/storage:/storage \
2025-11-12 15:27:57 +05:30
-p 8006:8006 \
2025-11-26 13:50:52 +05:30
-p 3389:3389 \
-e RAM_SIZE=8G \
-e CPU_CORES=4 \
--stop-timeout 120 \
windows-local:latest
```
Access the desktop via browser at http://localhost:8006
### Custom Installation with OEM Scripts
You can provide custom installation scripts that run after installation:
```bash
docker run -it --rm \
--name prepare-windows \
2025-11-12 15:27:57 +05:30
--device=/dev/kvm \
--cap-add NET_ADMIN \
2025-11-26 13:50:52 +05:30
--mount type=bind,source=/path/to/windows.iso,target=/custom.iso \
--mount type=bind,source=/path/to/oem,target=/oem \
-v /path/to/storage:/storage \
-p 8006:8006 \
2025-11-12 15:27:57 +05:30
--stop-timeout 120 \
windows-local:latest
```
2025-03-18 14:02:31 +01:00
2025-11-26 13:50:52 +05:30
Create an `/oem/install.bat` script that will execute after installation:
```batch
@echo off
REM Example OEM installation script
REM Install additional software
echo Installing additional packages...
REM Configure system
echo Custom setup complete!
```
2025-11-12 15:27:57 +05:30
## Compatibility ⚙️
2025-10-11 17:31:14 +02:00
2025-11-12 15:27:57 +05:30
| **Product** | **Platform** | |
|---|---|---|
| Docker Engine | Linux| ✅ |
| Docker Desktop | Linux | ❌ |
| Docker Desktop | macOS | ❌ |
| Docker Desktop | Windows 11 | ✅ |
| Docker Desktop | Windows 10 | ❌ |
2025-10-11 17:31:14 +02:00
2024-06-11 20:56:49 +02:00
## FAQ 💬
2024-01-14 17:02:53 +01:00
2024-06-13 18:15:03 +02:00
### How do I use it?
2024-01-15 04:01:54 +01:00
2025-11-12 15:27:57 +05:30
**Download Windows 11 Enterprise ISO:**
1. Visit [Microsoft Evaluation Center](https://info.microsoft.com/ww-landing-windows-11-enterprise.html)
2. Accept the Terms of Service
3. Download **Windows 11 Enterprise Evaluation (90-day trial, English, United States)** ISO file [~6GB]
**Then follow these steps:**
2024-01-27 19:49:37 +01:00
2025-11-12 15:27:57 +05:30
- Start the container and connect to [port 8006](http://localhost:8006) using your web browser.
2024-01-15 04:04:39 +01:00
2024-01-27 19:49:37 +01:00
- Sit back and relax while the magic happens, the whole installation will be performed fully automatic.
2024-01-15 04:04:39 +01:00
2024-01-27 19:49:37 +01:00
- 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!
2024-01-15 04:01:54 +01:00
2025-11-12 15:27:57 +05:30
### How do I select the Windows language?
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
By default, the English version of Windows will be downloaded. But you can specify an alternative language using the `LANGUAGE` environment variable:
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
```bash
-e LANGUAGE="French"
2024-01-27 19:49:37 +01:00
```
2025-11-12 15:27:57 +05:30
You can 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.
2024-02-03 19:53:35 +01:00
2025-11-12 15:27:57 +05:30
### How do I select the keyboard layout?
2025-11-26 13:50:52 +05:30
If you want to use a keyboard layout or locale that is not the default for your selected language, you can specify the `KEYBOARD` and `REGION` variables with a culture code:
2025-11-12 15:27:57 +05:30
2025-11-26 13:50:52 +05:30
```bash
-e REGION="en-US" \
-e KEYBOARD="en-US"
2025-11-12 15:27:57 +05:30
```
> [!NOTE]
> Changing these values will have no effect after the installation has been performed already. Use the control panel inside Windows in that case.
2024-02-03 19:53:35 +01:00
2024-06-13 18:15:03 +02:00
### How do I change the storage location?
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
To change the storage location, modify the volume mount:
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
```bash
-v /custom/storage/path:/storage
2024-01-27 19:49:37 +01:00
```
2024-01-14 17:02:53 +01:00
2024-06-13 18:15:03 +02:00
### How do I change the size of the disk?
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
To expand the default size of 64 GB, set the `DISK_SIZE` environment variable:
2024-01-14 17:02:53 +01:00
2025-11-26 13:50:52 +05:30
```bash
-e DISK_SIZE="256G"
2024-01-27 19:49:37 +01:00
```
2024-06-13 18:15:03 +02:00
> [!TIP]
2025-11-12 15:27:57 +05:30
> This can also be used to resize the existing disk to a larger capacity without any data loss.
2024-01-14 17:02:53 +01:00
2024-06-13 18:15:03 +02:00
### How do I share files with the host?
2024-02-10 00:11:46 +01:00
2025-11-26 13:50:52 +05:30
Open 'File Explorer' and click on the 'Network' section, you will see a computer called `host.lan`. Double-click it and it will show a folder called `Data`, which can be bound to any folder on your host:
2025-11-12 15:27:57 +05:30
2025-11-26 13:50:52 +05:30
```bash
-v /home/user/example:/data
2025-11-12 15:27:57 +05:30
```
The example folder `/home/user/example` will be available as ` \\host.lan\Data`.
2025-11-12 15:27:57 +05:30
> [!TIP]
> You can map this path to a drive letter in Windows, for easier access.
### How do I run a script after installation?
2025-11-26 13:50:52 +05:30
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:
2024-02-10 00:11:46 +01:00
2025-11-26 13:50:52 +05:30
```bash
--mount type=bind,source=/home/user/example,target=/oem
2024-05-05 21:24:47 +02:00
```
2025-11-12 15:27:57 +05:30
The example folder `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed during the last step.
2024-02-10 00:11:46 +01:00
2025-11-26 13:50:52 +05:30
See the [Custom Installation with OEM Scripts](#custom-installation-with-oem-scripts) section above for a complete example.
2024-06-13 18:15:03 +02:00
### How do I change the amount of CPU or RAM?
2024-05-04 13:28:12 +02:00
2025-11-12 15:27:57 +05:30
By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM.
2024-05-04 13:28:12 +02:00
2025-11-26 13:50:52 +05:30
If you want to adjust this, specify the desired amount:
2024-05-04 13:28:12 +02:00
2025-11-26 13:50:52 +05:30
```bash
-e RAM_SIZE="8G" \
-e CPU_CORES="4"
2024-05-04 13:28:12 +02:00
```
2024-06-13 18:15:03 +02:00
### How do I configure the username and password?
2024-05-18 16:33:12 +02:00
2025-11-12 15:27:57 +05:30
By default, a user called `Docker` is created during the installation, with an empty password.
2024-05-27 12:40:19 +02:00
2025-11-26 13:50:52 +05:30
If you want to use different credentials, specify them:
2024-05-18 16:33:12 +02:00
2025-11-26 13:50:52 +05:30
```bash
-e USERNAME="bill" \
-e PASSWORD="gates"
2024-05-18 16:33:12 +02:00
```
### How do I select the Windows language?
2025-11-26 13:50:52 +05:30
By default, the English version of Windows will be downloaded. But you can specify an alternative language using the `LANGUAGE` environment variable:
2025-11-26 13:50:52 +05:30
```bash
-e LANGUAGE="French"
```
2024-11-10 11:31:54 +01:00
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.
### How do I select the keyboard layout?
2025-11-26 13:50:52 +05:30
If you want to use a keyboard layout or locale that is not the default for your selected language, you can specify the `KEYBOARD` and `REGION` variables with a culture code:
2025-11-26 13:50:52 +05:30
```bash
-e REGION="en-US" \
-e KEYBOARD="en-US"
```
2025-11-12 15:27:57 +05:30
> [!NOTE]
> Changing these values will have no effect after the installation has been performed already. Use the control panel inside Windows in that case.
>
2024-06-13 18:15:03 +02:00
### How do I connect using RDP?
2024-05-04 13:28:12 +02:00
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.
2025-11-12 15:27:57 +05:30
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 by leaving the password empty.
2024-01-15 23:45:35 +01:00
2024-06-13 18:15:03 +02:00
### How do I assign an individual IP address to the container?
2024-01-31 04:38:22 +01:00
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.
2025-11-26 13:50:52 +05:30
Once you have created the network, add the network configuration to your run command:
2024-01-31 04:38:22 +01:00
2025-11-26 13:50:52 +05:30
```bash
docker run -it --rm \
--name windows \
--network vlan \
--ip 192.168.0.100 \
...
2024-01-31 04:38:22 +01:00
```
An added benefit of this approach is that you won't have to perform any port mapping anymore, since all ports will be exposed by default.
2024-06-13 18:15:03 +02:00
> [!IMPORTANT]
> This IP address won't be accessible from the Docker host due to the design of macvlan, which doesn't permit communication between the two. If this is a concern, you need to create a [second macvlan](https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access) as a workaround.
2024-01-31 04:38:22 +01:00
2024-06-13 18:15:03 +02:00
### How can Windows acquire an IP address from my router?
2024-01-31 04:38:22 +01:00
2024-06-16 06:11:33 +02:00
After configuring the container for [macvlan](#how-do-i-assign-an-individual-ip-address-to-the-container), it is possible for Windows to become part of your home network by requesting an IP from your router, just like a real PC.
2024-01-31 04:38:22 +01:00
2025-11-26 13:50:52 +05:30
To enable this mode, add the following to your run command:
2024-01-31 04:38:22 +01:00
2025-11-26 13:50:52 +05:30
```bash
-e DHCP="Y" \
--device=/dev/vhost-net \
--device-cgroup-rule='c *:* rwm'
2024-01-31 04:38:22 +01:00
```
2025-11-12 15:27:57 +05:30
> [!NOTE]
> In this mode, the container and Windows will each have their own separate IPs.
2024-06-13 18:15:03 +02:00
### How do I add multiple disks?
2024-05-09 11:19:34 +02:00
2025-11-26 13:50:52 +05:30
To create additional disks, add the following to your run command:
```bash
-e DISK2_SIZE="32G" \
-e DISK3_SIZE="64G" \
-v /home/example:/storage2 \
-v /mnt/data/example:/storage3
2024-05-09 11:19:34 +02:00
```
2024-06-13 18:15:03 +02:00
### How do I pass-through a disk?
2024-01-17 16:32:20 +01:00
2025-11-26 13:50:52 +05:30
It is possible to pass-through disk devices directly:
2024-01-17 16:32:20 +01:00
2025-11-26 13:50:52 +05:30
```bash
--device=/dev/sdb:/disk1 \
--device=/dev/sdc:/disk2
2024-01-27 19:49:37 +01:00
```
2024-01-17 16:32:20 +01:00
2024-10-02 09:24:11 +02:00
Use `/disk1` if you want it to become your main drive (which will be formatted during installation), and use `/disk2` and higher to add them as secondary drives (which will stay untouched).
2024-01-31 13:40:50 +01:00
2024-06-13 18:15:03 +02:00
### How do I pass-through a USB device?
2024-01-31 13:40:50 +01:00
2025-11-26 13:50:52 +05:30
To pass-through a USB device, first lookup its vendor and product id via the `lsusb` command, then add them to your run command:
2024-01-31 13:40:50 +01:00
2025-11-26 13:50:52 +05:30
```bash
-e ARGUMENTS="-device usb-host,vendorid=0x1234,productid=0x1234" \
--device=/dev/bus/usb
2024-01-31 13:40:50 +01:00
```
2024-01-17 04:01:42 +01:00
2025-11-12 15:27:57 +05:30
> [!IMPORTANT]
> If the device is a USB disk drive, please wait until after the installation is completed before connecting it. Otherwise the installation may fail, as the order of the disks can get rearranged.
2024-06-13 18:15:03 +02:00
### How do I verify if my system supports KVM?
2024-06-09 12:17:46 +02:00
2025-11-12 15:27:57 +05:30
Only Linux and Windows 11 support KVM virtualization, macOS and Windows 10 do not unfortunately.
You can run the following commands in Linux to check your system:
2024-06-09 12:17:46 +02:00
```bash
sudo apt install cpu-checker
sudo kvm-ok
```
2024-11-11 14:13:47 +01:00
If you receive an error from `kvm-ok` indicating that KVM cannot be used, please check whether:
2024-06-09 22:55:49 +02:00
2024-06-11 20:00:19 +02:00
- the virtualization extensions (`Intel VT-x` or `AMD SVM`) are enabled in your BIOS.
- 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.
2025-11-26 13:50:52 +05:30
If you didn't receive any error from `kvm-ok` at all, but the container still complains that `/dev/kvm` is missing, try adding `--privileged` to your `run` command to rule out any permission issue.
2025-11-12 15:27:57 +05:30