En este post vamos a aprender como hacer una mezcla entre un servidor monolítico y micro-servicios usando Apache2 como reverse proxy para redireccionar paginas web a los contenedores Docker

Aunque en este post vamos a enfocarnos en la imagen de Ghost un blog, tambien aprenderemos a usar cualquier imagen de Docker Hub

Requisitos

  • Apache2 instalado en el servidor
  • Conocimientos básicos de Apache Virtual Hosts
  • Conocimientos básicos de linux
  • Conocimientos básicos de Docker

Laboratorio

  1. Selecciona tu imagen de Docker Hub en mi caso voy a instalar Ghost

Ghost ofrece una imagen oficial, asi que vamos a revisar que opciones incluye, usualmente cuando encuentras imagen oficial viene bien documentada

2. Lo primero que debemos de buscar es la arquitectura, para ver si es compatible con el CPU que este corriendo Docker

Si no encuentras la informacion en la descripción, busca en la pestaña de Tags

Una vez que te asegures que la imagen esta soportada, vamos a revisar las opciones que se mencionan.

  • -e url=http://localhost:3001 la opcion -e se usa para crear una variable de sistema dentro del contenedor, en este caso para indicar el dominio en el que va a responder y el puerto
  • -p 3001:2368 Esta opcion expone el puerto 3001 en el host y lo redirecciona al puerto 2368 en el contenedor
  • -v /path/to/ghost/blog:/var/lib/ghost esta opcion es para montar un directorio desde el host al contenedor.

Hay otras opciones mencionadas, pero no vamos a utilizarlas

3. Vamos a usar esas opciones y creemos nuestro comando

docker container run -d --name javierblog_ghost -v /var/www/javierblog.com/public_html:/var/lib/ghost/content --restart unless-stopped -e url=http://javierblog.com/ -p 3001:2368 ghost

Vamos a revisar que es lo que hicimos

--name javierblog_ghost este va a ser el nombre de nuestro contenedor

-v /var/www/javierblog.com/public_html:/var/lib/ghost/content este comando va a montar la direccion /var/www/javierblog.com/public_html en el host y /var/lib/ghost/content en el contenedor

--restart unless-stopped esta opcion establece la politica de reinicio, que le indica al contenedor que no se va a detener a menos de que se le diga explicitamente, esto quiere decir que si la maquina reinicia por alguna razon, docker, el contenedor iniciara automaticamente.

-e url=http://javierblog.com/ esta variable le va a decir al blog en que dominio va a responder, en este caso retire el puerto ya que de eso se encargara el proxy, si no tienes un dominio, puedes utilizar 127.0.0.1 como recomienda la imagen.

-p 3001:2368 esta opción expone el puerto 3001 en el host y redirecciona al puerto 2368 en el contenedor.

Si quieres leer mas información sobre el comando docker container run puedes hacerlo aquí

4. Después de correr el comando, revisamos que este corriendo con container ls

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
aa4d369beebf        ghost               "docker-entrypoint.s…"   3 hours ago         Up 3 hours          0.0.0.0:3001->2368/tcp   javierblog_ghost

5. Prueba que el contenedor este respondiendo con curl.

curl http://127.0.0.1:3001

Si obtienes una respuesta en un largo html, esta funcionando

Vamos a crear el archivo Virtual Host y redireccionar el trafico externo al puerto 3001

6. Activa los módulos necesarios para el proxy en apache2

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequest

7. Crea el archivo Virtual Host, en caso de que no tengas un dominio, puedes usar uno falso como example.com.

sudo touch /etc/apache2/sites-enabled/javierblog.com.conf

8. Edita el archivo con nano

sudo nano /etc/apache2/sites-enabled/javierblog.com.conf

Y agrega la siguiente información

<VirtualHost *:80>
	ServerAdmin javierlimonr@gmail.com
        ServerName javierblog.com
        ServerAlias www.javierblog.com
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:3001/ retry=0
        ProxyPassReverse / http://127.0.0.1:3001/
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Aqui la parte importante es ProxyPreserveHost On que habilita el proxy, ProxyPass and ProxyPassReverse van a redireccionar el trafico al puerto 3001

Si quieres leer mas sobre Virtual Host de Apache puedes hacerlo aquí

9. Activa la configuración

sudo a2ensite javierblog.com.conf

10. Recarga apache2

sudo systemctl reload apache2
En caso de usar un dominio falso, puedes editar tu archivo host  /etc/host (Linux) o C:\Windows\System32\drivers\etc\host (Windows) y agregar (servidor ip) yourfakedomain.com

11. Prueba la dirección en tu explorador.

Referencias: