DEV Community

Horacio Degiorgi
Horacio Degiorgi

Posted on • Edited on

Múltiples aplicaciones en contenedores docker con proxy reverso Nginx y SSL.

Introducción

Primero un poco del porqué armar un esquema como el siguiente:

  • Tengo varias aplicaciones que prefiero mantener aisladas: moodle, wordpress y una web app.
  • Tengo un server con suficiente RAM y Linux (ubuntu-server instalado)
  • Tengo conocimientos de docker.
  • Desarrollo las aplicaciones en local en docker.
  • Tengo pensado migrar una de las aplicaciones a su propio server más adelante.
  • Tengo una única IP pública donde puedo apuntar todos los dominios y subdominios que necesite.

El esquema que persigo es el siguiente:
esquema de un webproxy y varias aplicaciones en docker

Ingredientes

Algunos ingredientes de esta receta:

  • conocimientos básicos de docker y docker-compose.
  • un contenedor que permita gestionar los certificados SSL y funcione como proxy reverso.
  • un contenedor moodle.
  • un contenedor wordpress
  • un contenedor php 7.2 para la aplicación web.
  • un contenedor mysql
  • un contenedor postgresql.

Explicación

Cada contenedor puede ser definido en su archivo docker-compose o todos juntos en el mismo.
Pensando en que voy a migrar alguna de las aplicaciones fuera del host voy a crear tres archivos docker-composer.yml.

Proxy

Primero configurar el NGINX-PROXY-SERVER con el contenedor creado por Evert Ramos que encontramos en Github.

Creamos un directorio para clonar dentro el repositorio.
1- Luego de clonarlo solo tenemos que editar el archivo de configuración copiando el ejemplo que trae el repositorio. Lo importante ahí es la IP pública del server y el nombre de la red interna docker que llamaremos "webproxy". Usando esta red los distintos contenedores se conectarán mediante la red interna y le solicitarán a uno de los servicios que se instalan la creación de certificados. Otro de los servicios instalados permiten la publicación externa usando el módulo proxy-reverso de nginx.
2- creamos otro directorio e instalamos el contenedor para wordpress. Para esta sección usé el repositorio del nezar
La instalación es muy simple y lo único que hay que agregar el es código siguiente al final del archivo docker-compose.yml para indicar que use la red creada anteriormente.

Importante: la sección de base de datos y otros datos no los he colocado aquí, el repositorio tiene toda la información necesaria.

Arrancamos los servicios.

Primero tenemos que arrancar el webproxy con docker-compose up -d

Una vez iniciado este contenedor y los servicios que corre quedan a la espera de otros contenedores en la misma red que expongan las variables de entorno: LETSENCRYPT_EMAIL ,LETSENCRYPT_HOST y VIRTUAL_HOST.
Toma estas variables y realiza una petición a letsencryt para obtener los certificados.
Si. Parece magia pero con solo estos pasos el contenedor con el wordpress queda publicado con un certificado SSL que se autorenueva.

Cualquier otro contenedor que lleve las mismas variables y se encuentre en la misma red queda publicado con las mismas condiciones y el "candado cerrado" indicando que es una web segura.

si te quedan dudas sobre los pasos o algo técnico puedo ayudar si me contactas por twitter

Top comments (6)

Collapse
 
dataura profile image
technaxx

hola gran receta yo quiero exponer un contenedor de docker que es un chatbot SSR con vite y svelte que a su vez trabajan dentro dentro de un backend separado en otros contenedores, actualmente puedo ver el localhost:8505 el frontend y funciona pero si lo expongo a nginx usando un proxy inverso y una ruta /ui + la config location /ui {
proxy_pass localhost:8505;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
try_files $uri $uri/ /ui/index.html;

creo que esta mal lo de /ui/index.html porque en realidad solo quiero que redireccione el puerto no que busque los archivos pero aun asi no funciona tls lo estaría manejando el dominio principal, habria que hacer algo para que funcione ?

Collapse
 
dataura profile image
technaxx

bueno viendo un poco la configuración hay que cambiar una linea en docker para que el recurso exista dentro del contenedor, (el recurso ui) aunque esto es solo a modo de prueba por si se quiere exponer el contenedor a la web desde un nginx, los contenedores están en modo desarrollador, habría que hacer unas mejoras de seguridad pero debería funcionar.

Collapse
 
chafarleston profile image
charles paul requena palomino

wow una consulta y para moodle

Collapse
 
horaciodegiorgi profile image
Horacio Degiorgi

tengo una receta para moodle 3.8 con docker compose.
gist.github.com/horaciod/2975a118d...
saludos

Collapse
 
chafarleston profile image
charles paul requena palomino

pero no tiene las variables de letsencryt para los certificados

Collapse
 
eduardo_dx profile image
Eduardo D.

Muy buen post, ahora ya me aclaro unas dudas.
Muchas gracias