Contenedores Docker conectados a un servidor Apache

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.

Raspberry pi server con docker

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.