v0.2.0 · MIT · Node 20+

Docker at terminal speed.

A lightweight TUI for Docker. Compose-aware stacks, live CPU and memory, streaming logs and a shell into any container — without leaving the terminal.

$ npx dockza
ornpm install -g dockza
◆ dockza v0.2.0 · docker 27.3.1 /var/run/docker.sock
cpu 31.1% mem 3.4 GiB 7 running 1 err 3 stop
VIEW
Stacks3
Containers11
Images24
Volumes9
Networks6
STACKS
acme-api6
storefront3
scratch2
STACK · SERVICESTATECPUMEMPORTS
acme-api [4 up] [1 err] [1 stop] live
└─ api ghcr.io/acme/api:1.9 RUN 4d 2h 18.6%28.4% 0.0.0.0:8080->8080/tcp
└─ worker ghcr.io/acme/api:1.9 RUN 4d 2h 7.4%31.2%
└─ postgres postgres:16-alpine RUN 4d 2h 1.2%12.8% 5432/tcp
└─ redis redis:7-alpine RUN 4d 2h 0.4%3.1% 6379/tcp
└─ migrate ghcr.io/acme/api:1.9 EXIT 1
└─ pgadmin dpage/pgadmin4:8.12 EXIT 0 · 3d
storefront [3 up] live
└─ web storefront-web:dev RUN 6h 12m 0.8%9.6% 0.0.0.0:3000->3000/tcp
└─ nginx nginx:1.27-alpine RUN 6h 12m 0.1%2.4% 0.0.0.0:80->80/tcp
└─ minio minio/minio:latest RUN 6h 12m 2.6%14.1% 0.0.0.0:9000->9000/tcp
scratch [2 stop]
↑↓nav detail llogs xshell sstop rrestart kkill /filter hhelp
last refresh 2s ago

Stacks — containers grouped by Compose project, with live counts per stack.

Five views, one keystroke apart.

Press 15 to jump, Tab to cycle. The rail stays put and keeps a live list of your stacks — click one to jump straight into it.

  • 1StacksCompose projects as a collapsible tree, with running / errored / stopped counts per project.
  • 2ContainersEvery container, flat: status and uptime, network, live CPU and memory, published ports.
  • 3ImagesRepository, tag, short ID, age, size — and whether anything is still using it.
  • 4VolumesName, driver, mountpoint, size, in-use status.
  • 5NetworksDriver, scope, short ID, attached containers, age, in-use status.

One container, one screen.

Enter opens the detail panel: uptime and restart policy, PIDs, published ports, networks and IP, live CPU and memory bars, disk I/O, mounts, and the full environment behind e. Every action stays one key away.

DETAIL api
apighcr.io/acme/api:1.9 · 3f9a1c2b4d5e
● running
Uptime:4d 2h
Restart:unless-stopped
PIDs:18
Ports:
0.0.0.0:8080->8080/tcp
Network:acme-api_default · 172.19.0.4
CPU[████░░░░░░░░░░░░░░░░]18.6%
MEM[██████░░░░░░░░░░░░░░]28.4%(582 MiB / 2.0 GiB)
DISKR:1.2 GiBW:340 MiB
MOUNTS
/srv/acme/uploads → /data/uploads (rw)
ENV (14) ▶ — press e to toggle
[s] Stop[r] Restart[k] Kill[x] Shell[l] Logs[e] EnvEsc close
eenv llogs s/r/kctrl ↑↓scroll Escclose
last refresh 1s ago

Logs that keep up.

l streams a container's log straight into the pane. stdout and stderr stay visually separate, f toggles follow, g and G jump to top and bottom, and a 5,000-line scrollback cap keeps a chatty container from running away with your memory.

LOGS api
2026-08-31T14:02:11.812Z info http server listening on :8080
2026-08-31T14:02:11.902Z info connected to postgres acme-api_default
2026-08-31T14:02:12.114Z info worker pool ready (4)
2026-08-31T14:02:18.441Z info GET /healthz 200 1.2ms
2026-08-31T14:02:19.006Z warn slow query 812ms on orders
2026-08-31T14:02:19.550Z info GET /api/orders 200 44ms
2026-08-31T14:02:20.907Z info POST /api/orders 201 61ms
2026-08-31T14:02:21.318Z error upstream timeout: payments
2026-08-31T14:02:22.004Z info retry succeeded: payments 340ms
2026-08-31T14:02:24.771Z info GET /api/orders/8812 200 9ms
ffollow gtop Gbottom ↑↓scroll Escclose
last refresh 1s ago

Deletes ask first — and refuse when they should.

Every destructive action goes through a confirm dialog. Images, volumes and networks that are in use can't be deleted at all, and the built-in bridge, host and none networks are protected outright. A network counts as in use whenever a container is attached — running or stopped.

NAMEDRIVERSCOPEIDCTNRSCREATEDSTATUS
acme-api_defaultbridgelocal9c1f4b7e2a0362 days ago● in use
storefront_defaultbridgelocal4d2e8a1b6c7336 hours ago● in use
bridgebridgelocal1a2b3c4d5e6f03 months ago○ unused
hosthostlocal7e5d9c0a1b2803 months ago○ unused
nonenulllocalb3f7a2c81d9003 months ago○ unused
scratch_defaultbridgelocal2c9e4f6a7b1508 days ago○ unused
Built-in network — cannot delete
last refresh 1s ago
Remove network?
scratch_default will be permanently deleted.
[y]Yes, proceed[n] Cancel
y:confirm n / Esc:cancel

Every key, on one card.

Press h anywhere in the app for the same reference, without leaving what you were doing.

Navigation

1 … 5Jump to a view
Tab / ⇧TabCycle views
hToggle help overlay
q / Ctrl+CQuit

Stacks

↑ ↓ / j kNavigate the tree
→ / ←Expand / collapse a stack
EnterToggle a stack, or open a service
/Filter by stack, service or image

Container actions

lOpen the log viewer
xShell in via a native terminal
s / r / kStop / restart / kill
S / dStart / remove a stopped one

Detail panel

eToggle environment variables
↑ ↓Scroll
EscClose

Log viewer

fToggle follow mode
g / GTop / bottom (G re-follows)
↑ / kScroll up, pausing follow

Images, volumes, networks

↑ ↓ / j kNavigate the list
dDelete an unused item
y / nConfirm / cancel

Talks to whatever daemon you have.

dockza finds the socket on its own. When it shouldn't, DOCKER_HOST decides — rootless Docker, podman, a named pipe, or a daemon on another machine.

DOCKER_HOST=unix:///run/user/1000/docker.sock dockza# rootless docker DOCKER_HOST=unix:///run/user/1000/podman/podman.sock dockza# podman DOCKER_HOST=tcp://10.0.0.5:2375 dockza# remote daemon DOCKER_HOST=npipe:////./pipe/docker_engine dockza# windows named pipe
Node.js 20+ 256-color or truecolor terminal macOS · Linux · Windows ~32 kB on disk

Try it in one line.

$ npx dockza
No daemon reachable? dockza says so and exits — it never guesses.