Skip to content

Docker container browser

mnml-virt-docker is a terminal browser for Docker. Containers, images, volumes, networks, per-project compose services — tail logs, exec a shell, start / stop / remove, cross-sibling handoff to mnml-aws-ecr for ECR-hosted images. Runs standalone in any terminal. Shells out to docker; no SDK dep, no API tokens — Docker’s socket is the auth boundary.

First sibling in the mnml-virt-* family (planned: mnml-virt-k8s, mnml-virt-podman, mnml-virt-colima).

┌─ docker ──────────────────────────────────────────────────────────────┐
│ ▸1.containers (8) 2.images (47) 3.volumes (12) 4.networks (5) │
└───────────────────────────────────────────────────────────────────────┘
┌─ containers (8) ──────────────┐ ┌─ inspect ───────────────────────────┐
│ ▸ ● redis redis:7│ │ State running │
│ ● postgres-pg pg:16 │ │ Status Up 2 hours │
│ ○ example-api acme… │ │ Ports 6379/tcp │
│ ↺ web-1 myorg/…│ │ │
└───────────────────────────────┘ └─────────────────────────────────────┘
1-9 tab · l logs · e exec · s/S stop/start · R rm · L → ECR · r · q
Terminal window
cargo install --git https://github.com/chris-mclennan/mnml-virt-docker mnml-virt-docker
mnml-virt-docker --install

Docker installed + running — Docker Desktop or any other Engine build. TUI shells out to docker, never opens the daemon socket directly. Whichever context docker is configured for is what this sees. v0.1 supports the default context only.

If the daemon isn’t running, the body shows a “Docker daemon not running” notice. Start it, press r, reconnect.

Terminal window
docker version # verify CLI reaches daemon
mnml-virt-docker # first-run scaffolds config

~/.config/mnml-virt-docker/config.toml:

refresh_interval_secs = 60
[[tabs]]
name = "containers"
kind = "containers"
[[tabs]]
name = "images"
kind = "images"
[[tabs]]
name = "volumes"
kind = "volumes"
[[tabs]]
name = "networks"
kind = "networks"
# Per-project compose (opt-in — no default since project dir is per-user)
# [[tabs]]
# name = "myapp"
# kind = "compose"
# project_path = "/Users/me/Projects/myapp"
kindWhat it showsRequired
containersEvery container in the local engine
imagesEvery image
volumesEvery volume
networksEvery network
composeServices in a compose project (compose.yaml / compose.yml / docker-compose.yml)project_path

Container-state glyph: green running · gray exited / red dead · yellow restarting · yellow paused · · gray created.

ChordAction
1-9 / TabSwitch tabs
/ k, / j, PgUp / PgDn, g / GNavigate (each move re-runs inspect for the new focus, lazy)
oOpen Docker Desktop (macOS only; toast on other OSes)
yYank focused item’s full ID / name
lTail logs for the focused container
eExec a shell (/bin/bash if available, else /bin/sh)
s / SStop / start the focused container
RRemove focused item (y confirms)
LCross-sibling jump — if focused image is an ECR URL (<acct>.dkr.ecr.<region>.amazonaws.com/…), spawn mnml-aws-ecr --region <region>
rRefresh + re-probe daemon if offline
q / Esc / Ctrl+CQuit
Terminal window
mnml-virt-docker
:term mnml-virt-docker

Or <leader>iK after mnml-virt-docker --install.

github.com/chris-mclennan/mnml-virt-docker. MIT.