Logo

Portainer: web UI for Docker, Kubernetes, Swarm

Portainer: web UI for Docker, Kubernetes, Swarm

Portainer is the reference UI to manage your containers: Docker, Kubernetes, Swarm. Multi-environment, user + ACL management, Docker Compose stacks in a few clicks. Ideal for mixed teams.

Introduction

Portainer simplifies container administration:

  • Visual dashboards (containers, images, volumes, networks)
  • Multi-environment (manage local Docker + remote K8s cluster from one UI)
  • Integrated Docker Compose / Kubernetes YAML editor
  • Logs, exec, file browser directly in browser
  • RBAC: roles and team permissions
  • Ready app templates
  • Webhooks for deployments
  • Free (Community Edition) or Business (commercial)

For sysadmins who want a UI rather than CLI, or for teams where not everyone is technical.

Prerequisites

  • Linux VPS with Docker installed
  • Root access
  • Port 9443 (Portainer HTTPS) open

Step 1: Portainer CE deployment

sudo docker volume create portainer_data

sudo docker run -d -p 8000:8000 -p 9443:9443 \
    --name portainer --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:latest

Step 2: First access

Visit https://VPS_IP:9443. Accept self-signed cert. Create admin account (12+ char password).

Step 3: Configure local environment

After login, Portainer auto-detects local Docker via /var/run/docker.sock.

Click Get Started > Docker. local environment appears.

Step 4: Reverse proxy with valid HTTPS

server {
    listen 443 ssl http2;
    server_name portainer.your-domain.com;
    
    location / {
        proxy_pass https://127.0.0.1:9443;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_verify off;
    }
}
sudo certbot --nginx -d portainer.your-domain.com

Step 5: Deploy container via UI

Containers > Add container.

  • Name: nginx-test
  • Image: nginx:alpine
  • Port mapping: 8080 -> 80
  • Network: bridge
  • Restart policy: Unless stopped

Click Deploy the container.

Step 6: Docker Compose stacks

Stacks > Add stack. Web editor:

services:
  app:
    image: nginx:alpine
    ports:
      - "8081:80"
    volumes:
      - app_data:/usr/share/nginx/html
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  app_data:

Click Deploy the stack.

Step 7: App templates

App Templates: list of preconfigured apps (WordPress, NextCloud, GitLab).

Click template, fill vars (passwords, domain), deploy.

You can create custom JSON templates and host them.

Step 8: Add remote environment

To manage remote Docker / K8s from same Portainer:

Environments > Add environment:

  • Docker Standalone: Portainer agent on remote
  • Docker Swarm: agent on swarm
  • Kubernetes: via kubeconfig
  • Edge Agent: for edge clusters (Pi, IoT)

On remote:

sudo docker run -d -p 9001:9001 --name portainer_agent --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/lib/docker/volumes:/var/lib/docker/volumes \
    portainer/agent:latest

Add in Portainer URL tcp://REMOTE_IP:9001.

Step 9: Users and roles

Users > Add user.

Available roles:

  • Administrator: full power
  • User: per env / resource permissions

Create dev user, give access to staging env only.

Step 10: Resource Control (RBAC)

On each container/stack/volume, define owner and access. Useful in multi-tenant.

Resource controls:

  • Public: everyone
  • Restricted: listed users / teams only
  • Administrators only

Step 11: Webhooks for CI/CD

On a container, Webhook > Enable. Portainer generates URL.

From CI:

curl -X POST https://portainer.your-domain.com/api/webhooks/XXXX-XXXX

Portainer redeploys the container (re-pulls image and restarts).

Step 12: Backup and restore

Settings > Backup. Download .tar.gz with all Portainer config (users, environments, stacks).

To restore: reinstall Portainer then Settings > Restore.

⚠️ Backup doesn't contain Docker volumes. Back them up separately.

Troubleshooting

Can't log in

sudo docker logs portainer

Forgot admin password? Reset:

sudo docker stop portainer
sudo docker run --rm -v portainer_data:/data portainer/helper-reset-password
sudo docker start portainer

"Cannot connect to Docker daemon"

Socket not properly mounted:

sudo docker inspect portainer | grep Mounts

Verify /var/run/docker.sock:/var/run/docker.sock.

Reverse proxy "502 Bad Gateway"

Portainer listens HTTPS on 9443. Use https:// and proxy_ssl_verify off.

Slow performance

Increase Docker resources:

sudo docker update --memory=2g --cpus=2 portainer

Useful commands

sudo docker ps -f name=portainer
sudo docker logs portainer

# Update
sudo docker pull portainer/portainer-ce:latest
sudo docker stop portainer
sudo docker rm portainer
# Relaunch with same install command

# Manual volume backup
sudo docker run --rm -v portainer_data:/data -v $(pwd):/backup busybox tar czf /backup/portainer-$(date +%F).tar.gz /data

# Reset admin password (stop Portainer first)
sudo docker run --rm -v portainer_data:/data portainer/helper-reset-password

sudo docker logs -t -f portainer

Conclusion

Portainer simplifies your life when:

  • You manage multiple environments
  • You work in a team
  • You want to delegate without SSH access
  • You want to visualize container state quickly

Limits:

  • Not a GitOps tool (use ArgoCD/Flux)
  • Community Edition has some RBAC limits (Business for enterprise)

Going further:

  • Combine with Watchtower for container auto-updates
  • Enable Portainer Edge to manage IoT
  • For full GitOps, look at ArgoCD + Portainer as complement

Resources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members