A k9s-style terminal UI for Docker & Docker Swarm.
Browse containers, services, compose projects, volumes and networks across every
Docker engine you have — local sockets and ssh:// remotes — without leaving
the terminal.
docker ps tells you what is. It doesn't help you navigate.
You end up juggling docker logs -f, docker stats, docker compose ls and a
pile of --context flags — across a laptop engine, a staging box and a prod
swarm. d9cker puts all of that behind one keystroke each, on any engine, over ssh.
| 🔀 Context switching | Every docker context — local socket, TLS, ssh:// remote. Switching never touches your global docker context use. |
| 🧠 Context-aware tabs | Services/Nodes appear only on swarm engines. Compose appears only where compose projects exist. The UI adapts to the engine you're on. |
| 📜 Live logs | Stream logs -f for any container or service. Follow, scrollback, in-log search (/), wrap, save to file. |
| 📊 Live stats | Per-container CPU %, memory, network and block I/O, PIDs — streaming, ~1/sec. |
| 🧩 Compose | Lists projects with their config-file paths. View the compose file (i) or open it in your editor (e) — over ssh for remote engines. |
| 🐝 Swarm | Services and nodes; drill into a service's tasks; scale replicas with + / -. |
| ⚡ Lifecycle | start / stop / restart / pause / unpause / remove, exec a shell, attach. |
| 🧹 Running-first | Containers default to running-only — exited ones are one key away (a) and dimmed when shown, so the list stays readable. |
| 🔎 Filter & sort | / filters rows; o / O sorts any column (size-aware: 1.5GB > 900MB); ← / → scrolls to reveal truncated values. |
| 🛡️ Safe by default | Every destructive action — delete, prune — asks first. |
Arch Linux (AUR)
paru -S d9cker-bin # or: yay -S d9cker-binPrebuilt binary — grab a tarball from Releases (Linux x86_64/aarch64, macOS Intel/Apple Silicon).
From source
git clone https://github.com/loyalpartner/d9cker
cd d9cker
cargo install --path .Then just:
d9ckerIt picks up your current docker context. No configuration.
Press ? at any time — help is global and overlays whatever you're looking at.
| Key | Action |
|---|---|
h / l, Tab / S-Tab |
previous / next tab (Tab works from any mode) |
1…8 |
jump straight to a tab |
j / k, g / G |
move selection · top / bottom |
u / d |
half-page up / down (PgUp/PgDn = full page) |
← / → |
scroll horizontally (reveal truncated values) |
/ |
filter rows · o / O sort column / reverse |
Enter |
Containers → logs · Services → tasks · Compose → containers · Contexts → switch |
t |
live stats (CPU / MEM / NET / BLK) |
p |
peek — every column of the selected row, untruncated |
i |
inspect · view compose file (Compose) |
e |
exec into container · edit compose file (Compose) |
a |
toggle all / running-only containers |
s / r / S |
stop / restart / start (:pause / :unpause too) |
+ / - |
scale a swarm service |
x |
delete (container / image / volume / network) — asks first |
: |
command mode (co, svc, nodes, ctx, prune, q) |
q / Ctrl-c |
quit |
Native API, not CLI scraping. d9cker talks to the Docker Engine through bollard, so listings, log streams and stats streams all ride one connection.
ssh contexts work exactly like they do in the CLI. bollard's ssh transport is
built on the openssh crate, which drives your
system ssh binary — so remote engines authenticate the same way
docker --context does, honouring ~/.ssh/config, ssh-agent, ProxyJump and
known_hosts.
The context store is read directly. bollard has no notion of Docker contexts, so
d9cker parses ~/.docker/contexts itself and resolves each one to an endpoint.
Compose without forking the CLI. docker compose ls is a CLI plugin, not an
Engine API — it aggregates com.docker.compose.* container labels client-side.
d9cker does the same aggregation natively, so the Compose tab costs one API call
rather than a subprocess on every refresh.
The few honest shell-outs. Interactive exec / attach (handing over the real
TTY), and reading/editing a compose file on a remote host — there is no Engine API
for the host filesystem, so that goes over ssh.
The GIF is generated, not hand-recorded:
docker compose -f demo/compose.yaml up -d # a small shop + api stack
docker compose -f demo/api.yaml up -d
vhs demo/demo.tape # -> demo/d9cker.gifEarly, but genuinely useful — built and tested against local engines, remote
ssh:// dev boxes and a production swarm.
Not done yet: pinning the first column while scrolling, and applying compose
changes (up -d) from the TUI.
MIT