Portainer: The GUI Docker Deserves (But Doesn't Come With)

Portainer: The GUI Docker Deserves (But Doesn't Come With)

Stop memorizing docker commands. Portainer gives you a clean web interface to manage containers, stacks, and volumes. Set it up in 5 minutes.

đź’ˇ Disclosure: This article contains affiliate links. If you make a purchase through these links, we may earn a small commission at no extra cost to you. This helps support the site and keeps the content free.

import AffiliateLink from ’../../components/AffiliateLink.astro’;

I still remember my first week with Docker.

docker ps to see what was running. docker logs container_xyz to debug crashes. docker exec -it something_sh /bin/sh to poke around inside containers. docker-compose down && docker-compose up -d to restart services.

Hundreds of commands. Container names I couldn’t remember. Orphaned volumes eating disk space. Images accumulating like digital dust.

It worked. But “pleasant” isn’t the word I’d use.

Then I found Portainer. And managing containers actually became… enjoyable?

What Is Portainer?

Portainer is a web interface for Docker. You see all your containers, images, volumes, and networks in a clean dashboard. Click to start, stop, or restart. Browse logs without typing commands. Inspect configs without reading YAML.

It handles:

  • Docker standalone (your personal server)
  • Docker Swarm (clusters)
  • Kubernetes (if you’re brave)

I run the Community Edition (free) on my single Docker host. It’s completely changed how I interact with my containers.

Why Not Just Use the CLI?

The Docker CLI is powerful. I still use it daily. But for some tasks, it’s painfully slow:

  • Visualizing 20+ containers at once
  • Reading color-coded logs in real-time
  • Editing environment variables without opening files
  • Creating new containers through a web form
  • Seeing resource usage (CPU/RAM) at a glance

The CLI works. Portainer is faster.

I haven’t abandoned the command line. I use Portainer for 80% of my container management. The remaining 20% (scripting, CI/CD, batch operations) stays in the terminal.

Best of both worlds.

Installation in 2 Minutes

Portainer installs… inside Docker. Meta, but practical.

# Create a volume for Portainer data
docker volume create portainer_data

# Run Portainer
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

Or use Docker Compose (my preference):

version: "3.8"

services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    ports:
      - "8000:8000"
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./portainer_data:/data
    environment:
      - TZ=Europe/Paris

Deploy it:

docker compose up -d

Wait about 10 seconds, then open https://your-server-ip:9443.

Note: Portainer uses HTTPS by default on port 9443. You’ll get a certificate warning—this is normal for self-signed certs. You can ignore it or add your own certificate.

Initial Setup

First boot = create your admin account.

Pick a strong password. This account has full access to your Docker daemon. If someone gets in, they own your containers.

Then select your environment:

  • Local: Your Docker instance (where Portainer is running)
  • Remote: Another Docker host

For most self-hosted setups, choose “Local” and click “Connect”.

You’ll land on the dashboard. Magic.

The Dashboard: Overview at a Glance

The main dashboard shows:

  • Container count (running / stopped / total)
  • Docker images present
  • Volumes in use
  • Configured networks
  • Host CPU/RAM usage

One look tells you if everything’s healthy.

I currently have 47 containers. Without Portainer, I wouldn’t even know what half of them do.

Managing Containers

Click “Containers” in the sidebar. You get a complete list showing:

  • Name
  • Image being used
  • Status (running / stopped / unhealthy)
  • Exposed ports
  • Creation date

Quick actions:

  • ▶️ Start
  • ⏹️ Stop
  • 🔄 Restart
  • 🗑️ Delete (with confirmation)
  • đź“‹ Duplicate / Recreate
  • 📊 Logs (in real-time!)
  • đź”§ Console (interactive shell inside the container)

The log viewer is genuinely excellent. Syntax highlighting, built-in search, auto-scroll. I’ve caught so many bugs by watching logs visually instead of using docker logs.

The Interactive Console

Need to run a command inside a container?

Click the container → Console. Pick /bin/sh or /bin/bash. You get a complete web terminal.

I use this constantly:

  • psql -U user database for PostgreSQL access
  • redis-cli for Redis debugging
  • ls -la /config to see generated files
  • cat /etc/nginx/nginx.conf to verify configs

Faster than docker exec and you keep the visual context.

Managing Images

Sidebar → Images. See everything you’ve downloaded, their size, their age.

Useful actions:

  • Pull: Update to the latest image version
  • Remove: Delete unused images
  • Build: Build from a Dockerfile
  • Import/Export: Backup images

I freed up 15 GB by removing old unused images. Portainer shows everything, including dangling layers.

Managing Volumes

Docker volumes are magical but opaque. Where are the files? How big? Which container uses them?

Sidebar → Volumes. Everything’s visible.

You see:

  • Volume name
  • Driver (local, nfs, etc.)
  • Size used
  • Associated container(s)

I found 8 orphaned volumes (unused by any container) taking 23 GB. Deleted them in two clicks.

Creating Containers via UI

Menu → Containers → Add Container.

Complete form:

  • Name
  • Image (with Docker Hub autocompletion)
  • Ports to expose
  • Environment variables
  • Volumes to mount
  • Network to use
  • Startup command
  • Restart policy
  • Labels

Great for quickly testing something without creating a docker-compose.yml file.

Example: I want to test the latest nginx.

  1. Add Container
  2. Name: nginx-test
  3. Image: nginx:latest
  4. Port mapping: 8080 → 80
  5. Deploy

30 seconds. Nginx is running.

For permanent services, I still prefer Docker Compose (version control, reproducibility). But for quick tests, Portainer’s UI is unbeatable.

Stacks: Docker Compose Visually

This is my favorite feature.

Sidebar → Stacks. Create and manage entire Docker Compose stacks from the web interface.

Create a stack:

  1. Click “Add Stack”
  2. Name it (e.g., “monitoring”)
  3. Paste your docker-compose.yml in the editor
  4. Optional environment variables
  5. Deploy

Portainer runs docker-compose up -d for you.

Modify a stack:

  1. Click the existing stack
  2. Edit the YAML
  3. Update

Incredible for small tweaks. Need to add an environment variable? No SSH, no file editing, no restart commands. Just click → edit → deploy.

All my services are in Portainer stacks: media-server, monitoring, web-apps, databases. Centralized management.

Templates: One-Click Deploys

Portainer includes pre-configured templates. Common apps ready to deploy.

Sidebar → App Templates. You’ll find:

  • Nginx
  • MySQL / PostgreSQL / MongoDB
  • Redis
  • WordPress
  • Grafana
  • And 50+ more

Click a template, fill a few fields (ports, passwords), deploy. 30 seconds and it’s live.

I use this for temporary test databases. Quick, clean, disposable.

Security: Lock Down Portainer

Portainer has full Docker access. If someone compromises your account, they control everything.

Security checklist:

  1. Strong password: Obvious but critical
  2. HTTPS only: Don’t expose port 8000 (HTTP) to the internet
  3. VPN or reverse proxy: Don’t expose Portainer directly. Use WireGuard/Tailscale, or a reverse proxy with auth
  4. 2FA: Portainer supports TOTP. Enable it in Settings → Authentication

I don’t expose Portainer to the internet at all. I access it through my VPN or from my local network only.

Multi-Node: Manage Multiple Servers

Have multiple VPS or physical servers? Portainer can manage them all from one interface.

Method 1: Expose Docker API TCP on remote servers (secured with TLS), add them as “Endpoints” in Portainer.

Method 2: Deploy a lightweight Portainer Agent on each node. Safer than exposing the Docker API.

I manage 3 servers from my main Portainer instance. Convenient for deploying the same stack across multiple nodes.

Backup and Restore

Portainer stores everything in its volume (portainer_data).

To backup:

docker stop portainer
tar -czf portainer_backup_$(date +%Y%m%d).tar.gz ./portainer_data
docker start portainer

To restore on a new server:

# Extract the backup
tar -xzf portainer_backup_20260508.tar.gz

# Run Portainer pointing at the restored data
docker run -d -p 9443:9443 --name portainer \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/portainer_data:/data \
  portainer/portainer-ce:latest

All your config (users, stacks, endpoints) is restored.

What I Learned the Hard Way

Don’t skip the initial password setup.

I once deployed Portainer and got distracted before setting a password. Came back two hours later to find cryptomining containers on my server. Someone scanned for default Portainer installs and got lucky.

Set a strong password immediately. Enable 2FA if you can. Don’t be me.

Resource limits matter.

Portainer lets you set CPU and RAM limits per container. I didn’t bother at first. Then one container went rogue and consumed all my RAM, taking down everything else.

Now I set limits on every container. Better safe than sorry.

Stack names are important.

Portainer uses stack names as Docker Compose project names. If you name your stack “test” and later rename it “production,” Docker treats them as completely different projects. You’ll end up with duplicate containers.

Pick meaningful names from the start.

Limitations

Portainer CE isn’t perfect:

  • No built-in scheduling (cron for containers)
  • No automatic builds on Git push
  • No detailed real-time monitoring
  • No native secret encryption (no Vault integration)

For those use cases, you need other tools. But for day-to-day container management? Portainer CE does everything I need.

FAQ

Does Portainer replace Docker Compose?

No, it complements it. I keep my docker-compose.yml files for version control. Portainer is for operations.

Can I use Portainer with Kubernetes?

Yes, but I don’t recommend it. Portainer for K8s is limited. Use Lens or the official Kubernetes dashboard instead.

Is there a mobile app?

No, but the web interface is responsive. Works well on mobile browsers.

Does Portainer run on Raspberry Pi?

Yes, ARM images available. Perfect for Pi 4 setups.

Can I limit container resources?

Yes, in the container creation/editing screen, “Resources” section. CPU limit, memory limit, swap limit.

How do I see logs from a dead/crashed container?

Click the container (even if stopped), Logs tab. History is preserved.

Conclusion

Portainer isn’t strictly “essential.” You can do everything via CLI.

But it makes Docker management so much more pleasant that I wouldn’t go back. It’s like upgrading from a text editor to an IDE—the core work stays the same, but the experience transforms.

If you’re running more than 5 containers, install Portainer. It’s 2 minutes of setup for hours of frustration avoided.

Your future self, debugging why a container keeps restarting at 3 AM, will thank you for having colorful logs and an interactive console one click away.


Written on 2026-05-08, from a browser tab showing 47 containers in Portainer. The number honestly scares me a little.

Stay in the loop 📬

Get self-hosting tutorials, tool reviews, and infrastructure tips delivered to your inbox. No spam, unsubscribe anytime.

Join 0 self-hosters. Free forever.