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 portainer para fines de identificación y enlace.
  • La política de reinicio está configurada como always para que el contenedor permanezca activo durante el arranque.
  • La configuración privileged: true es 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 volumes mapea la carpeta en el host a las carpetas en el contenedor utilizando montajes de enlace. Hemos expuesto el directorio ~/portainer/data al contenedor para almacenar cualquier dato relevante y la API del socket de Docker para la gestión de contenedores. La etiqueta :Z le 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://:9443 en tu navegador, y obtendrás la siguiente pantalla.

Pantalla de instalación de Portainer

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.

Panel de Portainer

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

Inicio de Portainer

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

Página de inicio del entorno de Portainer

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.

Lista de redes de Portainer

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

Página de creación de red de Portainer

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

Página de stacks de Portainer

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

Página de agregar stack de Portainer

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.

Variables de entorno del stack de Portainer

Haz clic en el botón Deploy the stack para crear e iniciar el contenedor NPM.

Acceder a NPM

Abre la URL https://:81 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.

Panel de Nginx Proxy Manager

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

Agregar Portainer como 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.

Opciones SSL de Portainer NPM

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.

Redes conectadas de Portainer

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

Portainer conectado a 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.

Plantillas de aplicaciones de Portainer

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.

Despliegue de la aplicación Redis de Portainer

Paso 7 - Gestionar contenedores

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

Lista de contenedores de Portainer

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

Acciones del contenedor de Portainer

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.

Registros del contenedor de Portainer

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

Inspeccionar contenedor de Portainer

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

Estadísticas del contenedor de Portainer

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

Configuración de la consola del contenedor de Portainer

Presiona el botón Connect para lanzar la consola.

Consola del contenedor de Portainer

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.

Contenedor Hello World de Portainer

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.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.