Por Manolo Gómez | March 27, 2022
Como correr diferentes servicios en contenedores sobre un servidor apache con multihosting mediante virtualhosts para tener servicios con diferentes tecnologías aislados.
Ya hace mucho tiempo uso servidor web apache con virtualhost en un VPS para poner en producción mis aplicaciones web, hace mucho tiempo que uso también docker para desarrollo y disfruto de sus ventajas, me surge la necesidad de deployar nuevas aplicaciones dockerizadas a mi servidor apache.
La idea se crear un subdominio o dominio en el virtualhost de apache y a este conectarle una aplicación encapsulada dentro del un contenedor.
Partimos de un servidos donde ya tenemos corriendo un servicio de apache. Lo primero que necesitamos es instalar los siguientes modulo de apache:
sudo a2enmod proxy
sudo a2enmod proxy_http
Creamos el archivo de configuración del virtual host para ello en la carpeta /etc/apache2/sites-available/ crearemos el archivo ejemplo.manolog.es.conf
sudo nano /etc/apache2/sites-available/ejemplo.manolog.es.conf
La aplicación que vamos a conectar a este subdominio es netdata, un contenedor de motorización que correr en el puerto 19999, este puerto debe de ser único por cada aplicación como es lógico.
<VirtualHost *:80>
ServerAdmin admin@ejemplo.manolog.es
ServerName ejemplo.manolog.es
ServerAlias www.ejemplo.manolog.es
ProxyRequests Off
ProxyPreserveHost On
<Location />
Require all granted
</Location>
ProxyPass / http://localhost:19999/
ProxyPassReverse / http://localhost:19999/
ErrorLog /var/www/ejemplo.manolog.es/log/error.log
CustomLog /var/www/ejemplo.manolog.es/log/access.log combined
</VirtualHost>
Y ahora vamos crear un docker-compose para que corra nuestra aplicación, lo importante es la propiedad de network_mode: “host” es decir, corre en la red de la maquina anfitrión con lo que la aplicación conecta con el puerto en el que se ejecuta. Es decir, el puerto interno en el que corre nuestra aplicación con el asignado el en proxypass de nuestro virtual host.
# docker-compose.yml
version: "3.1"
services:
netdata:
image: netdata/netdata:v1.19.0
restart: always
network_mode: "host"
volumes:
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- netdata-etc:/etc/netdata
cap_add:
- SYS_PTRACE
security_opt:
- apparmor=unconfined
activamos el virtual host con el subdominio creado
sudo a2ensite ejemplo.manolog.es.conf
y corremos el docker-compose como demonio.
docker-compose up -d
Con esto en cuanto cambiemos la dns de nuestro dominio y apunten al servidor ya tenemos nuestro subdominio corriendo sobre apache con la app dentro de un contenedor docker.