Docker Management · 13 min read · Sep 22, 2025
Cómo instalar y usar Portainer para la gestión de Docker con Nginx Proxy Manager

Portainer es una solución de gestión de contenedores de código abierto para Docker, Kubernetes y Nomad que simplifica el inicio, la creación y la ejecución de contenedores de manera sencilla. Proporciona un panel basado en la web para gestionar contenedores, imágenes, redes y volúmenes.
En este tutorial, aprenderás a instalar y configurar la solución de gestión de contenedores Portainer en un servidor Linux y a usarla para crear y gestionar contenedores Docker para ejecutar diferentes aplicaciones. También aprenderás a poner estos contenedores detrás de Nginx utilizando el gestor de proxy Nginx.
Requisitos previos
- Un servidor Linux que ejecute Ubuntu / Debian / Cent OS / Rocky Linux 8 / Alma Linux.
- Un usuario no root con privilegios sudo.
- Un Nombre de Dominio Totalmente Calificado (FQDN) apuntando al servidor para Portainer (
portrainer.example.com) y Nginx Proxy Manager (npm.example.com).
Paso 1 - Configurar el Firewall
Cent OS/Rocky Linux/Alma Linux
Deberías tener instalado el firewall Firewalld. Verifica el estado del firewall.
$ sudo firewall-cmd --state
running
Abre los puertos 80, 9443 y 443. Portainer utiliza el puerto 9443 para exponer su interfaz web a través de HTTPS. Nginx Proxy Manager utiliza el puerto 81 para su interfaz.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=9443/tcp
$ sudo firewall-cmd --permanent --add-port=81/tcp
Recarga el firewall para habilitar los cambios.
$ sudo firewall-cmd --reload
Ubuntu/Debian
Los sistemas Ubuntu y Debian utilizan ufw (Uncomplicated Firewall) por defecto.
Verifica si el firewall está en funcionamiento.
$ sudo ufw status
Si está en funcionamiento, abre los puertos 80, 9443 y 443.
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 9443
$ sudo ufw allow 81
Abre el puerto SSH si el firewall no está en funcionamiento.
$ sudo ufw allow "OpenSSH"
Habilita el firewall si no está en funcionamiento.
$ sudo ufw enable
Si está en funcionamiento, recárgalo para aplicar los cambios.
$ sudo ufw reload
Paso 2 - Instalar Docker
Cent OS/Rocky Linux/Alma Linux
Ejecuta el siguiente comando para instalar Docker.
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
Ubuntu
$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
Debian
$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
Habilita e inicia el servicio Docker.
$ sudo systemctl start docker --now
Agrega tu nombre de usuario al grupo Docker.
$ sudo usermod -aG docker $USER
Cierra sesión del sistema y vuelve a iniciar sesión para aplicar el cambio.
Paso 3 - Instalar Docker Compose
Descarga e instala el binario de Docker Compose.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Aplica permisos ejecutables al binario.
$ sudo chmod +x /usr/local/bin/docker-compose
Paso 4 - Instalar Portainer
Crea un directorio para Portainer.
$ mkdir ~/portainer
Cambia al directorio.
$ cd ~/portainer
Crea y abre el archivo Docker Compose para editar.
$ nano docker-compose.yaml
Pega el siguiente código en él.
version: "3.3"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
privileged: true
volumes:
- ./data:/data:Z
- /var/run/docker.sock:/var/run/docker.sock:Z
ports:
- 9443:9443
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Repasemos el archivo Docker Compose.
- Estamos extrayendo la última versión de la Edición Comunitaria de Portainer desde Docker Hub. La Edición Comunitaria de Portainer es gratuita, mientras que su edición empresarial requiere una licencia paga. Puedes extraer la Edición Empresarial, pero se te pedirá la clave de licencia para usarla.
- Hemos nombrado nuestro contenedor como
portainerpara fines de identificación y enlace. - La política de reinicio está configurada como
alwayspara que el contenedor permanezca activo durante el arranque. - La configuración
privileged: truees para que Portainer pueda acceder al socket de Docker y ejecutarse en un contexto privilegiado ya que estamos utilizando SELinux. Si no estás utilizando SELinux, puedes eliminar esta configuración. Esta configuración le da al contenedor de Portainer acceso a todo en el sistema host, incluido el acceso al hardware. Por lo tanto, habilita esta configuración solo cuando sepas lo que estás haciendo. - La sección
volumesmapea la carpeta en el host a las carpetas en el contenedor utilizando montajes de enlace. Hemos expuesto el directorio~/portainer/dataal contenedor para almacenar cualquier dato relevante y la API del socket de Docker para la gestión de contenedores. La etiqueta:Zle dice a Docker que estamos ejecutando SELinux en nuestro host. Si no tienes SELinux habilitado, deberías eliminar la etiqueta.
Inicia Portainer.
$ docker-compose up -d
Verifica el estado del contenedor.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
916411e8d12e portainer/portainer-ce:latest "/portainer" 5 seconds ago Up 4 seconds 8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer
Paso 5 - Acceder y configurar Portainer
Abre la URL https:// en tu navegador, y obtendrás la siguiente pantalla.

Se te pedirá que crees un nuevo usuario administrador. Agrega los detalles de tu usuario. Desmarca la casilla Permitir la recopilación de estadísticas anónimas si te importa la privacidad. Haz clic en el botón Crear usuario para comenzar la instalación y crear una nueva cuenta de administrador.
A continuación, serás llevado a la siguiente pantalla del panel.

Después de unos segundos, se actualizará automáticamente y te mostrará la siguiente pantalla.

Te mostrará el entorno local en el que se está ejecutando Portainer. Haz clic en el entorno local para comenzar.

La mayoría de las secciones son autoexplicativas. La sección Stacks ayuda a crear contenedores utilizando archivos Docker Compose. Puedes desplegar contenedores directamente utilizando la categoría Containers en la barra lateral. Puedes configurar el entorno Docker actual a través de la sección Hosts. La sección App Templates viene con archivos Docker Compose preinstalados para instalar las aplicaciones más comunes. También puedes crear plantillas personalizadas.
La sección Settings te permite configurar varias opciones, como agregar registros Docker personalizados, agregar múltiples hosts para Docker swarm, configurar el acceso de usuarios, hacer copias de seguridad de datos y personalizar Portainer.
Paso 5 - Poner Portainer detrás de un proxy inverso usando Nginx Proxy Manager (NPM)
Antes de continuar, pongamos a Portainer detrás de un proxy inverso usando Nginx Proxy Manager. Nginx Proxy Manager es una aplicación Docker que proporciona una interfaz de gestión web para configurar Nginx como un host de proxy inverso. También se puede utilizar como un host de redirección o de streaming.
Instalar NPM
El primer paso es crear una red para Nginx Proxy Manager (NPM). Abre la sección Networks y haz clic en el botón Add Network para crear una nueva red.

Dale un nombre a la red y deja todas las configuraciones sin cambios. Haz clic en el botón Create the network para finalizar.

Visita la sección Stacks y crea un nuevo stack usando el botón Add stack.

Nombra el stack como nginx-proxy-manager y pega el siguiente código en él.
version: "3.3"
services:
npm-app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm-app
restart: unless-stopped
ports:
- '80:80' # Puerto HTTP público
- '443:443' # Puerto HTTPS público
- '81:81' # Puerto web de administración
# Agrega cualquier otro puerto de streaming que desees exponer
# - '21:21' # FTP
environment:
DB_MYSQL_HOST: "npm-db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
DB_MYSQL_NAME: "npm"
# Descomenta la línea a continuación si IPv6 no está habilitado en tu host
# DISABLE_IPV6: 'true'
volumes:
- ./npm-data:/data:Z
- ./letsencrypt:/etc/letsencrypt:Z
depends_on:
- npm-db
networks:
- npm-network
- npm-internal
npm-db:
image: 'mariadb:latest'
container_name: npm-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
volumes:
- ./npm-data/mysql:/var/lib/mysql:Z
networks:
- npm-internal
networks:
npm-internal:
npm-network:
external: true

Hemos configurado dos variables de entorno para establecer las contraseñas de la base de datos y del root de MySQL. Portainer puede ser utilizado para establecer secretos utilizando variables de entorno. Desplázate hacia abajo en la página y haz clic en el botón Add environment variable para agregar contraseñas fuertes.

Haz clic en el botón Deploy the stack para crear e iniciar el contenedor NPM.
Acceder a NPM
Abre la URL https:// en tu navegador, y obtendrás la siguiente pantalla. Ingresa las siguientes credenciales predeterminadas para iniciar sesión.
Dirección de correo electrónico: [email protected] Contraseña: changeme
A continuación, se te pedirá que establezcas un nombre y una dirección de correo electrónico. Haz clic en el botón Save, y se te pedirá que crees una nueva contraseña. Haz clic en el botón Save nuevamente para comenzar.

Visita Hosts >> Proxy Hosts y haz clic en el botón Add Proxy Host.

Ingresa el nombre de dominio como portainer.example.com. Elige el esquema como https. Ingresa el nombre del contenedor como Forward Hostname y 9443 como Forward port. Marca las opciones Block Common Exploits y Websockets Support.

Cambia a la pestaña SSL y selecciona Request a new SSL Certificate en el menú desplegable. Marca las opciones Force SSL y HTTP/2 Support para asegurar y optimizar tu conexión SSL. Ingresa la dirección de correo electrónico para recibir notificaciones de renovación y acepta los términos del servicio. Haz clic en el botón Save para finalizar la configuración del Proxy Host para Portainer.
Conectar Portainer al contenedor NPM
Hemos configurado el Proxy host, pero el contenedor aún no está conectado a la red NPM. Regresa al panel de Portainer, visita la sección Containers y selecciona el contenedor portainer.
Selecciona npm-network en el menú desplegable bajo la sección Connected networks y haz clic en el botón Join network para agregar el contenedor de Portainer a la red del gestor de proxy.

Es posible que obtengas un error, pero actualiza la página y deberías ver el contenedor agregado a la red NPM.

Deberías poder acceder a Portainer utilizando la URL https://portainer.example.com en tu navegador.
Puedes seguir un procedimiento similar para poner NPM detrás de una URL accesible públicamente como, https://npm.example.com como se discutió en nuestro tutorial de Nginx Proxy Manager.
Ahora que has establecido una URL pública para Portainer, puedes eliminar el puerto 9443 expuesto. Para hacerlo, regresa a la Terminal y cambia al directorio de portainer.
$ cd ~/portainer
Abre el archivo Docker Compose para editar.
$ nano docker-compose.yaml
Elimina la sección de puertos comentándola, como se muestra a continuación.
version: "3.3"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
privileged: true
volumes:
- ./data:/data:Z
- /var/run/docker.sock:/var/run/docker.sock:Z
#ports:
# - 9443:9443
networks:
- npm-network
networks:
npm-network:
external: true
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Aquí, hemos agregado los detalles de la red NPM porque necesitaremos reiniciar el contenedor de Portainer.
Detén el contenedor de Portainer.
$ docker-compose down --remove-orphans
Inicia el contenedor nuevamente con la configuración actualizada.
$ docker-compose up -d
Paso 6 - Desplegar un contenedor utilizando App Template
Portainer proporciona varias plantillas predefinidas para lanzar aplicaciones directamente con una configuración mínima.

Visita la sección App Templates y selecciona cualquier plantilla. Dale un nombre y selecciona la red para usar. Utiliza la sección de opciones avanzadas para desplegar puertos, redes y montajes de volumen personalizados.
Haz clic en el botón Deploy the container para finalizar el despliegue de tu aplicación. Aquí estamos desplegando el contenedor Redis.

Paso 7 - Gestionar contenedores
Gestionemos un contenedor existente. Abre la página de contenedores y verás todos los contenedores en ejecución.

Haz clic en el contenedor hw-redis creado recientemente para continuar.

En la parte superior, puedes ver una lista de acciones que puedes realizar en un contenedor en ejecución. Puedes detener y matar el contenedor. Recreate creará el contenedor desde cero. La opción Duplicate/Edit te permitirá crear otro contenedor idéntico permitiéndote cambiar configuraciones antes de lanzarlo.
El estado del contenedor muestra el tiempo de ejecución, la dirección IP y otros detalles sobre el contenedor.
La opción Logs muestra la salida del comando docker logs. Dado que la salida del comando no se almacena en caché, cada vez que actualizas la página, el comando se ejecuta desde cero.

La opción Inspect ejecuta el comando docker inspect en el contenedor y muestra su salida.

La opción Stats te muestra el uso del contenedor en tiempo real.

Puedes lanzar la consola del contenedor utilizando la opción Console. Se te pedirá el comando y el usuario del sistema para ejecutar.

Presiona el botón Connect para lanzar la consola.

La opción Attach ejecuta el comando docker attach.
Hay otras opciones en la página de detalles del contenedor. Puedes crear una imagen utilizando un contenedor existente. Otras opciones incluyen cambiar la política de reinicio de un contenedor y conectar o desconectar una red a un contenedor existente.
Adjuntar un contenedor externo a Portainer
Crear cualquier contenedor fuera de Portainer aparecerá dentro de él siempre que se cree en el mismo sistema en el que se está ejecutando Portainer. Esto es posible porque Portainer está conectado a Docker usando el websocket.
Probemos ejecutando el contenedor Docker Hello World.
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Verifica la lista de contenedores en la terminal. Estamos usando la bandera -a para mostrar la lista de todos los contenedores, incluidos los detenidos. Puedes ver el nombre del contenedor como sad_williamson.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5fa46b85d594 hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago sad_williamson
.....
Ahora, verifica la página de contenedores de Portainer, y el contenedor hello world aparecerá como detenido en la lista con el mismo nombre.

Conclusión
Esto concluye nuestro tutorial sobre la instalación y uso de Portainer para la gestión de Docker y Nginx Proxy Manager. Exploraremos la construcción de imágenes de Docker, la creación de contenedores personalizados y el uso de Portainer con Docker swarm en un próximo tutorial. Si tienes alguna pregunta, publícalas en los comentarios a continuación.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.