This commit is contained in:
Michel Abboud 2026-01-30 17:13:06 +00:00 committed by GitHub
commit 43132b144b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
55 changed files with 5577 additions and 2 deletions

30
.env.example Normal file
View File

@ -0,0 +1,30 @@
# Windows Docker VM Configuration
#
# Two env files are provided with optimized defaults:
# - .env.modern (8G RAM, 4 CPU) - Windows 10/11, Server 2016+
# - .env.legacy (2G RAM, 2 CPU) - Windows 7/8, Vista, XP, 2000, Server 2003-2012, Tiny
#
# Each compose file references the appropriate env file automatically.
# Edit .env.modern or .env.legacy to customize settings.
#
# Available settings:
#
# RAM_SIZE=8G # Memory allocation
# CPU_CORES=4 # CPU cores
# DISK_SIZE=128G # Virtual disk size
# USERNAME=Docker # Windows username
# PASSWORD=admin # Windows password
# LANGUAGE=en # Installation language
# REGION=en-US # Region setting
# KEYBOARD=en-US # Keyboard layout
# WIDTH=1280 # Display width
# HEIGHT=720 # Display height
# DHCP=N # Use DHCP (Y/N)
# SAMBA=Y # Enable file sharing (Y/N)
# RESTART_POLICY=on-failure # Restart policy (no, on-failure, always, unless-stopped)
# DEBUG=N # Debug mode (Y/N)
# WINDOWS_IMAGE=dockurr/windows # Docker image (dockurr/windows-arm for ARM64)
#
# winctl.sh settings (place in .env file):
#
# AUTO_CACHE=N # Auto-cache ISOs on stop (Y/N)

32
.env.legacy Normal file
View File

@ -0,0 +1,32 @@
# Legacy Systems Configuration (Windows 7/8, Vista, XP, 2000, Server 2003-2012, Tiny)
# Resources
RAM_SIZE=2G
CPU_CORES=2
DISK_SIZE=32G
# User Credentials
USERNAME=docker
PASSWORD=admin
# Language & Region
LANGUAGE=en
REGION=en-US
KEYBOARD=en-US
# Display
WIDTH=1280
HEIGHT=720
# Network
DHCP=N
SAMBA=Y
# Restart Policy (no, on-failure, always, unless-stopped)
RESTART_POLICY=on-failure
# Docker Image (dockurr/windows for x86, dockurr/windows-arm for ARM64)
WINDOWS_IMAGE=dockurr/windows
# Debug
DEBUG=N

32
.env.modern Normal file
View File

@ -0,0 +1,32 @@
# Modern Systems Configuration (Windows 10/11, Server 2016+)
# Resources
RAM_SIZE=8G
CPU_CORES=4
DISK_SIZE=128G
# User Credentials
USERNAME=docker
PASSWORD=admin
# Language & Region
LANGUAGE=en
REGION=en-US
KEYBOARD=en-US
# Display
WIDTH=1280
HEIGHT=720
# Network
DHCP=N
SAMBA=Y
# Restart Policy (no, on-failure, always, unless-stopped)
RESTART_POLICY=on-failure
# Docker Image (dockurr/windows for x86, dockurr/windows-arm for ARM64)
WINDOWS_IMAGE=dockurr/windows
# Debug
DEBUG=N

View File

