Cómo instalar y utilizar Portainer para la gestión de Docker con Nginx Proxy Manager

Pantalla de instalación de contenedores

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 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 utilizarla 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 de Nginx.

Requisitos previos

  • Un servidor Linux con Ubuntu / Debian / Cent OS / Rocky Linux 8 / Alma Linux.
  • Un usuario no root con privilegios sudo.
  • Un Nombre de Dominio Completamente Calificado (FQDN) que apunte al servidor para Portainer (portrainer.example.com) y al Administrador de Proxy Nginx (npm.example.com).

Paso 1 – Configurar el Firewall

Cent OS/Rocky Linux/Alma Linux

Debería tener instalado el cortafuegos Firewalld. Compruebe el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Abra los puertos 80, 9443 y 443. Portainer utiliza el puerto 9443 para exponer su UI web vía HTTPS. Nginx Proxy Manager utiliza el puerto 81 para su UI.

$ 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

Recargue el cortafuegos para habilitar los cambios.

$ sudo firewall-cmd --reload

Ubuntu/Debian

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

Compruebe si el cortafuegos se está ejecutando.

$ sudo ufw status

Si está funcionando, abra los puertos 80, 9443 y 443.

$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 9443
$ sudo ufw allow 81

Abra el puerto SSH si el cortafuegos no se está ejecutando.

$ sudo ufw allow "OpenSSH"

Habilite el cortafuegos si no se está ejecutando.

$ sudo ufw enable

Si se está ejecutando, recárguelo para aplicar los cambios.

$ sudo ufw reload

Paso 2 – Instalar Docker

Cent OS/Rocky Linux/Alma Linux

Ejecute 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

Habilite e inicie el servicio Docker.

$ sudo systemctl start docker --now

Añada su nombre de usuario al grupo Docker.

$ sudo usermod -aG docker $USER

Salga del sistema y vuelva a entrar para aplicar el cambio.

Paso 3 – Instalar Docker Compose

Descargue e instale 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

Aplique el permiso de ejecución al binario.

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

Paso 4 – Instalar Portainer

Cree un directorio para Portainer.

$ mkdir ~/portainer

Cambie al directorio.

$ cd ~/portainer

Cree y abra el archivo Docker Compose para editarlo.Anuncio

$ nano docker-compose.yaml

Pegue 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

Guarde el archivo pulsando Ctrl + X e introduciendo Y cuando se le solicite.

Repasemos el archivo Docker compose.

  • Estamos sacando la última versión de Portainer Community Edition de Docker Hub. La Edición Comunitaria de Portainer es de uso gratuito, mientras que su Edición Empresarial requiere una licencia de pago. Usted puede sacar la Edición Empresarial, pero se le pedirá la clave de la licencia para usarla.
  • Hemos llamado a nuestro contenedor como portainer para identificarlo y enlazarlo.
  • La política de reinicio está establecida en siempre para que el contenedor permanezca activo durante el arranque.
  • La configuración privilegiada: true es para que Portainer pueda acceder al socket de Docker y se ejecute en un contexto privilegiado ya que estamos utilizando SELinux. Si no está utilizando SELinux, puede eliminar esta configuración. Esta configuración le da al contenedor Portainer acceso a todo en el sistema anfitrión, incluyendo el acceso al hardware. Por lo tanto, habilite esta configuración sólo cuando sepa lo que está haciendo.
  • La sección de volúmenes mapea la carpeta en el host a las carpetas en el contenedor usando montajes Bind. Hemos expuesto el directorio ~/portainer/data al contenedor para almacenar cualquier dato relevante y el socket API de Docker para la gestión del contenedor. La etiqueta :Z indica a Docker que estamos ejecutando SELinux en nuestro host. Si no tienes SELinux habilitado, debes quitar la etiqueta.

Inicie el Portainer.

$ docker-compose up -d

Compruebe 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 – Acceso y configuración del contenedor

Abra la URL https://<yourserverIP>:9443 en su navegador, y obtendrá la siguiente pantalla.

Pantalla de instalación de contenedores

Se le pedirá que cree un nuevo usuario administrador. Agregue los detalles de su usuario. Desmarque la casilla Permitir la recogida de estadísticas anónimas si le preocupa la privacidad. Haga clic en 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.

Panel de control del contenedor

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

Inicio de Portainer

Le mostrará el entorno local en el que se está ejecutando Portainer. Haga clic en el local para empezar.

Página de inicio del entorno Portainer

La mayoría de las secciones se explican por sí mismas. La página web Pilas ayuda en la creación de contenedores usando archivos Docker compose. Puede desplegar contenedores directamente utilizando el Contenedores en la barra lateral. Puede configurar el entorno actual de Docker a través de la opción Hosts sección. La página web Plantillas de aplicaciones sección viene con archivos de composición Docker preinstalados para instalar las aplicaciones más comunes. También puede crear plantillas personalizadas.Anuncio

El Ajustes le permite configurar varios ajustes como añadir registros Docker personalizados, añadir múltiples hosts para Docker swarm, configurar el acceso de los usuarios, hacer copias de seguridad de los datos y personalizar Portainer.

Paso 5 – Poner Portainer detrás de un proxy inverso utilizando el 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 Docker que proporciona una interfaz de usuario de gestión web para configurar Nginx como un host de proxy inverso. También se puede utilizar como una redirección o un host de streaming.

Instalar NPM

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

Lista de redes de contenedores

Dé un nombre a la red y deje todos los ajustes sin modificar. Haga clic en el botón Crear la red para terminar.

Portainer Crear Página de Red

