A fast, keyboard-driven terminal user interface for Docker, written in Go.
docker-tui talks to the Docker Engine API directly over its socket, so it is a single static binary with no dependency on the Docker SDK.
- Browse containers, images, volumes, networks, builds, logs and Compose projects in seven tabs
- Start, stop, restart, kill, pause/unpause and remove containers, one at a time or in bulk
- Containers of a compose project are grouped under a foldable project row, like in Docker Desktop; actions on the row apply to the whole project
- Run Compose project up, down and rebuild, with live progress and
cancellation; open local Compose files and retain projects after
down - Follow container and build logs in real time, search with regex, toggle case sensitivity, inspect message details, and copy log lines or IDs
- Live stats: CPU (with history), memory, network and block I/O
- Process list of running containers, refreshed live
- CPU and memory of every running container in the list, summed per compose project
- Copy files to and from containers, like
docker cp - Pull images with live progress per layer, including private registries using Docker credential helpers; log in/out from the Images tab
- Build images with BuildKit and browse the build history with its logs, like the Builds view of Docker Desktop
- Built-in terminal for running containers, like the Exec tab of Docker Desktop, with scrollback; attach to the main process of a container; or a full-screen shell through the docker CLI
- Inspect any object as pretty-printed JSON
- Incremental filtering and column sorting
- Prune stopped containers, dangling images, unused volumes and networks
- Lists update instantly on daemon events, plus a periodic refresh
- Works with local sockets, Docker Desktop, Colima, rootless Docker and remote daemons over TCP
With Go 1.24.3 or newer:
go install github.com/zaryob/docker-tui@latestOr build from source:
git clone https://github.com/zaryob/docker-tui.git
cd docker-tui
make build
sudo make install # installs to /usr/local/bindocker-tui # connect using $DOCKER_HOST, the current context or the default socket
docker-tui -H tcp://10.0.0.5:2375
docker-tui -H ssh://deploy@build-server
docker-tui -context colima # use the endpoint of a docker CLI context
docker-tui -refresh 10s # refresh lists every 10 seconds (0 disables)
docker-tui -reset-preferences # reset saved filters/sorting/visibility and exit
docker-tui -versionThe daemon address is taken from, in order: the -H/-host flag, the
-context flag, the DOCKER_HOST environment variable, the docker CLI
context selected with DOCKER_CONTEXT or docker context use,
/var/run/docker.sock, and finally the per-user sockets of Docker Desktop
(~/.docker/run/docker.sock), Colima and rootless Docker.
Remote daemons are supported the same way as in the docker CLI:
tcp://addresses use TLS whenDOCKER_TLS_VERIFYis set, withca.pem,cert.pemandkey.pemfromDOCKER_CERT_PATH(default~/.docker), or when the selected context has TLS material.ssh://[user@]host[:port]connects throughsshand runsdocker system dial-stdioon the remote host, so your ssh keys, agent and~/.ssh/configapply. The remote host needs the docker CLI.
The built-in terminal talks to the daemon directly. The full-screen shell,
building images and the build history require the docker CLI (with
buildx) to be installed.
| Key | Action |
|---|---|
tab / shift+tab, 1–7 |
Switch between tabs |
↑/k, ↓/j |
Move the cursor |
pgup, pgdn, g, G |
Page up/down, jump to top/bottom |
/ |
Filter the list (enter keeps, esc clears) |
space / ctrl+a |
Mark the selected / all visible objects (esc clears) |
C |
Mark all containers of the selected compose project |
c |
Fold or unfold the selected compose project |
o / O |
Cycle sort column / reverse sort order |
r |
Refresh |
enter |
Show logs of the selected or marked containers |
t |
Show live stats of the selected container |
T |
List the processes of the selected container |
e |
Open a terminal in the selected container (ctrl+p ctrl+q or ctrl+] leaves) |
f |
Copy files between the selected container and this machine, like docker cp |
A |
Attach to the main process of the selected container (ctrl+p ctrl+q or ctrl+] detaches) |
E |
Open a full-screen shell with the docker CLI |
shift+↑/↓, ctrl+pgup/pgdn, mouse wheel |
In a terminal: scroll back through the output |
b |
In images and builds: build an image, or show the running build |
u |
In images: pull an image, or show the running pull (x cancels) |
ctrl+l / ctrl+o |
In Images: registry login / logout |
u / enter, x, b |
In Projects: up, confirm down, rebuild |
f |
In Projects: open a local Compose file |
x |
In the build output: cancel the build (esc keeps it running) |
enter |
In builds: show the logs of the build |
i |
Inspect the selected object |
y |
Copy the ID of the selected object |
s / x / R |
Start / stop / restart a container |
K |
Kill a running container |
p |
Pause or unpause a container |
a |
Toggle showing stopped containers |
d |
Remove the selected object |
P |
Prune unused objects of the current tab |
/, n / N |
In logs: search, next / previous match |
t |
In container logs: toggle timestamps |
esc |
Close logs, stats or inspect |
? |
Toggle full help |
q |
Quit |
Actions such as start, stop, restart, kill, pause and remove apply to all marked objects, or to the selected one when nothing is marked.
The Projects tab (7) discovers projects on the selected daemon. Operations need
Compose files on this machine; f opens a local file when daemon paths are
unavailable. Escape keeps an operation running; u reopens its output and x
cancels it. down preserves volumes and retains the project in the current
session and across restarts so it can be started again. Compose requires the Docker CLI plugin.
List filters, sorting and stopped-container visibility are saved automatically
in docker-tui/preferences.json under the platform's user configuration
directory (~/.config on Linux, ~/Library/Application Support on macOS).
Compose source paths are retained separately for each daemon/context.
docker-tui -reset-preferences resets list preferences while keeping project
sources. Missing or malformed preferences fall back to defaults with an error
message for malformed files. No registry credentials are stored in this file.
Private pulls reuse auths, credsStore and registry-specific credHelpers
from Docker's config.json (DOCKER_CONFIG is honored), plus credentials
provided through DOCKER_AUTH_CONFIG. Docker Hub aliases resolve to Docker's
standard credential key. In Images, ctrl+l opens login and ctrl+o opens
logout. Enter a registry hostname (and optional port), username, and password
or access token. Login/logout use the Docker CLI and its configured credential
store, as described in Docker's login documentation.
Passwords are masked, passed only through stdin, and excluded from status,
command output and preferences. Authentication failures explain how to log in
and retry the pull.
make test # run unit and race tests
go test -p 1 -race -count=1 -tags integration ./... # run real-daemon integration tests
make vet
make runIntegration tests skip an unavailable daemon locally. CI sets
DOCKER_TUI_INTEGRATION_REQUIRED=1 so missing prerequisites fail the run.
The lifecycle fixture uses alpine:3.21; Compose and authenticated registry
fixtures are isolated and cleaned up automatically. The registry fixture uses
an ephemeral loopback port in the local Unix-socket daemon's host network and
a temporary Docker config, leaving the user's credentials untouched.
Copyright (C) 2026 Suleyman Poyraz
docker-tui is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE for the full text.