Cómo instalar y utilizar 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 forma sencilla. Proporciona un panel de control basado en 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 utilizarla para crear y gestionar contenedores Docker para ejecutar distintas aplicaciones. También aprenderás a poner estos contenedores detrás de Nginx utilizando el gestor de proxy de 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 Completamente Cualificado (FQDN) que apunte al servidor para Portainer (portrainer.example.com) y al Gestor de Proxy Nginx (npm.example.com).

Paso 1 – Configurar el cortafuegos

Cent OS/Rocky Linux/Alma Linux

Deberías tener instalado el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Abre los puertos 80, 9443 y 443. Portainer utiliza el puerto 9443 para exponer su interfaz de usuario web a través de HTTPS. Nginx Proxy Manager utiliza el puerto 81 para su interfaz de usuario.

$ 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 cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Los sistemas Ubuntu y Debian utilizan ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Si lo está, 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 cortafuegos no se está ejecutando.

$ sudo ufw allow "OpenSSH"

Habilita el cortafuegos si no se está ejecutando.

$ sudo ufw enable

Si se está ejecutando, vuelve a cargarlo para aplicar los cambios.

$ sudo ufw reload

Paso 2 – Instala 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

Activa e inicia el servicio Docker.

$ sudo systemctl start docker --now

Añade tu nombre de usuario al grupo Docker.

$ sudo usermod -aG docker $USER

Sal del sistema y vuelve a entrar para aplicar el cambio.

Paso 3 – Instala 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 el permiso de ejecutable al binario.

$ sudo chmod +x /usr/local/bin/docker-compose

Paso 4 – Instala Portainer

Crea un directorio para Portainer.

$ mkdir ~/portainer

Cambia al directorio.

$ cd ~/portainer

Crea y abre el archivo Docker Compose para editarlo.

$ nano docker-compose.yaml

Pega en él el siguiente código.

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 pulsando Ctrl + X e introduciendo Y cuando se te pida.

Repasemos el archivo Docker Compose.

  • Estamos sacando la última versión de Portainer Community Edition de Docker Hub. Portainer Community Edition es de uso gratuito, mientras que su edición Business requiere una licencia de pago. Puedes utilizar la Edición Empresarial, pero se te pedirá la clave de licencia para utilizarla.
  • Hemos llamado a nuestro contenedor portainer para identificarlo y enlazarlo.
  • La política de reinicio está configurada en always para que el contenedor permanezca activo durante el arranque.
  • La configuración privileged: true es para que Portainer pueda acceder al socket Docker y ejecutarse en un contexto privilegiado, ya que estamos utilizando SELinux. Si no utilizas SELinux, puedes eliminar esta configuración. Esta configuración da acceso al contenedor Portainer a todo lo que hay en el sistema anfitrión, incluido el acceso al hardware. Por tanto, activa esta configuración sólo cuando sepas lo que estás haciendo.
  • La sección volumes asigna la carpeta del host a las carpetas del contenedor mediante montajes Bind. Hemos expuesto el directorio ~/portainer/data al contenedor para almacenar cualquier dato relevante y la API de socket de Docker para la gestión del contenedor. La etiqueta :Z indica a Docker que estamos ejecutando SELinux en nuestro anfitrión. Si no tienes SELinux activado, debes eliminar la etiqueta.

Inicia Portainer.

$ docker-compose up -d

Comprueba 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://<yourserverIP>:9443 en tu navegador, y obtendrás la siguiente pantalla.

Pantalla de instalación de cortinas

Se te pedirá que crees un nuevo usuario administrador. Añade los datos de tu usuario. Desmarca la casilla Permitir la recogida de estadísticas anónimas si te preocupa la privacidad. Pulsa el botón Crear usuario para iniciar la instalación y crear una nueva cuenta de administrador.

A continuación, aparecerá la siguiente pantalla del panel de control.

Tablero de Portainer

Tras unos segundos, se actualizará automáticamente y te mostrará la siguiente pantalla.

Portainer Inicio

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

Página de inicio del Entorno Portainer

La mayoría de las secciones se explican por sí mismas. La sección Pilas ayuda a crear contenedores utilizando archivos Docker compose. Puedes desplegar contenedores directamente utilizando la categoría Contenedores de la barra lateral. Puedes configurar el entorno Docker actual a través de la sección Hosts. La sección Plantillas de Aplicaciones viene con archivos Docker compose preinstalados para instalar las aplicaciones más comunes. También puedes crear plantillas personalizadas.

La sección Configuración te permite configurar varios ajustes, como añadir registros Docker personalizados, añadir varios hosts para Docker swarm, configurar el acceso de los usuarios, hacer copias de seguridad de los datos y personalizar Portainer.

Paso 5 – Coloca Portainer detrás de un proxy inverso utilizando Nginx Proxy Manager (NPM)

Antes de seguir adelante, vamos a poner Portainer detrás de un proxy inverso utilizando Nginx Proxy Manager. Nginx Proxy Manager es una aplicación de Docker que proporciona una interfaz de usuario de gestión web para configurar Nginx como host de proxy inverso. También puede utilizarse como redirección o como host de streaming.

Instalar NPM

El primer paso es crear una red para Nginx Proxy Manager (NPM). Abre la sección Redes y haz clic en el botón Añadir red para crear una nueva red.

Lista de Redes de Contenedores

Dale un nombre a la red y deja todos los ajustes sin modificar. Haz clic en el botón Crear la red para terminar.

Portainer Crear Página de Red

Visita las Pilas y crea una nueva pila utilizando el botón Añadir pila.

Página de pilas de contenedores

Nombra la pila como nginx-proxy-manager y pega en ella el siguiente código.

version: "3.3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '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"
      # Uncomment the line below if IPv6 is not enabled on your 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

Portainer Añadir Pila Página

Hemos establecido dos variables de entorno para establecer las contraseñas de la base de datos y de MySQL raíz. Portainer se puede utilizar para establecer secretos utilizando variables de entorno. Desplázate hacia abajo en la página y haz clic en el botón Añadir variable de entorno para añadir contraseñas seguras.

Variables de entorno de la pila de contenedores

Pulsa el botón Desplegar la pila para crear e iniciar el contenedor NPM.

Acceder a NPM

Abre la URL https://<yourserverIP>:81 en tu navegador, y obtendrás la siguiente pantalla. Introduce 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á inmediatamente que establezcas un nombre y una dirección de correo electrónico. Haz clic en el botón Guardar, y se te pedirá que crees una nueva contraseña. Vuelve a pulsar el botón Guardar para empezar.

Panel del Administrador de Proxy Nginx

Accede a Anfitriones >> Anfitriones Proxy y haz clic en el botón Añadir Anfitrión Proxy.

Añadir Portainer como Host Proxy

Introduce el nombre de dominio como portainer.example.com. Elige el esquema como https. Introduce el nombre del contenedor como Nombre de host de reenvío y 9443 como Puerto de reenvío. Marca las opciones Bloquear exploits comunes y Soporte de Websockets.

Opciones SSL de Portainer NPM

Cambia a la pestaña SSL y selecciona Solicitar un nuevo certificado SSL en el menú desplegable. Marca las opciones Forzar SSL y Soporte HTTP/2 para asegurar y optimizar tu conexión SSL. Introduce la dirección de correo electrónico para recibir notificaciones de renovación y acepta las condiciones del servicio. Haz clic en el botón Guardar para terminar de configurar el Host Proxy para Portainer.

Conectar Portainer al Contenedor NPM

Hemos configurado el Host Proxy, pero el contenedor aún no está conectado a la red NPM. Vuelve al panel de control de Portainer, visita la sección Contenedores y selecciona el contenedor Portainer.

Selecciona npm-network en el menú desplegable de la sección Redes conectadas y haz clic en el botón Unirse a la red para añadir el contenedor Portainer a la red del gestor de proxy.

Redes conectadas a contenedores

Puede que aparezca un error, pero actualiza la página y deberías ver el contenedor añadido a la red NPM.

Contenedor 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 de acceso público como https://npm.example.com, tal y como se explica en nuestro tutorial sobre el Gestor de Proxy Nginx.

Ahora que has establecido una URL pública para Portainer, puedes eliminar el puerto 9443 expuesto. Para ello, vuelve al Terminal y cambia al directorio portainer.

$ cd ~/portainer

Abre el archivo Docker compose para editarlo.

$ 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 pulsando Ctrl + X e introduciendo Y cuando se te pida.

Aquí hemos añadido los detalles de la red NPM porque necesitaremos reiniciar el contenedor Portainer.

Detén el contenedor Portainer.

$ docker-compose down --remove-orphans

Inicia de nuevo el contenedor con la configuración actualizada.

$ docker-compose up -d

Paso 6 – Despliega un contenedor utilizando la Plantilla App

Portainer proporciona varias plantillas predefinidas para lanzar aplicaciones directamente con una configuración mínima.

Plantillas Portainer App

Visita la sección Plantillas de Aplicaciones y selecciona cualquier plantilla. Dale un nombre y selecciona la red para utilizarla. Utiliza la sección de opciones avanzadas para desplegar puertos, redes y montajes de volumen personalizados.

Haz clic en el botón Desplegar el contenedor para terminar de desplegar tu aplicación. Aquí estamos desplegando el contenedor Redis.

Despliegue de la aplicación Portainer Redis

Paso 7 – Gestionar contenedores

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

Lista de contenedores

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

Acciones del Contenedor 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. Recrear creará el contenedor desde cero. La opción Duplicar/Editar te permitirá crear otro contenedor idéntico, permitiéndote cambiar la configuración antes de lanzarlo.

El Estado del conten edor muestra el tiempo de ejecución, la dirección IP y otros detalles sobre el contenedor.

La opción Registros muestra la salida del comando docker logs. Como la salida del comando no se almacena en caché, cada vez que actualizas la página, el comando se ejecuta desde cero.

Registros de Contenedores Portainer

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

Contenedor Inspeccionar

La opción Estadísticas te muestra el uso del contenedor en tiempo real.

Estadísticas del Contenedor Portainer

Puedes lanzar la consola del Contenedor utilizando la opción Consola. Se te pedirá el comando y el usuario del sistema para ejecutarlo.

Configuración de la Consola del Contenedor

Pulsa el botón Conectar para lanzar la consola.

Portacontenedores Consola Shell

La opción Conectar 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 son 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

La creación de cualquier contenedor externo a Portainer se mostrará dentro de él siempre que se cree en el mismo sistema en el que se esté ejecutando Portainer. Esto es posible porque Portainer se conecta con Docker utilizando el websocket.

Hagamos una prueba ejecutando el contenedor Docker Hola Mundo.

$ 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/

Comprueba la lista de contenedores en el terminal. Estamos utilizando 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, comprueba la página de Contenedores Portainer, y el contenedor hola mundo aparecerá como detenido en la lista con el mismo nombre.

Contenedor Hola Mundo Contenedor

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y el uso de Portainer para la gestión de Docker y el Gestor de Proxy Nginx. Exploraremos la creación de imágenes 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ícala en los comentarios a continuación.

También te podría gustar...