Repository navigation
v2 Containers
Docker, Podman and WSL's own containers on this machine, in one list. The engine owns them; WSL Manager shows them and drives their lifecycle.
Containers are deliberately not instances. A WSL distro or a macOS VM is a machine the app owns for its whole life; a container is one process tree spawned from an image that someone else's engine owns. They keep their own screen, and "delete" means something much cheaper here than it does on the home screen.
- Turning it on
- Engines
- Creating a container
- What the screen does
- WSL's engine in detail
- From the AI assistant and MCP
- Troubleshooting
Containers is an experimental destination, so it is off until you ask for it:
Settings → Experimental features → Containers
The entry then appears in the navigation pane. Experimental means the screen works but is still settling — please report anything odd.
The app drives an engine's command-line tool, so anything that speaks Docker's grammar fits. Three are probed, in this order:
| Engine | Command | Where | Notes |
|---|---|---|---|
| Docker | docker |
Windows, macOS | Docker Engine or Docker Desktop |
| Podman | podman |
Windows, macOS | Including podman machine
|
| WSL container | wslc |
Windows only | Built into WSL itself — nothing to install, no daemon to start |
Settings → Container engine picks which one the screen and the AI tools drive. Automatic takes Docker if it is installed, otherwise Podman, otherwise WSL's own engine.
WSL's engine ships inside WSL from version 2.9.3 and is generally available
in 3.0.1. If wslc is missing, update WSL itself:
wsl --update
wslc versionIt is only probed on a Windows host (or a Windows machine reached through Remote WSL) — on a Mac it cannot exist, so the app does not spend a process launch looking for it.
WSL Manager does not create containers, and that is on purpose. It is a front end for an engine's lifecycle commands — the same reason there is no "create container" button for Docker either. Containers you create with any of the three engines show up on the screen by themselves; hit Refresh if you made one while the screen was open.
Create them with the engine's own CLI. For WSL's built-in engine that is
wslc run, which takes Docker's flags:
# Pull nothing by hand — run fetches the image if it is missing
wslc run -d --name web -p 127.0.0.1:8080:80 nginx
# A throwaway shell, removed again when you leave it
wslc run --rm -it alpine sh
# Build from a Dockerfile in the current directory, then run it
wslc build -t myapp .
wslc run -d --name myapp -e DEBUG=1 -v mydata:/data myappwslc run [options] <image> [command] [arguments...], with the flags you would
expect:
| Flag | Meaning |
|---|---|
-d, --detach
|
Run in the background — what you want for anything long-lived |
--name |
Name the container, so the list shows something readable |
-p, --publish
|
Publish a container port to the host ([host-ip:]host-port:container-port) |
-P, --publish-all
|
Publish every exposed port to random host ports |
-v, --volume
|
Bind a volume into the container |
--mount, --tmpfs
|
Attach a filesystem mount, or a tmpfs at a path |
-e, --env, --env-file
|
Environment variables, inline or from a file |
-it |
Interactive, with a TTY — for a shell rather than a service |
--rm |
Remove the container once it exits |
-u, --user, -w, --workdir
|
User and working directory for the process |
-m, --memory, --cpus, --gpus
|
Resource limits, and GPU passthrough (--gpus all) |
--network, --ip, --dns
|
Networking |
--health-cmd and friends |
Health check command, interval, retries, timeouts |
--pull |
always / missing / never (default missing) |
Other verbs wslc has that the app does not wrap: create (make a container
without starting it), pull, push, build, import, load, export,
rmi, kill, attach, events, info, registry / login / logout for
registry credentials, and settings, which opens the engine's own config file
in your editor. Run wslc <command> --help for any of them.
For Docker and Podman the commands are the same with the binary swapped —
docker run -d --name web -p 8080:80 nginx.
Once a container exists, everything on the screen works the same whichever engine owns it:
| Action | What it does |
|---|---|
| Refresh | Re-read the list from the engine |
| Start / Stop | Toggle on the row, depending on the current state |
| Restart | Stop and start again |
| Logs | The container's output, in a dialog |
| Delete | Removes the container and everything written inside it that is not in a volume. The image is kept |
Each row shows the name, the image it came from, its state and status, and any published ports.
Delete is the one destructive action here — and it is much narrower than
deleting an instance. A container is cheap to recreate from the same run
command; anything you need to survive it belongs in a volume.
wslc accepts Docker's spellings as aliases (ps, logs, inspect, stop,
volume ls, network ls, rm --force, --version), so almost nothing about
the screen changes when it is the active engine. A few differences are worth
knowing if you also use the CLI directly:
-
--formatis a vocabulary, not a template language. It takesjsonortable— a Go template like{{.ID}}is not accepted. The app asks for--format json, whose keys andStatevalues stay English whatever your Windows display language. -
The table output is localised. On a German Windows,
wslc listprintsCONTAINER-ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN. That is why the app parses the JSON and only ever shows the table as text. -
--sincewants an instant, not a duration.--since 15mis read as epoch 15 — "since 1970" — with no error. Use an epoch or an RFC 3339 timestamp; the app converts durations against the clock before passing them on. -
statstakes a single sample and rejects--no-stream. -
topandsystem dfdo not exist. The app says so by name rather than running a command that answers with a usage dump.
With the Containers switch on, the AI assistant and the MCP server gain the container tools, against whichever engine is active (or one named per call):
container_engines, container_list, container_start, container_stop,
container_restart, container_remove, container_logs, container_exec,
container_inspect, container_images, container_volumes,
container_networks, container_stats, container_processes,
container_disk_usage.
Reads an engine genuinely lacks are refused by name — container_processes and
container_disk_usage on wslc, for instance. As on the screen, none of
these creates a container; container_exec runs a command inside one that is
already running.
"No container engine found." On Windows, WSL 2.9.3 and later include the
wslc engine — run wsl --update to get it. Otherwise install Docker or
Podman, make sure its command is on your PATH, and hit Refresh. The app
resolves each engine through PATH, so a tool installed only inside a WSL
distro will not be found.
"The container engine did not answer." The command was found but failed.
With Docker that is usually the daemon not running; start Docker Desktop or the
service and refresh. wslc has no daemon, so here it more often means WSL
itself needs wsl --update.
The list is empty but containers are running. Check Settings → Container
engine — a container created with Docker is invisible to wslc and the other
way round. Each engine keeps its own containers. Switch the engine, or set it
back to Automatic.
A container is missing after a reboot. Nothing here sets a restart policy;
wslc run has no --restart flag. Start it again from the screen.