A native Linux Docker Desktop GUI — manage containers, images, volumes and networks visually.
No VM. No subscription. No terminal required.
Download · Screenshots · Documentation · Contributing · Roadmap
DockerLens is a free, open-source, native Linux desktop application that gives you a beautiful, visual interface to manage your Docker environment — the same polished experience Windows and Mac users get with Docker Desktop, but built specifically for Linux.
It connects directly to your Docker Engine via the Unix socket (/var/run/docker.sock). No virtual machine. No background service. No paid subscription. Just install Docker Engine via your package manager, open DockerLens, and start managing your containers visually.
| Problem with Docker Desktop on Linux | DockerLens Solution |
|---|---|
| Runs a VM even though Linux doesn't need one | Connects directly to Docker Engine — zero overhead |
| Requires $21/month for team use | Free forever — MIT licensed |
| Broken system tray on GNOME and other DEs | Properly implemented for all desktop environments |
| Conflicts with an existing Docker Engine install | No conflict — uses your existing installation |
| Doesn't feel native (Wayland / X11 issues) | Tauri 2.0 — native support for both |
host.docker.internal doesn't work on Linux |
Auto-injected on every container create |
These images are UI design mockups from docs/Design/samples/. They show the target v1.0 experience; the shipping app will converge on this look as features land.
| Onboarding — welcome | Dashboard — system overview |
|---|---|
![]() |
![]() |
| Containers — overview & stats | Containers — inspect (JSON) |
|---|---|
![]() |
![]() |
| Volumes | Suggestions |
|---|---|
![]() |
![]() |
More samples live in docs/Design/samples/.
Containers
- List all containers with live status badges (running 🟢 / stopped 🔴 / paused 🟡)
- Start, stop, restart, pause and delete containers from the UI
- Real-time CPU, memory and network I/O graphs
- Live log streaming with colour-coded
INFO/WARN/ERRORlines - Exec into any container — full terminal session inside the app (xterm.js)
- Container detail view: ports, environment variables, mounts, labels, image
Images
- List all local images with size, tags and creation date
- Pull any image with real-time layer-by-layer progress
- Delete unused images
- Run a container from any image with a 5-step wizard (name → ports → env → volumes → restart policy)
Volumes
- List all volumes with size, driver and mount path
- See which containers are using each volume
- Create and delete volumes
Networks
- List all networks with driver, subnet and gateway info
- See all containers connected to each network
- Create and remove custom networks
Settings & Daemon Control
- Start, stop and restart the Docker daemon from the UI — same as Windows/Mac Docker Desktop
- Toggle "Start Docker on Login" (
systemctl enable docker) - Native OS privilege escalation via Polkit — no sudo in a terminal
- Rootless Docker supported — no password prompt needed
- Auto-reconnect if the daemon restarts
- Socket path override (supports rootless Docker and custom paths)
Onboarding
- First-run wizard with automatic Docker Engine detection
- Distro-specific install instructions (Ubuntu, Fedora, Arch, openSUSE)
- Docker group permission check with guided fix
- Optional sign-in with GitHub or Google via Supabase for settings sync
System Tray
- Minimize to tray — app keeps running in the background
- Tray icon reflects daemon state (green = running, red = stopped)
- Container crash notifications
- Quick container count in tray menu
Suggestions Engine
- Smart recommendations: stopped containers, unused images, unused volumes, CPU spikes, available updates
- Dismiss individually — resolved suggestions are tracked
| Feature | Version |
|---|---|
| Docker Compose UI — file picker, service graph, up/down/logs | v1.1 |
| Docker Hub & GHCR registry browser | v1.2 |
| Multi-host Docker context support | v1.2 |
| Image vulnerability scanning (Trivy) | v1.3 |
| Kubernetes cluster management | v2.0 |
| Extensions marketplace | v2.0 |
| Distribution | Package Format | Docker Install |
|---|---|---|
| Ubuntu 22.04 / 24.04 | .deb · AppImage |
apt install docker.io |
| Debian 12 | .deb · AppImage |
apt install docker.io |
| Fedora 39 / 40 | .rpm · AppImage |
dnf install docker-ce |
| Arch Linux / Manjaro | AUR · AppImage | pacman -S docker |
| Linux Mint 21 | .deb · AppImage |
apt install docker.io |
| Pop!_OS | .deb · AppImage |
apt install docker.io |
| openSUSE Tumbleweed | .rpm · AppImage |
zypper install docker |
Universal fallback: The
.AppImageruns on any Linux distribution with glibc 2.31+ (kernel 5.x+) — no installation required.
chmod +x DockerLens.AppImage
./DockerLens.AppImagesudo apt install ./dockerlens_amd64.debsudo dnf install ./dockerlens.x86_64.rpm
# or
sudo zypper install ./dockerlens.x86_64.rpmyay -S dockerlens
# or
paru -S dockerlensflatpak install flathub io.dockerlens.DockerLensDockerLens is a GUI frontend — it does not install or bundle Docker Engine. You need to have Docker Engine installed on your system first.
# Ubuntu / Debian
sudo apt install docker.io
sudo usermod -aG docker $USER # add yourself to the docker group
newgrp docker # apply group change without re-login
# Fedora
sudo dnf install docker-ce
sudo systemctl start docker
sudo usermod -aG docker $USER
# Arch Linux
sudo pacman -S docker
sudo systemctl enable --now docker
sudo usermod -aG docker $USERAfter adding yourself to the
dockergroup, log out and back in for the change to take effect. DockerLens will guide you through this automatically on first launch.
| Layer | Technology | Purpose |
|---|---|---|
| App framework | Tauri 2.0 | Native window, OS APIs, IPC bridge |
| Backend | Rust + Tokio | Async Docker API client, system integration |
| Docker client | bollard crate |
Pure Rust Docker Engine HTTP client |
| Frontend | React 18 + TypeScript | All visual components |
| Styling | Tailwind CSS + shadcn/ui | Design system |
| State | Zustand | Lightweight global store |
| Terminal | xterm.js | Exec into containers |
| Charts | Recharts | CPU / RAM / network graphs |
| Auth | Supabase | Optional GitHub / Google sign-in + settings sync |
| Packaging | Tauri bundler | AppImage · .deb · .rpm |
- Rust 1.75+
- Node.js 20 LTS (via fnm recommended)
- pnpm 10+
- Docker Engine installed and running on your Ubuntu host
sudo apt install \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
curl \
wget \
filegit clone https://github.com/cm-collins/dockerlens.git
cd dockerlens
pnpm install # install frontend dependencies
pnpm tauri dev # starts Vite + compiles Rust + opens native windowHot reload is enabled — React changes reflect instantly. Rust changes trigger a recompile.
pnpm tauri build
# Output: src-tauri/target/release/bundle/
# → .deb, .rpm, .AppImageTarget layout as the app grows (some paths are not created yet):
dockerlens/
├── src/ # React + TypeScript frontend
│ ├── components/ # UI components (add as needed)
│ ├── pages/ # Screen-level components
│ ├── store/ # Zustand state slices
│ ├── hooks/ # Custom React hooks
│ └── lib/ # Tauri invoke() helpers
│
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── main.rs # Tauri app bootstrap
│ │ ├── commands.rs # All #[tauri::command] exports
│ │ ├── docker/ # Docker API module
│ │ │ ├── containers.rs
│ │ │ ├── images.rs
│ │ │ ├── volumes.rs
│ │ │ ├── networks.rs
│ │ │ ├── exec.rs # WebSocket TTY exec
│ │ │ └── streams.rs # Log tail + stats stream
│ │ └── system/ # OS integration
│ │ ├── socket.rs # Socket auto-detection
│ │ ├── tray.rs # System tray
│ │ ├── daemon.rs # Daemon start/stop/restart
│ │ ├── notifications.rs
│ │ └── config.rs # TOML config
│ ├── Cargo.toml
│ └── tauri.conf.json
│
├── scripts/ # Automation scripts
│ ├── bump-version.sh # Atomic version bump across all 3 files
│ └── db/ # Supabase SQL migrations
│ ├── 001_schema.sql # Tables, constraints, indexes
│ ├── 002_rls.sql # Row-level security policies
│ ├── 003_functions.sql # Functions, triggers, automation
│ ├── 004_seed_dev.sql # Dev seed data — never run in production
│ ├── validate-migrations.sh
│ ├── apply-migrations.sh
│ └── rollback-migrations.sh
│
├── docs/ # Project documentation (see Documentation below)
│ ├── Requirements/ # PRD + TRD
│ ├── Archtecture/ # ARCHITECTURE.md + diagrams (PNG/PDF)
│ ├── Design/ # Design system, screens, mockups, samples
│ └── best-practices/ # Per-tech contributor guides
│
├── package.json
└── vite.config.ts
Add tailwind.config.ts and related tooling when you wire up Tailwind (see docs/Requirements/TRD.md).
In-repo docs live under docs/. Highlights:
| Area | Documents |
|---|---|
| Requirements | Product requirements (PRD) · Technical requirements (TRD) |
| Architecture | Architecture overview · diagrams: system overview, screen map, user flows (PDFs in the same folder) |
| Design | Design system · Screen specs · Mockup notes · UI samples |
| Best practices | Index — Tauri, Rust, React/TypeScript, Supabase, GitHub Actions, and general guidelines |
| Database | Migrations guide — Supabase SQL migrations, execution order and rules |
Contributions are welcome! DockerLens is open-source and community-driven.
- Fork the repo
- Create a feature branch:
git checkout -b feat/my-feature - Commit with conventional commits:
git commit -m "feat: add volume pruning" - Push and open a pull request
Please read CONTRIBUTING.md before submitting a PR.
Look for issues tagged good first issue — these are well-scoped tasks suitable for new contributors.
Roadmap and execution are tracked in GitHub, not Linear or an external PM tool:
| Where | Link / use |
|---|---|
| Project board | dockerlens (Kanban) — primary roadmap view. All projects if you use more than one board. |
| Issues | cm-collins/dockerlens/issues |
| Pull requests | cm-collins/dockerlens/pulls |
GitHub CLI (optional — needs read:project once: gh auth refresh -s read:project):
# Print this board’s URL (JSON is {"projects":[...]} — filter with .projects[])
gh project list --owner cm-collins --format json -q '.projects[] | select(.title=="dockerlens") | .url'
# Same via jq: … | jq -r '.projects[] | select(.title=="dockerlens") | .url'
# Open in browser from the shell:
BOARD_URL="$(gh project list --owner cm-collins --format json -q '.projects[] | select(.title=="dockerlens") | .url')"
(command -v xdg-open >/dev/null && xdg-open "$BOARD_URL") || (command -v open >/dev/null && open "$BOARD_URL") || true
gh project list --owner cm-collins # table listing
gh project list --owner cm-collins --web # projects UI in browserIf gh project list errors with missing read:project, complete gh auth refresh -s read:project (browser/device flow), then retry.
Found a security vulnerability? Please do not open a public issue. Email security@dockerlens.io instead. We will respond within 48 hours.
DockerLens is licensed under the MIT License.
- Tauri — for making native Linux apps with web tech actually possible
- bollard — the Rust Docker client powering the backend
- Docker — for the API that makes all of this possible
Built with ❤️ for the Linux community.





