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
- 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: