Tutoriales de VPS
Instalar el panel de gestión Docker Portainer en un VPS (2026): guía completa de contenedores, Stacks, registros y acceso seguro
Este tutorial está dirigido a usuarios que ya usan Docker en un VPS pero no quieren escribir comandos por SSH todos los días para gestionar contenedores. Aprenderás a instalar Portainer CE, abrir solo los puertos mínimos, acceder al panel de gestión por HTTPS, gestionar contenedores y Stacks de Compose, ver registros, manejar Volumes y entender por qué Portainer es cómodo pero no sustituye el endurecimiento de la seguridad del servidor.
Instalar el panel de gestión Docker Portainer en un VPS (2026): guía completa de contenedores, Stacks, registros y acceso seguro
Muchos usuarios de VPS empiezan con un solo docker compose up -d. Al principio solo hay un blog, una base de datos y un proxy inverso, y la línea de comandos es manejable; pero cuando los contenedores llegan a una docena y empiezan a aparecer tareas programadas, entornos de prueba, monitorización, scripts de copia de seguridad y varios proyectos de Compose, revisar registros, consultar contenedores y cambiar variables de entorno solo por SSH se vuelve muy molesto.
El posicionamiento de Portainer es claro: ofrece un panel de gestión web para Docker y Docker Compose. No puede entender Docker por ti, ni debería convertirse en un backend de gestión expuesto sin protección a la internet pública, pero es muy adecuado para un solo VPS o unos pocos: ver el estado de los contenedores, reiniciar servicios, gestionar Stacks, inspeccionar Volumes, ver registros y confirmar rápidamente mapeos de puertos y versiones de imágenes.
Este artículo explica desde cero: cómo instalar Portainer CE en un VPS, qué puertos abrir, cómo inicializar la cuenta de administrador, cómo usarlo para gestionar proyectos de Docker Compose, qué operaciones conviene hacer en el panel y qué operaciones deben seguir en la línea de comandos y los repositorios Git.
Si cumples alguna de las siguientes situaciones, Portainer te resultará muy útil:
- Ya tienes Docker instalado en el VPS y varios contenedores en ejecución prolongada.
- Necesitas con frecuencia ver registros de contenedores, reiniciar servicios y comprobar variables de entorno y mapeos de puertos.
- Usas Docker Compose pero no quieres iniciar sesión por SSH en el servidor cada vez para comprobar el estado.
- Quieres dar a compañeros sin perfil de operaciones un punto de entrada visual relativamente seguro.
- Tienes varios VPS y necesitas ver varios entornos Docker de forma centralizada.
Si tu VPS solo ejecuta un WordPress y casi nunca tocas los contenedores, Portainer no es imprescindible. Encaja en la etapa en la que "los contenedores ya se han multiplicado y la gestión por línea de comandos empieza a ser caótica".
Portainer puede:
- Ver el estado de ejecución de los contenedores, imágenes, redes y Volumes.
- Iniciar, detener y reiniciar contenedores.
- Ver registros en tiempo real y la consola del contenedor.
- Crear y gestionar Stacks de Docker Compose.
- Gestionar variables de entorno, mapeos de puertos y directorios montados.
- Conectarse al Docker local o a entornos Docker remotos.
Portainer no puede hacer por ti:
- Corregir automáticamente archivos Compose erróneos.
- Sustituir sistemas de copia de seguridad, monitorización y alertas.
- Sustituir el firewall de Linux, la seguridad de SSH y las actualizaciones del sistema.
- Garantizar que la propia aplicación no tenga vulnerabilidades de seguridad.
- Gestionar migraciones de bases de datos y recuperación de datos que no entiendes.
En pocas palabras, Portainer es un punto de entrada de gestión de Docker, no una solución de seguridad para el VPS, ni todo el proceso de publicación en producción.
Antes de empezar, se recomienda preparar:
- Un VPS con Ubuntu 22.04 / 24.04 o Debian 12.
- Docker Engine ya instalado.
- Un usuario sudo normal.
- El firewall del servidor activado.
- Opcional: un dominio, por ejemplo
portainer.example.com.
Confirma que Docker está disponible:
docker version
docker ps
Si indica permisos insuficientes, puedes usar primero:
sudo docker ps
No se recomienda añadir a todos los usuarios al grupo docker solo por comodidad. Añadir un usuario al grupo docker equivale básicamente a darle capacidades de nivel root, porque puede montar directorios del host, controlar contenedores y acceder al socket de Docker.
Portainer recomienda oficialmente usar un volumen de Docker para guardar los datos. Primero crea el volumen de datos:
sudo docker volume create portainer_data
Luego inicia Portainer CE:
sudo docker run -d \
-p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Los parámetros clave aquí son:
-p 9443:9443: expone el puerto de gestión HTTPS integrado de Portainer.--restart=always: se restaura automáticamente tras reiniciar el servidor./var/run/docker.sock:/var/run/docker.sock: permite que Portainer gestione el Docker local.portainer_data:/data: guarda la configuración, los usuarios y la información de entornos de Portainer.
Comprueba el estado del contenedor:
sudo docker ps --filter name=portainer
Ver los registros de inicio:
sudo docker logs --tail=100 portainer
Accede en el navegador a:
https://你的服务器IP:9443
En el primer acceso, el navegador puede advertir que el certificado no está emitido por una CA pública; esto se debe a que Portainer usa un certificado autofirmado por defecto. Si solo estás haciendo una inicialización temporal, puedes continuar por ahora; para un uso formal se recomienda resolverlo más adelante con un dominio y un proxy inverso.
Durante la inicialización hay que hacer tres cosas:
- Crear la cuenta de administrador.
- Establecer una contraseña fuerte.
- Seleccionar el entorno Docker local.
No reutilices la contraseña de SSH, del correo electrónico ni del proveedor de nube para la contraseña del administrador. Portainer puede controlar Docker y tiene privilegios muy altos; una vez comprometido, un atacante puede controlar fácilmente el host.
La forma más sencilla es abrir 9443 directamente, pero no es la solución más sólida a largo plazo.
Si solo es para uso personal temporal, puedes restringir el firewall así:
sudo ufw allow from 你的固定IP to any port 9443 proto tcp
Si no tienes IP fija, se recomienda más bien:
- Usar Caddy/Nginx como proxy inverso hacia Portainer.
- Acceder detrás de Cloudflare, Tailscale, WireGuard o Zero Trust.
- Como mínimo, no expongas Portainer como un punto de entrada público sin protección.
Si usas UFW, primero confirma que SSH no se bloqueará:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
Y luego no abras todos los puertos de gestión a la ligera.
Supongamos que ya tienes Caddy y el dominio es portainer.example.com. Puedes vincular Portainer solo a un puerto local:
Primero elimina el contenedor antiguo:
sudo docker stop portainer
sudo docker rm portainer
Reinicia, escuchando solo en la máquina local:
sudo docker run -d \
-p 127.0.0.1:9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Ejemplo de Caddyfile:
portainer.example.com {
reverse_proxy https://127.0.0.1:9443 {
transport http {
tls_insecure_skip_verify
}
}
}
Aquí se usa tls_insecure_skip_verify porque el Portainer de origen usa un certificado autofirmado. Los usuarios públicos acceden al HTTPS formal que ofrece Caddy, y la conexión de Caddy al Portainer local solo ocurre en la dirección de bucle local.
Tras modificar, ejecuta:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Así, desde el exterior solo necesitas acceder a https://portainer.example.com en lugar de acceder directamente a https://IP:9443.
Portainer es muy adecuado para la observación diaria y operaciones ligeras:
- Ver si un contenedor está Running.
- Reiniciar un contenedor bloqueado.
- Ver las últimas 1000 líneas de registros.
- Confirmar etiquetas de imagen, mapeos de puertos y directorios montados.
- Entrar temporalmente en la consola del contenedor para solucionar problemas.
- Eliminar contenedores de prueba ya detenidos.
Pero no uses Portainer como el único método de publicación. Para entornos de producción se recomienda más bien:
- Guardar los archivos Compose en un repositorio Git.
- Gestionar las variables de entorno importantes con
.envo Secrets. - Verificar en local o en un entorno de prueba antes de publicar.
- Actualizar mediante Git, CI/CD o un proceso de cambios claro.
Portainer te permite "ver" y "operar", pero la fuente de la configuración debería seguir siendo rastreable.
Los Stacks de Portainer corresponden a proyectos de Docker Compose. Puedes pegar el contenido de Compose en la interfaz web o usar un archivo Compose de un repositorio Git.
Un ejemplo sencillo de Compose:
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- uptime_kuma:/app/data
volumes:
uptime_kuma:
Este ejemplo tiene dos puntos clave:
- El puerto se vincula a
127.0.0.1, evitando exponer el puerto de la aplicación directamente a la internet pública. - Los datos se colocan en un volumen de Docker, por lo que no se pierden al actualizar el contenedor.
Si ya gestionas servicios con Compose en la línea de comandos, no se recomienda entregar el mismo proyecto a la vez a Portainer y a la línea de comandos y cambiarlo repetidamente. Es mejor definir un único punto de entrada principal: o Git + Compose es la referencia y Portainer solo observa, o el Stack lo gestiona Portainer.
Portainer puede ver los volúmenes de Docker, pero no es una herramienta de copia de seguridad.
El error habitual es: ver un volumen en Portainer y pensar que los datos están seguros. En realidad, el volumen sigue en el disco de este VPS. Si el disco falla, se elimina el volumen por error o se reinstala el sistema, los datos aún pueden perderse.
Recomendaciones:
- Copia las bases de datos con el método recomendado por la aplicación, por ejemplo PostgreSQL con
pg_dump. - Sincroniza periódicamente los datos de tipo archivo a almacenamiento de objetos u otra máquina.
- Archiva periódicamente los volúmenes de Docker importantes.
- Haz simulacros de recuperación después de las copias de seguridad; no te limites a comprobar que el archivo de copia existe.
Puedes ver los volúmenes desde la línea de comandos:
sudo docker volume ls
sudo docker volume inspect portainer_data
La interfaz de Portainer es buena para ver y ayudar en la gestión, pero la estrategia de copia de seguridad debe diseñarse por separado.
La página Logs de Portainer es buena para ver rápidamente la salida de los contenedores. Pasos habituales de diagnóstico:
- Primero comprueba si el estado del contenedor es Running.
- Si está en Restarting, revisa el código de salida y los registros recientes.
- Si la aplicación no abre, revisa el mapeo de puertos y la configuración del proxy inverso.
- Si se pierden datos, comprueba si ha cambiado la ruta de montaje del volumen.
- Si falla tras una actualización, revisa la etiqueta de imagen y las variables de entorno.
Conserva también la línea de comandos:
sudo docker ps -a
sudo docker logs --tail=200 容器名
sudo docker inspect 容器名
Cuando la propia página de Portainer no abre, la línea de comandos es el último punto de rescate.
El proceso básico para actualizar Portainer CE es:
sudo docker pull portainer/portainer-ce:latest
sudo docker stop portainer
sudo docker rm portainer
sudo docker run -d \
-p 127.0.0.1:9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Como los datos están en el volumen portainer_data, eliminar el contenedor no elimina la configuración. Pero aun así se recomienda hacer una copia de seguridad antes de actualizar:
sudo docker run --rm \
-v portainer_data:/data \
-v "$PWD":/backup \
alpine tar czf /backup/portainer_data_backup.tar.gz -C /data .
Si no te gusta latest, puedes fijar una etiqueta de versión para reducir el riesgo de actualizaciones inesperadas. En entornos de producción se recomienda más bien fijar la versión y actualizar tras confirmarla en pruebas.
Primero confirma si el contenedor está en ejecución:
sudo docker ps --filter name=portainer
sudo docker logs --tail=100 portainer
Luego confirma que el puerto está escuchando:
sudo ss -lntp | grep 9443
Si lo vinculaste a 127.0.0.1:9443, acceder a IP:9443 desde la internet pública no funcionará de todos modos; necesitas acceder mediante el dominio del proxy inverso.
Comprueba si se ha montado el socket de Docker:
sudo docker inspect portainer | grep docker.sock
El comando de inicio debe incluir:
-v /var/run/docker.sock:/var/run/docker.sock
Sin este montaje, Portainer no puede controlar el Docker local.
Causas habituales:
- Errores de indentación en el YAML de Compose.
- Nombre de imagen incorrecto o fallo al descargar la imagen.
- Puerto ya en uso.
- Permisos insuficientes en la ruta del Volume.
- Variables faltantes en
.env.
Primero valida el archivo Compose en la línea de comandos:
docker compose config
Este comando puede ayudarte a encontrar la mayoría de los problemas de YAML y variables.
Sí, tras montar el socket de Docker, Portainer tiene privilegios muy altos. Quien pueda iniciar sesión en Portainer básicamente podrá gestionar los contenedores de esta máquina e incluso afectar al host a través de los contenedores.
Por eso es obligatorio:
- Usar una contraseña fuerte.
- No compartir la cuenta de administrador.
- Restringir el origen del acceso.
- Actualizar Portainer periódicamente.
- No exponer 9443 al escaneo de toda la internet.
Para un solo VPS, prefiero esta estructura:
公网用户
↓
Caddy / Nginx :443
↓
127.0.0.1:9443
↓
Portainer
↓
/var/run/docker.sock
↓
本机 Docker Engine
Los contenedores de aplicaciones también deberían vincularse a puertos locales en la medida de lo posible, y luego Caddy/Nginx los expone a la internet pública:
app.example.com -> Caddy -> 127.0.0.1:3000
portainer.example.com -> Caddy -> 127.0.0.1:9443
Así se reduce la superficie de exposición pública y se concentran todos los puntos de entrada en 80/443.
Portainer no es un sustituto de Docker, sino un complemento a la experiencia de gestión de Docker. Para un solo VPS, su valor más importante es: poder ver contenedores, registros, Volumes, Stacks y estado de ejecución sin iniciar sesión por SSH cada vez.
Pero sus privilegios son altos, así que no puede exponerse sin cuidado a la internet pública. La forma correcta es: guardar los datos de Portainer en un volumen de Docker, inicializar la cuenta de administrador con una contraseña fuerte, restringir 9443 a la máquina local o a fuentes de confianza, y luego acceder mediante Caddy/Nginx, VPN, Zero Trust, etc.
Si tu VPS ya ejecuta varios servicios Docker, Portainer puede reducir notablemente el coste de mantenimiento diario; si solo tienes un contenedor sencillo, no es imprescindible, pero como herramienta visual para aprender sobre el estado de Docker, las redes y los Volumes, merece mucho la pena instalarlo una vez.