
Portainer: a web UI for Docker (and how it compares to the alternatives)
What Portainer is, how to install it in minutes, and how it stacks up against Docker Desktop, Rancher, Lens and Dockge.
What is Portainer
Portainer is a web-based UI for managing Docker (and Kubernetes) environments. Instead of remembering docker ps, docker inspect and juggling docker-compose.yml files over SSH, you get a dashboard where you can see containers, images, volumes, networks and stacks, and act on them with a few clicks.
It’s not just “eye candy” over the CLI: it also handles things that are genuinely annoying to do by hand, like managing multiple Docker hosts from one place, deploying stacks from a Git repo, setting up RBAC for a team, or getting a live view of logs and resource usage without SSHing in.
It comes in two flavors:
- Portainer CE (Community Edition) — free, open source, covers the vast majority of self-hosted use cases.
- Portainer BE (Business Edition) — paid, adds things like SSO/OAuth, RBAC at a more granular level, and support.
For a homelab or a small team running a handful of Docker hosts, CE is more than enough.
Installing Portainer
Running Portainer itself is just… a Docker container. The official one-liner:
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 \
--name portainer --restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
-v /var/run/docker.sock:/var/run/docker.sockgives Portainer access to the local Docker daemon — this is how it manages the host it’s running on.portainer_datais a named volume that persists Portainer’s own configuration (users, endpoints, settings) across upgrades.- Port
9443serves the HTTPS UI (there’s also a plain HTTP option on9000if you terminate TLS elsewhere).
Once it’s up, open https://<your-host>:9443, create the admin user on first login, and you’re in.
If you’d rather use Compose (handy if Portainer is one service among many in your stack):
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
For managing remote Docker hosts, you deploy the lightweight Portainer Agent on each of them and connect it from the main Portainer instance — no need to expose the Docker socket over the network directly.
I’ve also written a separate guide on how to safely update an existing Portainer instance without losing containers or volumes.
What you get once it’s running
- Container management: start/stop/restart, inspect, exec into a shell, tail logs, view CPU/memory stats — all from the browser.
- Stacks: deploy
docker-compose.ymlfiles directly from the UI, from a pasted file, or straight from a Git repo (with optional auto-redeploy on push, which is genuinely nice for small self-hosted setups). - Multi-environment: manage several Docker hosts (or Kubernetes clusters, or Docker Swarm) from a single Portainer instance via the agent.
- Templates: one-click deploy for common apps (Nginx, Postgres, WordPress, etc.) from the App Templates section.
- Access control: users, teams, and per-resource permissions — useful the moment more than one person touches the same host.
- Kubernetes support: Portainer also manages K8s clusters, though if Kubernetes is your primary target, more specialized tools tend to fit better (more on that below).
How it compares
| Tool | Scope | Best for | Downside |
|---|---|---|---|
| Portainer | Docker, Swarm, Kubernetes | Self-hosted homelabs, small-to-mid teams, multi-host Docker | UI can feel dated; K8s support is secondary to Docker |
| Docker Desktop | Docker only, local machine | Local dev on your own laptop | Not for remote/production hosts; licensing costs for larger companies |
| Rancher | Kubernetes-first (also some Docker) | Teams running Kubernetes at scale | Heavy, overkill if you’re not really doing K8s |
| Lens | Kubernetes only | Developers who live in kubectl/K8s daily | Desktop app, not a shared web UI for a team |
| Dockge | Docker Compose stacks only | Minimal, fast Compose-stack management | No multi-host, no RBAC, much narrower feature set |
| Yacht / CapRover | Docker (Yacht) / PaaS-style deploys (CapRover) | Very small setups, simple app hosting | Smaller communities, fewer features than Portainer |
If your world is plain Docker on one or a handful of hosts and you want a proper multi-user web UI without adopting Kubernetes, Portainer is the default choice — it’s mature, well documented, and the CE tier covers almost everything a small team needs.
If you’re all-in on Kubernetes, Rancher (for cluster/fleet management) or Lens (for a local developer-facing view) will serve you better — Portainer’s K8s support exists but isn’t its strongest suit.
If you just want the absolute minimum to manage a couple of Compose stacks and nothing else, Dockge is lighter and faster to reason about, but you’ll outgrow it the moment you need more than one host or more than one user.
And if you’re only ever working locally on your dev machine, Docker Desktop (or Rancher Desktop / OrbStack on macOS) is simpler than spinning up Portainer for something that never leaves your laptop.
If you’re also running WordPress on Docker, check out wpdockerize, a tool I built to scaffold the whole stack in seconds.
Have fun! 😃

Co-Founder & CTO at PAPION. Senior full-stack engineer specializing in React, TypeScript, Node.js, and application security.