lazydocker
Terminal UI for Docker and Docker Compose
lazydocker is an open-source terminal user interface for managing Docker containers, images, volumes, and Compose projects. It provides a fast keyboard-driven way to inspect self-hosted container stacks.
Key features
- Container management TUI
- Live logs and stats
- Compose project view
- Bulk actions
Pros & cons
Strengths
- Fast keyboard-driven UI
- Single small binary
- Compose project support
Trade-offs
- Terminal interface only
- No Kubernetes support
lazydocker replaces
Last reviewed Aug 26, 2026 · 943 words
SSH into any box running Docker, type lazydocker, and within a second every container, Compose service, image, volume, and network is on screen with live logs and CPU and memory graphs one keypress away. For a homelab operated by one person from a terminal, that is the entire container dashboard: no port to expose, no login page, no database, a single MIT-licensed Go binary that uses about 64 MB of RAM and can be deleted without a trace. It comes from the author of lazygit and shares its philosophy, which is that the common operations should each cost one key.
It is a cockpit for one host, not a control plane
lazydocker talks to one Docker socket at a time, has no users, and stores nothing. If you need a browser UI that a partner or a teammate can use, or a view across five hosts from one screen, this is the wrong tool and Portainer-style dashboards exist for that reason. If your household's need for "see the logs" is really "let someone else see the logs", Dozzle is the browser-based answer and pairs well with lazydocker rather than replacing it. What lazydocker is for is the operator: the person who would otherwise be typing docker compose logs -f --tail 200 immich-server for the fourth time today.
Install is one line; the docker group is the setup
curl -fsSL https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
sudo usermod -aG docker "$USER" # then log out and back in
lazydocker
brew install lazydocker on macOS and go install github.com/jesseduffield/lazydocker@latest are the other routes, and the install script doubles as the updater. The usermod line is the part people skip and then blame the tool for: lazydocker needs to read /var/run/docker.sock, and without group membership it opens to an empty screen or a permission error. Running it under sudo works but leaves your config in root's home, so fix the group instead. To install nothing at all, docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock lazyteam/lazydocker runs it from an image.
Ten keys cover the daily loop
The left column is a stack of panels (Project, Containers, Services, Images, Volumes, Networks); the right side is a main panel whose tabs change with the selection. Arrow keys or j/k move, tab cycles panels, and then:
[and]switch the main panel between logs, stats, config, top, and env for whatever is selectedenterfocuses the main panel so you can scroll the logs;esccomes backsstops,rrestarts,dremoves,aattaches a terminalEexecs a shell into the selected container, which alone is worth the installbopens the bulk menu on any panel: prune stopped containers, dangling images, unused volumesxopens the menu of every action available for the current panel, which is the manualqquits
The stats tab is the sleeper feature. It graphs CPU and memory per container over the time you have been watching, so the answer to "which container is eating the box" is a glance rather than a docker stats table you squint at. On the Services panel, the same keys act on Compose services, and the Project panel shows the compose file itself alongside the project's aggregated logs, which is the fastest way I know to confirm a docker compose up -d did what you meant.
Custom commands turn it into your runbook
The config file (~/.config/jesseduffield/lazydocker/config.yml on Linux) accepts custom commands bound to panels, with Go templates for the selection. Two I keep everywhere:
commandTemplates:
dockerCompose: docker compose
customCommands:
containers:
- name: shell
attach: true
command: "docker exec -it {{ .Container.Name }} /bin/sh"
services:
- name: pull and recreate
attach: true
command: "{{ .DockerCompose }} pull {{ .Service.Name }} && {{ .DockerCompose }} up -d {{ .Service.Name }}"
Press c on a container or service and pick from the list. The dockerCompose template line is for hosts with only Compose v2 (docker compose, no hyphen), which is every modern install. The "pull and recreate" command is the one-service-at-a-time update I trust more than blanket auto-updaters; the reasoning is in container updates without fires. If your stacks follow the layout in Compose patterns for the homelab, lazydocker's Project panel maps onto one directory per stack without any configuration.
Over SSH it is native, and it can reach remote hosts too
Because it is a terminal program, lazydocker works over SSH exactly as it does locally, and inside tmux or zellij it becomes the persistent "ops tab" I leave open on every server. It also honours the Docker client's environment, so DOCKER_HOST=ssh://user@nas lazydocker from a laptop drives a remote daemon over SSH without installing anything on the NAS beyond Docker. That plus a Tailscale tunnel covers the "manage from anywhere" case that people usually buy a web dashboard for. The limits are the ones the catalogue lists: no Kubernetes, terminal only, and it will not edit compose files, schedule anything, or notify you.
What I'd do
Install it on every Docker host the day the host is built, add the two custom commands above, and stop opening a browser to check why a container restarted. Keep Dozzle alongside for anyone who needs logs without a shell. If you are choosing between lazydocker and a web dashboard for a single-operator homelab, choose lazydocker; the dashboard is another service to update, and this is a binary that is already there.
Compare lazydocker
2 head-to-head comparisons.
Similar developer tools & git apps
Excalidraw
Developer Tools & GitVirtual hand-drawn style whiteboard
Replaces Miro
lazygit
Developer Tools & GitSimple terminal UI for Git commands
Replaces GitKraken, Sourcetree
Hoppscotch
Developer Tools & GitOpen-source API development ecosystem
Replaces Postman, Insomnia
json-server
Developer Tools & GitFull fake REST API from a JSON file in seconds
Replaces Mockoon, Postman Mock
Strapi
Developer Tools & GitLeading open-source headless CMS
Replaces Contentful
NocoDB
Developer Tools & GitOpen-source Airtable alternative
Replaces Airtable