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.
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.
Tras 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 empezar.
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.
Dale un nombre a la red y deja todos los ajustes sin modificar. Haz clic en el botón Crear la red para terminar.
Visita las Pilas y crea una nueva pila utilizando el botón Añadir pila.
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
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.
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.
Accede a Anfitriones >> Anfitriones Proxy y haz clic en el botón Añadir Anfitrión 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.
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.
Puede que aparezca un error, pero actualiza la página y deberías ver el contenedor añadido 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 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.
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.
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.
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. 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.
La opción Inspeccionar ejecuta el comando docker inspect
en el contenedor y muestra su salida.
La opción Estadísticas te muestra el uso del contenedor en tiempo real.
Puedes lanzar la consola del Contenedor utilizando la opción Consola. Se te pedirá el comando y el usuario del sistema para ejecutarlo.
Pulsa el botón Conectar para lanzar la consola.
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.
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.