Visite el Pilas y crear una nueva pila utilizando el Añadir pila botón.

Página de pilas de contenedores

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

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 Página de Pila

Hemos establecido dos variables de entorno para establecer las contraseñas de la base de datos y del root de MySQL. Portainer puede ser usado para establecer secretos usando variables de ambiente. Desplácese hacia abajo en la página y haga clic en el botón Añadir variable de entorno para añadir contraseñas seguras.

Variables de entorno de la pila de contenedores

Haga clic en el botón Desplegar la pila para crear e iniciar el contenedor NPM.

Acceder a NPM

Abra la URL https://<yourserverIP>:81 en su navegador, y obtendrá la siguiente pantalla. Introduzca las siguientes credenciales por defecto para iniciar sesión.

Dirección de correo electrónico: [email protected] Contraseña: changeme

A continuación, se le pedirá inmediatamente que establezca un nombre y una dirección de correo electrónico. Haga clic en el botón Guardar y se le pedirá que cree una nueva contraseña. Haga clic en el botón Guardar para empezar.

Tablero del Administrador de Proxy Nginx

Visite el Hosts >> Proxy Hosts y haga clic en el botón Añadir host proxy botón.

Añadir Portainer como Host Proxy

Ingrese el nombre del dominio como portainer.ejemplo.com. Elija el esquema como https. Introduzca el nombre del contenedor como Nombre de host de reenvío y 9443 como Puerto de reenvío. Compruebe las opciones Bloqueo de explotaciones comunes y Soporte de Websockets opciones.

Opciones NPM SSL de Portainer

Cambie a la pestaña SSL y seleccione Solicitar un nuevo certificado SSL en el menú desplegable. Compruebe el Forzar SSL y Soporte de HTTP/2 opciones para asegurar y optimizar su conexión SSL. Introduzca la dirección de correo electrónico para recibir notificaciones de renovación y acepte las condiciones del servicio. Haga clic en el botón Guardar para terminar de configurar el Host Proxy para el Portainer.

Conecte Portainer al Contenedor NPM

Hemos configurado el host Proxy, pero el contenedor aún no está conectado a la red NPM. Vuelva al panel de control de Portainer, visite la sección Contenedores y seleccione la sección contenedor contenedor.

Seleccione npm-network en el menú desplegable bajo el Redes conectadas y haga clic en el botón Unirse a la red para añadir el contenedor Portainer a la red del gestor de proxies.

Redes conectadas al contenedor

Puede aparecer un error, pero actualice la página y debería ver el contenedor añadido a la red NPM.

Contenedor conectado a NPM

Debería poder acceder a Portainer utilizando la URL https://portainer.example.com en su navegador.

Puede seguir un procedimiento similar para poner NPM detrás de una URL de acceso público como, https://npm.example.com como se discute en nuestro tutorial de Nginx Proxy Manager.

Ahora que ha establecido una URL pública para Portainer, puede eliminar el puerto expuesto 9443. Para ello, vuelva a la Terminal y cambie al directorio de Portainer.

$ cd ~/portainer

Abra el archivo Docker compose para editarlo.

$ nano docker-compose.yaml

Elimine 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

Guarde el archivo pulsando Ctrl + X e introduciendo Y cuando se le solicite.

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

Detenga el contenedor Portainer.

$ docker-compose down --remove-orphans

Inicie el contenedor nuevamente con la configuración actualizada.

$ docker-compose up -d

Paso 6 – Desplegar un contenedor usando la Plantilla de la Aplicación

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

Plantillas de aplicaciones de Portainer

Visite el Plantillas de aplicaciones y seleccione cualquier plantilla. Dele un nombre y seleccione la red a utilizar. Utilice la sección de opciones avanzadas para desplegar puertos, redes y montajes de volumen personalizados.

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

Despliegue del contenedor Redis

Paso 7 – Gestionar contenedores

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

Lista de contenedores

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

Acciones del contenedor

En la parte superior, puede ver una lista de acciones que puede realizar en un contenedor en ejecución. Puede detener y matar el contenedor. Recrear creará el contenedor desde cero. La página web Duplicar/Editar le permitirá crear otro contenedor idéntico que le permitirá cambiar la configuración antes de lanzarlo.

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

El Registros muestra la salida del comando docker logs. Como la salida del comando no se almacena en caché, cada vez que se actualiza la página, el comando se ejecuta desde cero.

Registros de Contenedores

El Inspeccionar ejecuta el comando docker inspect en el contenedor y muestra su resultado.

Inspección del contenedor Portainer

El Estadísticas le muestra el uso del contenedor en tiempo real.

Estadísticas del contenedor

Puede lanzar la consola del Contenedor utilizando el botón Consola opción. Se le pedirá el comando y el usuario del sistema a ejecutar.

Configuración de la consola del contenedor Portainer

Pulse el botón Conectar para iniciar la consola.

Consola del contenedor Portainer Shell

El Adjuntar ejecuta el comando docker attach.

Hay otras opciones en la página de detalles del contenedor. Puede 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

La creación de cualquier contenedor fuera de Portainer se mostrará dentro de él siempre y cuando sea creado en el mismo sistema que Portainer está corriendo. Esto es posible porque Portainer está conectado con Docker utilizando el websocket.

Probemos 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 la terminal. Estamos usando la bandera -a para mostrar la lista de todos los contenedores, incluyendo 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, revise la página de Contenedores Portainer, y el hola mundo el contenedor aparecerá detenido en la lista con el mismo nombre.

Contenedor Hola Mundo

Conclusión

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 construcció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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *