Ir al contenido
  1. Posts/

Portainer: Gestiona Docker como un Pro (Sin Tocarte la Terminal)

Tabla de contenido

Tengo un problema. Mejor dicho, tenía un problema.

Después de dos años montando servicios en mi homelab, llegué a un punto donde tenía 43 containers Docker corriendo entre tres servidores diferentes. Plex, Grafana, n8n, Gitea, Vaultwarden, Home Assistant… la lista seguía y seguía.

El problema no era Docker. Docker funciona de puta madre. El problema era yo, intentando recordar qué compose file iba con qué servicio, en qué puerto corría cada cosa, y por qué narices ese container se reiniciaba cada 15 minutos.

Ahí entró Portainer. Y no, esto no es un anuncio. Es simplemente la herramienta que me devolvió la cordura.

Qué es Portainer (y por qué te va a gustar)
#

Portainer es una interfaz web para gestionar Docker. Punto. Pero decir solo eso es como decir que un BMW es “un coche con ruedas”. Técnicamente cierto, pero te pierdes lo importante.

Con Portainer puedes:

  • Ver todos tus containers de un vistazo (estado, recursos, logs)
  • Desplegar nuevos servicios desde la web (sí, sin tocar YAML)
  • Gestionar redes, volúmenes, imágenes
  • Controlar múltiples hosts Docker desde un solo sitio
  • Ver métricas en tiempo real (CPU, RAM, red)
  • Hacer rollbacks si algo se rompe

Todo desde el navegador. Todo con clicks. Y si eres de los que prefiere terminal, también tiene una API completa.

Mi Setup Actual
#

Tengo Portainer corriendo en tres ubicaciones:

  1. Mac mini M1 (mi servidor principal en casa) - 18 containers
  2. Unraid Phatt (servidor gordo con GPUs) - 22 containers
  3. Cluster K3s en Proxmox (4 nodos) - aquí uso Portainer Business para Kubernetes

La versión gratuita (Community Edition) me vale para los servidores Docker normales. Para K3s uso la Business porque gestionar Kubernetes sin UI es de masoquistas.

Instalación en 2 Minutos
#

La instalación es ridículamente fácil. En cualquier máquina con Docker:

1
2
3
4
5
6
7
8
docker volume create portainer_data

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

Eso es todo. Ve a https://tu-ip:9443 y crea tu usuario admin.

Si usas docker-compose (como yo), el archivo es así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '3.8'

services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    ports:
      - "9000:9000"
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:

Levántalo con docker-compose up -d y listo.

Por Qué Montas Portainer en el Servidor Más Estable
#

Aprendí esto por las malas. La primera vez instalé Portainer en mi NAS Synology, que es donde tengo más containers. Problema: cuando el NAS se reinicia (actualizaciones, mantenimiento), pierdes acceso a Portainer justo cuando más lo necesitas.

Ahora lo tengo en el Mac mini, que prácticamente nunca se apaga. Desde ahí gestiono el Mac mismo, el Unraid, y cualquier otro host que añada. Es como tener la torre de control en el aeropuerto más fiable.

Gestionar Múltiples Hosts (Environments)
#

Aquí es donde Portainer brilla de verdad. Puedes añadir otros servidores Docker y gestionarlos todos desde una sola interfaz.

Hay dos formas de hacerlo:

Opción 1: Docker API (más simple)
#

Si los servidores están en tu red local, puedes exponer la API de Docker de forma segura y conectarlos directamente. En el servidor remoto:

1
2
# Editar el servicio de Docker para escuchar en TCP
sudo systemctl edit docker.service

Añade estas líneas:

1
2
3
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

Guarda y reinicia:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

IMPORTANTE: Solo haz esto en red local segura. Exponer Docker API sin TLS a internet es regalar las llaves de tu casa a cualquiera.

En Portainer, ve a Environments > Add Environment > Docker Standalone, y pon la IP y puerto 2375.

Opción 2: Edge Agent (más segura, funciona desde cualquier sitio)
#

Si el servidor está en otra ubicación o prefieres más seguridad, usa Portainer Agent. En el servidor remoto:

1
2
3
4
5
6
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

Luego en Portainer, añades el environment apuntando a tu-ip:9001. El agente hace de puente entre Portainer y el Docker Engine local.

Yo uso Agent en todos mis servidores. Es más limpio y no tengo que tocar la configuración de Docker.

El Dashboard que Realmente Uso
#

Cuando abres Portainer, el dashboard principal te muestra:

  • Número de containers corriendo/parados/con errores
  • Uso de CPU/RAM/disco
  • Imágenes huérfanas (ocupando espacio sin motivo)
  • Redes y volúmenes

Pero sinceramente, yo paso del dashboard general y voy directo a la vista de Containers. Ahí está todo lo que necesito:

  • Lista de todos los containers con estado (running, healthy, unhealthy)
  • Quick actions: start, stop, restart, kill, remove
  • Acceso directo a logs, stats, inspect, console

Los logs en tiempo real son oro. Antes tenía que hacer docker logs -f nombre-container cada vez que algo fallaba. Ahora hago click en Logs y se abre en el navegador, con scroll infinito y búsqueda integrada.

Desplegar Servicios Nuevos Sin YAML
#

Una de mis funcionalidades favoritas es App Templates. Portainer trae plantillas preconfiguradas para servicios populares: Nginx, WordPress, GitLab, Redis, PostgreSQL…

Haces click en la plantilla, ajustas las variables de entorno si hace falta, y deploy. En 30 segundos tienes el servicio corriendo.

Para servicios custom, puedes:

  1. Web editor: escribir el docker-compose directamente en el navegador
  2. Git repository: apuntar a un repo con tu compose file (lo uso para mis proyectos)
  3. Custom template: crear tus propias plantillas reutilizables

Yo tengo templates custom para mi stack típico: Caddy como reverse proxy, PostgreSQL con pgAdmin, y Redis con RedisInsight. Cuando monto un proyecto nuevo, deploy de la plantilla y en 2 minutos está todo corriendo.

Stacks: Docker Compose en la Web
#

Portainer llama “Stacks” a lo que conoces como proyectos docker-compose. Puedes subir un compose file, editarlo en el navegador, y desplegarlo.

Mejor aún: puedes conectar un stack a un repositorio Git. Cada vez que haces push al repo, puedes hacer pull desde Portainer y actualizar el stack. Es casi como tener CI/CD gratis.

Mi stack de n8n, por ejemplo, vive en mi Gitea privado. Cuando actualizo el compose (añado una nueva integración, cambio variables de entorno), voy a Portainer > Stacks > n8n > Pull and redeploy. Sin ssh, sin comandos, sin posibilidad de cagarla con un typo en terminal.

Registries: Conectar Docker Hub y Privados
#

Si usas imágenes privadas (yo tengo algunas en mi Gitea con registry integrado), puedes añadir credenciales de registries en Portainer.

Así cuando despliegas un container que tira de una imagen privada, Portainer autentica y la descarga sin problemas. También funciona con GitHub Container Registry, GitLab Registry, y cualquier registry compatible con Docker.

Monitoring Básico (Pero Útil)
#

Portainer no es Grafana. No pretende serlo. Pero tiene stats en tiempo real suficientemente buenas para debugging rápido.

Para cada container ves:

  • CPU % (histórico de los últimos minutos)
  • RAM usada/límite
  • Red (in/out)
  • Disco (read/write)

Si un container se está comiendo toda la RAM, lo ves al instante. Si algo está saturando la red, también. Para análisis más profundos uso Grafana + Prometheus, pero para troubleshooting del día a día, Portainer me vale.

Gestionar Volúmenes Sin Dramas
#

Los volúmenes Docker son esa cosa que “funciona hasta que no funciona”. Portainer te lista todos los volúmenes, te dice qué containers los usan, y te deja hacer backups/browsing de archivos.

Tengo un volumen para PostgreSQL que ocupa 8GB. Cada semana hago un backup desde Portainer (hay una opción “Download” que te descarga un tar del volumen). Lo subo a mi NAS y duermo tranquilo.

También puedes crear volúmenes nuevos con drivers específicos (local, NFS, CIFS). Yo monto volúmenes NFS apuntando a mi Synology para que los containers que generan mucho dato (Plex, Paperless) escriban directamente al NAS.

Redes Docker: Por Fin Algo Visual
#

Las redes Docker son otro infierno de terminal. Crear, conectar, desconectar containers… con Portainer es trivial.

Tengo varias redes custom:

  • frontend: servicios expuestos vía Caddy
  • backend: bases de datos y servicios internos
  • media: Plex, Sonarr, Radarr, qBittorrent
  • monitoring: Grafana, Prometheus, exporters

Desde Portainer veo qué containers están en qué red, puedo mover containers entre redes, y crear nuevas con configuración IP estática si hace falta.

Seguridad: Users, Teams, Roles
#

Si eres el único admin de tu homelab, esto te da igual. Pero si compartes acceso (familia, colega que te ayuda a mantener algo), Portainer tiene RBAC completo.

Puedes crear usuarios con permisos limitados. Por ejemplo, un usuario que solo pueda ver logs y reiniciar containers, pero no borrar nada ni cambiar configuraciones.

También hay Teams (grupos de usuarios) y Roles personalizados. Es nivel empresarial, totalmente overkill para un homelab doméstico, pero está ahí si lo necesitas.

Portainer Business para Kubernetes
#

Esto merece sección aparte. Portainer Business (de pago, pero hay trial de 30 días y licencias bastante asequibles para homelab) añade soporte completo para Kubernetes.

Yo lo uso en mi cluster K3s (4 nodos en Proxmox). Sin Portainer, gestionar K8s es un dolor: kubectl, manifests YAML, namespaces, deployments, services, ingress… es una puta locura.

Con Portainer Business:

  • Ves todos los namespaces de un vistazo
  • Despliegas aplicaciones desde Helm charts (biblioteca enorme)
  • Gestionas ConfigMaps, Secrets, PVCs desde la web
  • Escalado de replicas con un slider
  • Logs agregados de todos los pods

No es que reemplace kubectl completamente (a veces necesitas terminal para cosas raras), pero para el 90% de tareas diarias, Portainer es más rápido y menos propenso a errores.

La licencia Business para homelabs (hasta 5 nodos) cuesta alrededor de 5 USD/mes. Lo pago sin pestañear. Mi salud mental vale más.

Webhooks: Redeploy Automático
#

Cada stack y container puede tener un webhook. Es una URL que, cuando la llamas (con curl, desde un script, desde CI/CD), fuerza un pull de la imagen nueva y redeploy del container.

Lo uso para mis proyectos con Gitea + Woodpecker CI. Cuando hago push a main, el pipeline compila la imagen, la sube al registry, y llama al webhook de Portainer. El container se actualiza solo.

Antes tenía que ssh al servidor, hacer pull de la imagen, y recrear el container. Ahora es todo automático. Es la sensación de vivir en el futuro pero en tu homelab.

Problemas y Pegas (Que las Hay)
#

Portainer no es perfecto. Aquí van las cosas que me joden:

1. Editar un Container en Marcha es Raro
#

Si cambias algo en un container existente (añadir variable de entorno, cambiar puertos), Portainer te obliga a recrear el container. Pierdes logs, el uptime se resetea, y si no tienes volúmenes bien configurados, puedes perder datos.

La solución es gestionar todo vía Stacks (compose files). Así los cambios son reproducibles y controlados.

2. La Versión Community No Tiene Backups Automáticos de Portainer
#

Si Portainer se rompe, pierdes toda la configuración (environments, users, templates custom). La versión Business tiene backups automáticos, pero en Community tienes que hacerlo a mano.

Yo hago backup del volumen portainer_data una vez al mes con un script:

1
2
3
4
docker run --rm \
  -v portainer_data:/data \
  -v /home/luis/backups:/backup \
  alpine tar czf /backup/portainer-backup-$(date +%Y%m%d).tar.gz /data

3. Actualizar Portainer es Manual
#

No hay auto-update. Cuando sale una versión nueva, tienes que:

  1. Bajar el container viejo
  2. Borrar el container
  3. Hacer pull de la imagen nueva
  4. Recrear el container

No es difícil, pero es fácil olvidarse. Estoy 3-4 versiones desactualizado porque paso de tocar algo que funciona.

4. Stats Limitados en Containers Sin Límites
#

Si un container no tiene límites de recursos configurados, Portainer no puede mostrarte el % de uso. Te muestra MB absolutos, pero no el porcentaje del total.

La solución es definir limits en los compose files:

1
2
3
4
5
6
7
services:
  mi-servicio:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G

Alternativas (Y Por Qué No Las Uso)
#

Hay otras opciones para gestionar Docker desde UI:

Yacht: más simple, menos funcionalidades. Bien para empezar, te quedas corto rápido.

Dockge: nuevo, bonito, se centra en stacks (compose files). Me gusta, pero no gestiona múltiples hosts bien.

Cockpit con plugin Docker: si ya usas Cockpit para gestionar el servidor, el plugin está bien. Pero es muy básico.

Rancher: si estás en Kubernetes, Rancher es brutal. Para Docker solo, es overkill.

Portainer encuentra el equilibrio perfecto entre funcionalidad y complejidad. Hace todo lo que necesito sin abrumarme con opciones que nunca voy a usar.

Consejos Finales
#

Monta Portainer PRONTO: si estás empezando tu homelab, instala Portainer desde el primer día. No esperes a tener 40 containers y el caos servido.

Usa Stacks para todo: aunque Portainer te deja crear containers sueltos desde la UI, no lo hagas. Todo en compose files. Es la única forma de mantener tu setup reproducible.

Backups del volumen portainer_data: cuando configures environments, templates custom, y settings, haz backup. Recrear todo eso desde cero es un dolor.

Conecta Portainer a un Git repo: tus compose files en control de versiones, deployables desde Portainer. Es el setup perfecto.

No expongas Portainer a internet sin VPN: Portainer tiene autenticación, pero aun así. Usa Tailscale, WireGuard, o lo que sea, pero no lo dejes en abierto.

Conclusión
#

Portainer me quitó el miedo a gestionar Docker en múltiples servidores. Antes evitaba desplegar servicios nuevos porque sabía que iba a tener que recordar comandos, ssh a servidores, y potencialmente cagarla.

Ahora despliego cosas por impulso. “Voy a probar Uptime Kuma”. 5 minutos después está corriendo. “Necesito un Postgres para este proyecto”. 2 minutos y está listo.

No es que Docker sea difícil. Es que gestionar 10, 20, 40 containers a mano se convierte en un trabajo a tiempo completo. Portainer me devolvió el tiempo para hacer cosas que realmente importan, como optimizar servicios, montar nuevos proyectos, o simplemente no pensar en Docker durante días.

Si tienes más de 5 containers corriendo, instala Portainer. En serio. Tu yo del futuro te lo agradecerá.