Join us today!
Twincat4026, Running Inside dockerized Windows11, Access via Mstsc
I used to have VirtualBox for different "new" Windows Applications.
With , i assume after a bit of checking, the last updates of my Win11 Machine,
Virtual Box started to make Problems. The Memory started leaking and eats up to 99%
of the available Memory, then freezes more or less, no matter how much Ram i gave it.
In searching for Alternatives, i came across a docker Solution i will present,
perhaps somebody is interested in this.
https://github.com/dockur/windows
Here i found a Windows Image on Docker.
I created a DockerCompose File
services: windows: image: dockurr/windows container_name: win11EpsonRoboter environment: VERSION: "win11" RAM_SIZE: "16G" CPU_CORES: "8" DISK_SIZE: "71G" devices: - /dev/kvm cap_add: - NET_ADMIN ports: - 127.0.0.1:8007:8006 - 127.0.0.1:3391:3389/tcp - 127.0.0.1:3391:3389/udp stop_grace_period: 3m restart: on-failure volumes: - ./data:/storage - "~/Documents/projects:/storage/shared"
So i have a ContainerName, exposed Ports and a shared Folder with my Host.
A Powershell Script invokes the docker Container and tries to Remote into it with mstsc.
function Start-Win11EpsonRoboter { Write-Host "Script started" # Change directory to the location of your compose.yml file Set-Location "F:\Docker\win11-Epson" $containerName = "win11EpsonRoboter" $port = "3391" Write-Host "Checking if container is running..." # Check if the Docker container is already running $isRunning = docker ps --format "{{.Names}}" | Select-String -Pattern $containerName if ($isRunning) { Write-Host "Container is already running. Connecting via RDP..." Start-Process -FilePath "mstsc" -ArgumentList "/v:127.0.0.1:$port", "/f" -NoNewWindow -Wait -PassThru } else { Write-Host "Container is not running. Starting Docker and connecting via RDP..." # Start Docker Compose in the background docker compose up -d # Wait for the Docker container to be ready (adjust sleep time as needed) $retryCount = 0 $maxRetries = 5 $containerRunning = $false while ($retryCount -lt $maxRetries -and -not $containerRunning) { Start-Sleep -Seconds 15 $isRunning = docker ps --format "{{.Names}}" | Select-String -Pattern $containerName if ($isRunning) { $containerRunning = $true } $retryCount++ } if ($containerRunning) { Write-Host "Container is now running. Connecting via RDP..." # Prompt the user for credentials Start-Process -FilePath "mstsc" -ArgumentList "/v:127.0.0.1:$port", "/f", "/prompt" } else { Write-Host "Failed to start the Docker container." } } # Pause execution before closing the window Read-Host "Press Enter to exit..." } Start-Win11EpsonRoboter
in my Powershell $Profile, i made an Alias
Set-Alias epson 'C:\Users\Grabichler\Documents\projects\Scripts\Win11EpsonRoboter.ps1'
So now i can just type
epson
in my Powershell, and the docker starts in the background.
After 15s it tries to mstsc into it.
If the DockerContainer is already running, it mstsc immediatly into it.
I find it very convenient and nice way to be able to spin up new Windows Pc and i do not suffer
from performance Issues.
Now just as a Note(and because i hate the offensive behaviour of windows),
i tried this out on a linux machine.
Because the Windows runs in a Linux Docker (how has to be checked for yourself, because i do not understand it),
i can run it on Linux Docker and mstsc into the Win Machine,
which i find awesome.
So i can have a Linux Computer, which runs different windows container with programs, and in my case
it runs 1000x smoother and faster then VirtualBox.
- 17 Forums
- 265 Topics
- 932 Posts
- 2 Online
- 688 Members