@ -22,6 +22,7 @@ jobs:
with: with:
locale: "US" locale: "US"
level: warning level: warning
fail_level: error
pattern: | pattern: |
*.md *.md
*.sh *.sh
@ -32,6 +33,7 @@ jobs:
uses: reviewdog/action-hadolint@v1 uses: reviewdog/action-hadolint@v1
with: with:
level: warning level: warning
fail_level: error
reporter: github-pr-review reporter: github-pr-review
hadolint_ignore: DL3006 DL3008 hadolint_ignore: DL3006 DL3008
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
@ -40,6 +42,7 @@ jobs:
uses: reviewdog/action-yamllint@v1 uses: reviewdog/action-yamllint@v1
with: with:
level: warning level: warning
fail_level: error
reporter: github-pr-review reporter: github-pr-review
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
- -
@ -47,6 +50,7 @@ jobs:
uses: reviewdog/action-actionlint@v1 uses: reviewdog/action-actionlint@v1
with: with:
level: warning level: warning
fail_level: error
reporter: github-pr-review reporter: github-pr-review
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
- -
@ -54,6 +58,7 @@ jobs:
uses: reviewdog/action-shfmt@v1 uses: reviewdog/action-shfmt@v1
with: with:
level: warning level: warning
fail_level: error
shfmt_flags: "-i 2 -ci -bn" shfmt_flags: "-i 2 -ci -bn"
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
- -
@ -61,6 +66,7 @@ jobs:
uses: reviewdog/action-shellcheck@v1 uses: reviewdog/action-shellcheck@v1
with: with:
level: warning level: warning
fail_level: error
reporter: github-pr-review reporter: github-pr-review
shellcheck_flags: -x -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028 shellcheck_flags: -x -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}

17
.gitignore vendored
View File

@ -1 +1,18 @@
# Environment file (contains local settings)
.env
# Ignore data folder contents but keep structure
data/*
!data/*/
data/*/**
!data/*/.gitkeep
# Snapshot contents (generated at runtime)
snapshots/*
!snapshots/.gitkeep
# Instance compose files and registry (generated at runtime)
instances/
# ISO cache (cached ISOs for faster instance creation)
cache/

62
CHANGELOG.md Normal file
View File

@ -0,0 +1,62 @@
# Changelog
All notable changes to this project will be documented in this file.
## [1.0.0] - 2026-01-30
### Added
- **winctl.sh**: Management script for Windows Docker containers
- 20+ commands: start, stop, restart, status, logs, shell, stats, build, rebuild, list, inspect, monitor, check, refresh, open, pull, disk, snapshot, restore, clean, destroy, instances, cache, help
- Interactive menus for version selection
- Prerequisites checking (Docker, Compose, KVM, TUN, memory, disk)
- Color-coded output with professional table formatting
- Safety confirmations for destructive operations
- Support for all 22 Windows versions across 4 categories
- JSON status cache (`~/.cache/winctl/status.json`) with auto-refresh
- **Multi-instance support**: run multiple instances of the same version
- `start <version> --new` creates auto-numbered instances with allocated ports
- `start <version> --new <name>` creates named instances
- `--clone` copies data from the base version
- JSON registry (`instances/registry.json`) tracks all instances
- `instances` lists all registered instances; `destroy` removes them
- **ISO cache**: skip re-downloading ISOs for new instances
- `cache download <version>` downloads original ISOs using the container's download logic
- `cache save <version>` caches from data directory (skips rebuilt ISOs)
- Auto-restore on `start --new` copies cached ISOs before container starts
- `cache list` / `cache rm` / `cache flush` for cache management
- Rebuilt ISOs (genisoimage output) detected and skipped automatically
- **Auto-cache on stop**: `AUTO_CACHE=Y` in `.env` caches unprocessed ISOs when stopping
- **Snapshot & restore**: back up and restore VM data directories
- **Topic-based help system**: `help [commands|instances|cache|examples|config|all]`
- Interactive numbered menu in terminal mode
- Auto-disabled in pipes, CI, and batch environments
- Aligned columns using `_help_row()` with ANSI-safe formatting
- **ARM64 auto-detection**: blocks unsupported versions, shows `[x86 only]` tags
- **LAN IP detection** with remote access URLs shown on start
- **Port conflict detection** before starting containers
- **Disk usage monitoring** with per-VM and snapshot breakdowns
- Multi-version compose structure with organized folders (`compose/`)
- Environment file configuration (`.env` / `.env.example`)
- Two resource profiles: modern (8G RAM, 4 CPU) and legacy (2G RAM, 2 CPU)
- Per-version data folders under `data/`
- Pre-configured compose files for all Windows versions:
- Desktop: Win 11, 10, 8.1, 7 (with Enterprise variants)
- Legacy: Vista, XP, 2000
- Server: 2003, 2008, 2012, 2016, 2019, 2022, 2025
- Tiny: Tiny11, Tiny10
- Unique port mappings for each version (no conflicts)
- CLAUDE.md for Claude Code guidance
- WINCTL_GUIDE.md comprehensive user guide
### Changed
- Default storage location changed from `./windows` to `./data/`
- Compose files now use `env_file` for centralized configuration
- Restart policy changed from `always` to `on-failure`
- `clean --data` now unregisters instances and removes compose files
### Resource Profiles
| Profile | RAM | CPU | Disk | Used By |
|---------|-----|-----|------|---------|
| Modern | 8G | 4 | 128G | Win 10/11, Server 2016+ |
| Legacy | 2G | 2 | 32G | Win 7/8, Vista, XP, 2000, Server 2003-2012, Tiny |

149
CLAUDE.md Normal file
View File

@ -0,0 +1,149 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is **dockur/windows** - a Docker container that runs Windows inside QEMU with KVM acceleration. It provides automatic Windows installation with ISO downloading, VirtIO driver injection, and unattended setup via answer files.
## Architecture
### Entry Point & Script Chain
The container starts via `/run/entry.sh` which sources scripts in sequence:
1. `start.sh``utils.sh``reset.sh``server.sh``define.sh``mido.sh``install.sh`
2. Then: `disk.sh``display.sh``network.sh``samba.sh``boot.sh``proc.sh``power.sh``memory.sh``config.sh``finish.sh`
3. Finally launches `qemu-system-x86_64` with constructed arguments
### Key Components
- **src/define.sh**: Version parsing, language mapping, and Windows edition detection. Maps user-friendly version strings (e.g., "11", "10l", "2022") to internal identifiers
- **src/mido.sh**: Microsoft ISO downloader - scrapes Microsoft's download portal to get direct ISO links
- **src/install.sh**: ISO extraction, image detection, driver injection, answer file customization, and ISO rebuilding using `wimlib-imagex` and `genisoimage`
- **src/samba.sh**: Configures Samba for host-guest file sharing (appears as "Shared" folder on desktop)
- **assets/*.xml**: Unattended answer files for different Windows versions
### Build System
- Base image: `qemux/qemu` (QEMU with web-based VNC viewer)
- VirtIO drivers downloaded at build time from `qemus/virtiso-whql`
- Multi-arch support: amd64 native, arm64 via `dockur/windows-arm`
### GitHub Codespaces
The `.devcontainer/` directory provides GitHub Codespaces configurations — separate from the `compose/` files used by `winctl.sh`.
- `devcontainer.json` (root): Default config, launches Windows 11 Pro
- Numbered subfolders (010210): Alternative configs for each Windows version
- `codespaces.yml`: Shared compose file using `ghcr.io/dockur/windows`
- Runs a single VM at a time on ports 8006/3389 (no unique port mapping needed)
- Do not sync ports with `compose/` files — they serve different use cases
## Commands
### Linting & Validation
```bash
# ShellCheck for all shell scripts
shellcheck -x --source-path=src src/*.sh
# Dockerfile linting
hadolint Dockerfile
# XML validation (answer files)
# Uses action-pack/valid-xml in CI
```
### Building
```bash
# Build Docker image locally
docker build -t windows .
# Build with version argument
docker build --build-arg VERSION_ARG=1.0 -t windows .
```
### Testing Locally
```bash
# Run container (requires KVM)
docker run -it --rm -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD}/storage:/storage" windows
# Access web viewer at http://localhost:8006
```
## CI/CD
- **check.yml**: Runs on PRs - ShellCheck, Hadolint, XML/JSON/YAML validation
- **build.yml**: Manual trigger - builds multi-arch image, pushes to Docker Hub and GHCR
- **test.yml**: Runs check.yml on PRs
ShellCheck exclusions (from CI): SC1091, SC2001, SC2002, SC2034, SC2064, SC2153, SC2317, SC2028
## Key Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| VERSION | "11" | Windows version (11, 10, 10l, 2022, etc.) or ISO URL |
| LANGUAGE | "en" | Installation language |
| USERNAME | "Docker" | Windows username |
| PASSWORD | "admin" | Windows password |
| DISK_SIZE | "64G" | Virtual disk size |
| RAM_SIZE | "4G" | RAM allocation |
| CPU_CORES | "2" | CPU cores |
| MANUAL | "" | Set to "Y" for manual installation |
## Git Remotes & Pull Requests
### Remotes
| Remote | Repository | Purpose |
|--------|-----------|---------|
| `origin` | `michelabboud/windows` | Personal repo, push directly to `master` |
| `fork` | `michelabboud/windows-1` | Fork of `dockur/windows`, used for PRs to upstream |
### Creating a PR to upstream
1. Push changes to a feature branch on the fork:
```bash
git push fork master:<branch-name>
```
2. Create the PR:
```bash
gh pr create --repo dockur/windows --head michelabboud:<branch-name> --base master --title "..." --body "..."
```
3. Create a matching issue:
```bash
gh issue create --repo dockur/windows --title "..." --body "..."
```
### Updating an existing PR
Push new commits to the same branch on the fork:
```bash
git push fork master:<branch-name>
```
The PR updates automatically. Update the PR description if needed:
```bash
gh pr edit <pr-number> --repo dockur/windows --body "..."
```
### Updating the GitHub release
```bash
gh release edit <tag> --notes "..."
```
### Active PRs
| PR | Branch | Issue | Description |
|----|--------|-------|-------------|
| [#1637](https://github.com/dockur/windows/pull/1637) | `feat/winctl-management-script` | [#1639](https://github.com/dockur/windows/issues/1639) | winctl.sh management script with ARM64 support |
| [#1638](https://github.com/dockur/windows/pull/1638) | `fix/reviewdog-fail-level` | [#1640](https://github.com/dockur/windows/issues/1640) | Replace deprecated fail_on_error with fail_level in reviewdog actions |
## Adding New Windows Versions
1. Add version aliases in `src/define.sh` `parseVersion()` function
2. Create answer file in `assets/` named `{version}.xml`
3. Add driver folder mapping in `src/install.sh` `addDriver()` function

1272
WINCTL_GUIDE.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,17 @@
# Default compose file - Windows 11 Pro
# For more versions, see compose/ folder
# Configure settings in .env file
services: services:
windows: windows:
image: dockurr/windows image: dockurr/windows
container_name: windows container_name: windows
env_file: .env
environment: environment:
VERSION: "11" VERSION: "11"
RAM_SIZE: ${MODERN_RAM_SIZE:-8G}
CPU_CORES: ${MODERN_CPU_CORES:-4}
DISK_SIZE: ${MODERN_DISK_SIZE:-128G}
devices: devices:
- /dev/kvm - /dev/kvm
- /dev/net/tun - /dev/net/tun
@ -14,6 +22,6 @@ services:
- 3389:3389/tcp - 3389:3389/tcp
- 3389:3389/udp - 3389:3389/udp
volumes: volumes:
- ./windows:/storage - ./data/win11:/storage
restart: always restart: unless-stopped
stop_grace_period: 2m stop_grace_period: 2m

6
compose/all.yml Normal file
View File

@ -0,0 +1,6 @@
---
include:
- desktop.yml
- legacy.yml
- server.yml
- tiny.yml

6
compose/desktop.yml Normal file
View File

@ -0,0 +1,6 @@
---
include:
- desktop/win11.yml
- desktop/win10.yml
- desktop/win8.yml
- desktop/win7.yml

61
compose/desktop/win10.yml Normal file
View File

@ -0,0 +1,61 @@
---
services:
win10:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win10
env_file: ../../.env.modern
environment:
VERSION: "10"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8010:8006
- 3310:3389/tcp
- 3310:3389/udp
volumes:
- ../../data/win10:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win10e:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win10e
env_file: ../../.env.modern
environment:
VERSION: "10e"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8014:8006
- 3314:3389/tcp
- 3314:3389/udp
volumes:
- ../../data/win10e:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win10l:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win10l
env_file: ../../.env.modern
environment:
VERSION: "10l"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8015:8006
- 3315:3389/tcp
- 3315:3389/udp
volumes:
- ../../data/win10l:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

61
compose/desktop/win11.yml Normal file
View File

@ -0,0 +1,61 @@
---
services:
win11:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win11
env_file: ../../.env.modern
environment:
VERSION: "11"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8011:8006
- 3311:3389/tcp
- 3311:3389/udp
volumes:
- ../../data/win11:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win11e:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win11e
env_file: ../../.env.modern
environment:
VERSION: "11e"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8012:8006
- 3312:3389/tcp
- 3312:3389/udp
volumes:
- ../../data/win11e:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win11l:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win11l
env_file: ../../.env.modern
environment:
VERSION: "11l"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8013:8006
- 3313:3389/tcp
- 3313:3389/udp
volumes:
- ../../data/win11l:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

41
compose/desktop/win7.yml Normal file
View File

@ -0,0 +1,41 @@
---
services:
win7:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win7
env_file: ../../.env.legacy
environment:
VERSION: "7u"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8007:8006
- 3307:3389/tcp
- 3307:3389/udp
volumes:
- ../../data/win7:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win7e:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win7e
env_file: ../../.env.legacy
environment:
VERSION: "7e"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8071:8006
- 3371:3389/tcp
- 3371:3389/udp
volumes:
- ../../data/win7e:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

41
compose/desktop/win8.yml Normal file
View File

@ -0,0 +1,41 @@
---
services:
win81:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win81
env_file: ../../.env.legacy
environment:
VERSION: "8"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8008:8006
- 3308:3389/tcp
- 3308:3389/udp
volumes:
- ../../data/win81:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m
win81e:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win81e
env_file: ../../.env.legacy
environment:
VERSION: "8e"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8081:8006
- 3381:3389/tcp
- 3381:3389/udp
volumes:
- ../../data/win81e:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

5
compose/legacy.yml Normal file
View File

@ -0,0 +1,5 @@
---
include:
- legacy/vista.yml
- legacy/winxp.yml
- legacy/win2k.yml

21
compose/legacy/vista.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
vista:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: vista
env_file: ../../.env.legacy
environment:
VERSION: "vu"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3306:3389/tcp
- 3306:3389/udp
volumes:
- ../../data/vista:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

21
compose/legacy/win2k.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
win2k:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2k
env_file: ../../.env.legacy
environment:
VERSION: "2k"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8000:8006
- 3300:3389/tcp
- 3300:3389/udp
volumes:
- ../../data/win2k:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

21
compose/legacy/winxp.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
winxp:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: winxp
env_file: ../../.env.legacy
environment:
VERSION: "xp"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8005:8006
- 3305:3389/tcp
- 3305:3389/udp
volumes:
- ../../data/winxp:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

9
compose/server.yml Normal file
View File

@ -0,0 +1,9 @@
---
include:
- server/win2025.yml
- server/win2022.yml
- server/win2019.yml
- server/win2016.yml
- server/win2012.yml
- server/win2008.yml
- server/win2003.yml

View File

@ -0,0 +1,21 @@
---
services:
win2003:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2003
env_file: ../../.env.legacy
environment:
VERSION: "2003"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8003:8006
- 3303:3389/tcp
- 3303:3389/udp
volumes:
- ../../data/win2003:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2008:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2008
env_file: ../../.env.legacy
environment:
VERSION: "2008"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8108:8006
- 3208:3389/tcp
- 3208:3389/udp
volumes:
- ../../data/win2008:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2012:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2012
env_file: ../../.env.legacy
environment:
VERSION: "2012"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8112:8006
- 3212:3389/tcp
- 3212:3389/udp
volumes:
- ../../data/win2012:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2016:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2016
env_file: ../../.env.modern
environment:
VERSION: "2016"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8016:8006
- 3316:3389/tcp
- 3316:3389/udp
volumes:
- ../../data/win2016:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2019:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2019
env_file: ../../.env.modern
environment:
VERSION: "2019"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8019:8006
- 3319:3389/tcp
- 3319:3389/udp
volumes:
- ../../data/win2019:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2022:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2022
env_file: ../../.env.modern
environment:
VERSION: "2022"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8022:8006
- 3322:3389/tcp
- 3322:3389/udp
volumes:
- ../../data/win2022:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

View File

@ -0,0 +1,21 @@
---
services:
win2025:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: win2025
env_file: ../../.env.modern
environment:
VERSION: "2025"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8025:8006
- 3325:3389/tcp
- 3325:3389/udp
volumes:
- ../../data/win2025:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

4
compose/tiny.yml Normal file
View File

@ -0,0 +1,4 @@
---
include:
- tiny/tiny11.yml
- tiny/tiny10.yml

21
compose/tiny/tiny10.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
tiny10:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: tiny10
env_file: ../../.env.legacy
environment:
VERSION: "tiny10"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8110:8006
- 3110:3389/tcp
- 3110:3389/udp
volumes:
- ../../data/tiny10:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

21
compose/tiny/tiny11.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
tiny11:
image: ${WINDOWS_IMAGE:-dockurr/windows}
container_name: tiny11
env_file: ../../.env.legacy
environment:
VERSION: "tiny11"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8111:8006
- 3111:3389/tcp
- 3111:3389/udp
volumes:
- ../../data/tiny11:/storage
restart: ${RESTART_POLICY:-on-failure}
stop_grace_period: 2m

0
data/tiny10/.gitkeep Normal file
View File

0
data/tiny11/.gitkeep Normal file
View File

0
data/vista/.gitkeep Normal file
View File

0
data/win10/.gitkeep Normal file
View File

0
data/win10e/.gitkeep Normal file
View File

0
data/win10l/.gitkeep Normal file
View File

0
data/win11/.gitkeep Normal file
View File

0
data/win11e/.gitkeep Normal file
View File

0
data/win11l/.gitkeep Normal file
View File

0
data/win2003/.gitkeep Normal file
View File

0
data/win2008/.gitkeep Normal file
View File

0
data/win2012/.gitkeep Normal file
View File

0
data/win2016/.gitkeep Normal file
View File

0
data/win2019/.gitkeep Normal file
View File

0
data/win2022/.gitkeep Normal file
View File

0
data/win2025/.gitkeep Normal file
View File

0
data/win2k/.gitkeep Normal file
View File

0
data/win7/.gitkeep Normal file
View File

0
data/win7e/.gitkeep Normal file
View File

0
data/win81/.gitkeep Normal file
View File

0
data/win81e/.gitkeep Normal file
View File

0
data/winxp/.gitkeep Normal file
View File

171
readme.md
View File

@ -70,6 +70,153 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
[![Download WinBoat](https://github.com/dockur/windows/raw/master/.github/winboat.png)](https://winboat.app) [![Download WinBoat](https://github.com/dockur/windows/raw/master/.github/winboat.png)](https://winboat.app)
## Multi-Version Setup 🗂️
This repository includes pre-configured compose files for all Windows versions with optimized resource profiles.
### Management Script (winctl.sh)
Use `winctl.sh` for easy container management:
```bash
# Check prerequisites and detected architecture
./winctl.sh check
# Start a container (interactive menu if no version specified)
./winctl.sh start win11
./winctl.sh start # Shows interactive menu
# View status of all containers
./winctl.sh status
# Stop containers (with confirmation)
./winctl.sh stop win11
./winctl.sh stop all # Stop all running
# View logs
./winctl.sh logs win11 -f
# List all available versions (shows [x86 only] on ARM64)
./winctl.sh list
./winctl.sh list desktop # Filter by category
# Real-time monitoring dashboard
./winctl.sh monitor
# Rebuild container (preserves data)
./winctl.sh rebuild win11
# Open web viewer in browser
./winctl.sh open win11
# Pull latest Docker image
./winctl.sh pull
# Show disk usage per VM
./winctl.sh disk
# Snapshot and restore VM data
./winctl.sh snapshot win11 before-update
./winctl.sh restore win11 before-update
# Clean up stopped containers
./winctl.sh clean
# Multi-instance support
./winctl.sh start winxp --new # Create winxp-1 with auto ports
./winctl.sh start winxp --new lab # Create winxp-lab
./winctl.sh start winxp --new lab --clone # Clone data from base
./winctl.sh instances # List all instances
./winctl.sh destroy winxp-lab # Remove instance
# ISO cache (skip re-downloads for new instances)
./winctl.sh cache download winxp # Download original ISO to cache
./winctl.sh cache list # Show cached ISOs
./winctl.sh start winxp --new # New instance uses cached ISO
./winctl.sh cache rm winxp # Remove cached winxp ISO
./winctl.sh cache flush # Clear all cached ISOs
# Full help (includes ARM64 info)
./winctl.sh help
```
### Quick Start (Manual)
```bash
# Run specific version
docker compose -f compose/desktop/win11.yml up win11
docker compose -f compose/legacy/winxp.yml up winxp
```
### Configuration
Two pre-configured env files with optimized defaults:
| File | RAM | CPU | Disk | Used By |
|------|-----|-----|------|---------|
| `.env.modern` | 8G | 4 | 128G | Win 10/11, Server 2016+ |
| `.env.legacy` | 2G | 2 | 32G | Win 7/8, Vista, XP, 2000, Server 2003-2012, Tiny |
Edit these files to customize:
```bash
# .env.modern or .env.legacy
RAM_SIZE=8G
CPU_CORES=4
DISK_SIZE=128G
USERNAME=docker
PASSWORD=admin
LANGUAGE=en
RESTART_POLICY=on-failure # Options: no, on-failure, always, unless-stopped
```
> 📖 See [WINCTL_GUIDE.md](WINCTL_GUIDE.md) for complete documentation, usage scenarios, and troubleshooting.
### Folder Structure
```
.env.modern # Modern system defaults (8G RAM)
.env.legacy # Legacy system defaults (2G RAM)
compose/
├── desktop/ # Win 11, 10, 8.1, 7
├── legacy/ # Vista, XP, 2000
├── server/ # Server 2003-2025
└── tiny/ # Tiny10, Tiny11
instances/ # Generated instance files
├── registry.json # Instance registry
└── *.yml # Instance compose files
data/ # VM storage (per-version folders)
├── win11/
├── winxp/
├── winxp-1/ # Instance data
└── ...
snapshots/ # VM data snapshots
├── win11/
└── ...
cache/ # ISO cache (skip re-downloads)
├── winxp/
└── ...
```
### Port Reference
| Version | Web UI | RDP |
|---------|--------|-----|
| win11 | 8011 | 3311 |
| win10 | 8010 | 3310 |
| win81 | 8008 | 3308 |
| win7 | 8007 | 3307 |
| vista | 8006 | 3306 |
| winxp | 8005 | 3305 |
| win2k | 8000 | 3300 |
| win2025 | 8025 | 3325 |
| win2022 | 8022 | 3322 |
| tiny11 | 8111 | 3111 |
## FAQ 💬 ## FAQ 💬
### How do I use it? ### How do I use it?
@ -122,6 +269,30 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
> [!TIP] > [!TIP]
> To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/). > To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
### How do I run on ARM64?
The `winctl.sh` script auto-detects your CPU architecture. On ARM64 systems (e.g., Apple Silicon, Ampere), only Windows 10 and 11 variants are supported:
| **Value** | **Version** |
|---|---|
| `11` | Windows 11 Pro |
| `11l` | Windows 11 LTSC |
| `11e` | Windows 11 Enterprise |
| `10` | Windows 10 Pro |
| `10l` | Windows 10 LTSC |
| `10e` | Windows 10 Enterprise |
To configure, set the ARM64 image in your `.env.modern` or `.env.legacy` file:
```bash
WINDOWS_IMAGE=dockurr/windows-arm
```
The script will automatically:
- Block unsupported versions with a clear error on `start`
- Show `[x86 only]` tags next to unsupported versions on `list`
- Display your detected architecture on `check`
### 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:

0
snapshots/.gitkeep Normal file
View File

3310
winctl.sh Executable file

File diff suppressed because it is too large Load Diff