WSLC Manager for VS Code
Manage WSL containers (wslc.exe) directly from the VS Code sidebar: run, start, stop, exec into and inspect containers, take snapshots and duplicate them, organize them into groups, and manage images, volumes and networks.
Note: This is a community-developed extension and is not affiliated with, endorsed by, or supported by Microsoft. "Windows Subsystem for Linux" and "WSL" are trademarks of Microsoft Corporation.
Getting started
- Make sure your WSL includes WSL containers: run
wslc version in a terminal. If the command is missing, update WSL with wsl --update.
- Click the WSLC icon in the Activity Bar.
- Use Pull Image in the Images view, or Run New Container (the + button in the Containers view) to pick an image and start a container.
Features
Click the WSLC icon in the Activity Bar. It has four views: Containers, Images, Volumes and Networks. The views update as soon as something changes — including changes made with wslc on the command line — and you can select several items at once (Ctrl/Shift+click) to start, stop, restart, kill or remove them together.
Containers view
Containers are listed with running ones first, with their status and IP address (Up 5 minutes · 172.16.10.2, Exited (0) 2 hours ago, …). Running containers have a green icon.
Expand a container to see its status, image, published ports, each network with the container's address on it (e.g. Network: mynet — 172.16.10.2/24 (gateway 172.16.10.1)), volumes and ID. For a running container it also shows a live CPU / memory / PID snapshot. Click a published TCP port to open it in the browser.
| Action |
Description |
| Run New Container |
Pick an image (or enter a reference), then optionally set a name, port mappings, environment variables, a command and advanced options (see below). The image is pulled with progress if it is missing |
| Run Interactive Container |
Start a new container from an image and land directly in its shell in a terminal |
| Start / Stop / Restart / Kill / Remove |
Lifecycle operations, for one or several selected containers. Kill and Remove ask for confirmation |
| Remove Stopped Containers |
Prune all stopped containers |
| Open Shell in Container |
wslc exec -it into the container (bash if available, otherwise sh) |
| Attach to Container |
Attach a terminal to the container's main process |
| Connect VS Code to Container |
Open a new VS Code window attached to the container through the Dev Containers extension (see below) |
| Show / Follow Container Logs |
Show the last N lines in an output channel, or stream them in a terminal |
| Inspect Container |
Open the inspect JSON in an editor |
| Open Port in Browser |
Open a published TCP port at http://localhost:<port> |
| Connect to / Disconnect from Network |
Attach the container to another network, or detach it |
| Create Snapshot / Restore Snapshot |
Save the container's files and settings at this moment, and go back to that state later. See below |
| Duplicate Container |
Make an identical copy: the filesystem as it is now (including changes made inside the container) plus its settings — command, environment variables, mounts, networks, CPU / memory limits, working directory, user and -it. The copy gets a new name and free host ports (suggested automatically). See below |
| Copy Container ID |
Copy the ID to the clipboard |
Rarely needed actions are available from the Command Palette only (WSLC Manager: …), to keep the context menu short. Mounting a Windows folder (-v) or using Duplicate Container usually covers the same needs:
| Command |
Description |
| Copy to WSL Container... |
Copy Windows files into a running container |
| Copy from WSL Container... |
Copy a file or folder out of a container to a Windows folder |
| Export Container Filesystem... |
Save the container's filesystem (files only — no settings, no volume contents) as a tar archive. A running container is stopped for the export and started again afterwards (wslc can only export stopped containers) |
Groups (optional)
Organize containers into groups — for example per project. Groups are optional: until you create one, the view is a flat list, and containers that aren't in a group stay at the top level below the groups.
- Create Group (folder button in the view title), then Move to Group... from a container's context menu (works with several selected containers), or drag containers onto a group. Drag a container onto empty space to take it out of its group.
- Start All in Group / Stop All in Group (inline buttons on the group) start or stop its members in one go.
- Rename Group and Delete Group. When deleting, choose Delete Group Only (its containers just move out of the group) or Delete Group and N Containers (the containers are removed too; running ones are force-stopped, volumes are kept).
- Groups are stored by VS Code for this extension, not in wslc, and members are remembered by container name. A duplicated container joins the original's group; a removed container leaves its group.
Creating containers
- Checked before creation: names and host ports that are already in use are rejected while you type. Ports are checked against other running containers (named in the message), other programs on Windows, and Windows' reserved port ranges. The same check runs before Start, because a stopped container's port may have been taken in the meantime.
- Shell images keep running: images whose command is an interactive shell (e.g.
/bin/sh in alpine, /bin/bash in ubuntu) are started with -i -t automatically. Without it they would exit at once, whatever ports you publish. If the extension can't tell in advance and the container exits immediately, you can recreate it with Keep Running (-it).
- Advanced options (last step, all optional): mount volumes or Windows folders (
-v), choose a network, remove the container when it stops (--rm), limit CPUs and memory, use all GPUs, and set the working directory or user.
Snapshots and duplicating
wslc has no snapshot or commit feature, so the extension builds one:
- Create Snapshot... saves the container's files as an image named
<container>-snapshot:<name> (the name is optional; it defaults to the date and time). Image names must be lowercase, so a container name with uppercase letters, _ or . gets a short hash added (for example Web → web-72645431-snapshot) to keep its snapshots separate from similarly named containers. The settings the container had at that moment — command, environment, ports, mounts, networks, CPU / memory limits, working directory, user, -it — are recorded by the extension.
- Expand a container to see its Snapshots. Restore Snapshot removes the container and creates it again from the snapshot with the same name, group and recorded settings. Create Container from Snapshot... makes a separate container instead (also available on snapshot images in the Images view, even after the original container is gone). Delete Snapshot removes the image; it can't be deleted while a container created from it exists.
- Duplicate Container takes a snapshot and starts a copy from it under a new name with free host ports. The copy joins the original's group.
When the container is running, you choose how to save it:
| Choice |
How |
Effect on the container |
| Stop and Snapshot / Duplicate (official) |
Stops it, wslc container export, starts it again, wslc image import — wslc can only export a stopped container |
Stopped for a few seconds; processes running in it restart |
| … Without Stopping (Unofficial) |
docker commit on the container engine inside the wslc session, called through wslc system session run |
Keeps running (paused for a moment). Not supported by wslc — it relies on wslc internals and may stop working in a future version |
A stopped container is always saved the official way. A container created with Remove when stopped (--rm) would be deleted by stopping it, so it can only be saved without stopping, and Export Container Filesystem refuses it; restored and duplicated copies keep --rm. Either way, only files are saved (including software installed after the container was created). Running processes, logs output and the contents of volumes or mounted folders are not part of a snapshot; restored and duplicated containers use the same volumes and folders as the original.
Images view
| Action |
Description |
| Pull Image |
Pull an image by reference, with progress |
| Run New Container / Run Interactive Container |
Start a container from the selected image |
| Tag Image |
Add a new reference to an image |
| Push Image |
Push an image to its registry, with progress |
| Log In / Log Out |
Sign in to a registry (the password is passed to wslc through standard input, not the command line) |
| Save Image to File / Load Image from File |
Export an image to a tar archive and load it back |
| Inspect Image / Copy Image Reference |
Open the inspect JSON, or copy repository:tag |
| Remove Image |
Remove one or several images. Images still used by containers are skipped, with the containers named; for other failures a force removal is offered |
| Prune Unused Images |
Remove dangling images only, or all images not used by any container |
Images used by at least one container have a green icon.
Volumes view
Volumes keep data across container re-creation. Expand a volume to see which containers use it.
| Action |
Description |
| Create Volume |
Create a named volume with the guest (default) or vhd driver |
| Remove Volume |
Remove one or several volumes. Volumes still used by a container are reported instead of being removed |
| Prune Unused Volumes |
Remove unused anonymous volumes, or all unused volumes |
| Inspect Volume / Copy Volume Name |
Open the inspect JSON, or copy the name |
Networks view
Each network shows its driver and subnet (e.g. bridge · 172.16.10.0/24 · 1 container). Expand it to see its containers with their IP addresses; right-click a container there to disconnect it. The built-in bridge, host and none networks cannot be removed.
| Action |
Description |
| Create Network |
Create a network with an optional subnet, and optionally make it internal (no external access) |
| Connect to Network |
Connect a container to the selected network |
| Remove Network / Prune Unused Networks |
Remove networks you created |
| Inspect Network |
Open the inspect JSON in an editor |
Every action is also available from the Command Palette (WSLC Manager: …). When started from the palette, you pick the target from a list.
What "Connect VS Code" changes on your machine
Dev Containers needs to use wslc.exe instead of Docker. The first time you connect, the extension asks before it changes the global setting dev.containers.dockerPath to the wslc path. This affects every Dev Containers session, including Docker Desktop. The previous value is saved, and WSLC Manager: Restore Dev Containers Docker Path puts it back.
For older wslc builds whose inspect output has no Config.Image, the extension also writes an empty per-container attach configuration (nameConfigs/<container>.json) into the Dev Containers extension's storage, to prevent it from crashing. This is skipped when Config.Image is present.
Good to know
- Published ports are local by default. wslc binds
-p 8080:80 to 127.0.0.1, so only this PC can reach it. Use 0.0.0.0:8080:80 (or the session.defaultBindingAddress wslc setting) to publish on all addresses.
- Containers can reach Windows at
host.wslc.internal, which points to the Windows loopback address.
- No host networking. The built-in
host network is listed, but wslc rejects it; use a bridge network with published ports instead.
- Groups and snapshot settings are stored by VS Code for this extension on this PC — nothing is written to wslc. Snapshot images themselves are regular wslc images.
- Snapshots are not backups. They live in the same wslc session storage and don't include volume contents. Use Save Image to File to keep a copy elsewhere.
Settings
| Setting |
Default |
Description |
wslcManager.wslcPath |
"" |
Path to wslc.exe. Leave empty to use the one on PATH. Takes effect after reloading the window |
wslcManager.refresh.useEvents |
true |
Watch wslc events to refresh the views as soon as something changes. Only runs while a view is visible |
wslcManager.autoRefreshInterval |
30 |
Periodic refresh in seconds (5–300), which also updates CPU / memory figures. Only runs while a view is visible |
wslcManager.run.autoInteractive |
true |
Start containers whose command is an interactive shell with -i -t so they keep running |
wslcManager.showInlineActions |
true |
Show inline buttons (shell, start, stop, run, disconnect) on tree items |
wslcManager.logs.tail |
500 |
Number of log lines shown by "Show Container Logs" |
Requirements
- Windows 11 (or Windows 10 with a recent WSL)
- A WSL version that includes
wslc.exe (tested with WSL 3.0.1). If it is missing, the views show a link to update WSL
- VS Code 1.85 or later
- Optional: the Dev Containers extension for "Connect VS Code to Container"
WSL Manager manages WSL distributions. WSLC Manager focuses on WSL containers and can be installed alongside it.
Feedback
Please report problems and ideas on GitHub Issues.
License
MIT
| |