The controller runs on the same Docker Engine 29.8.1 514 in the Ubuntu 26.04 225 WSL2 6 distribution as Docker. Its first start took two commands:
docker volume create l2-jenkins-home
docker run -d --name l2-jenkins --restart unless-stopped \
-p 127.0.0.1:32080:8080 -p 127.0.0.1:32500:50000 \
-v l2-jenkins-home:/var/jenkins_home jenkins/jenkins:lts-jdk21l2-jenkins-home cdd28bf10adfcb7c41a70355f8a0311bc57f474bd4d40ef3debeb9e64c7c3d5d
Publishing on 127.0.0.1 keeps an unsecured new controller unreachable from the network; 32500 is the inbound-agent port for agents outside Docker 514 ; --restart unless-stopped brings Jenkins 8,793 back after a Docker restart but not after a deliberate docker stop. The l2- prefix and 32xxx ports keep it apart from other containers on this shared Docker daemon; on your own machine, jenkins and 8080:8080 are usual. The log reported "Jenkins is fully up and running" 14 seconds after docker run; the controller then used 470 to 890 MiB of memory.
WSL2 forwards localhost ports to Windows, so a browser on the Windows desktop opens the controller at http://localhost:32080/. A check from PowerShell 55,538 on the Windows side:
curl.exe -s -o NUL -w "%{http_code}`n" http://localhost:32080/login
(Invoke-WebRequest -UseBasicParsing http://localhost:32080/login).Headers['X-Jenkins']200 2.568.3
Later sections added --network l2-jenkins-net so agents can reach the controller by name (Agents, Nodes and Labels) and swapped the moving tag for the pinned 2.568.3-lts-jdk21 (LTS vs Weekly and Persisting JENKINS_HOME). Build tools, Docker access and Node.js 2,131 go on agents, not here: the controller stays a plain, replaceable container.