Tabla de Contenidos

4.c Despliegue avanzado en Servidor: Redes y Proxy

Gestión de Redes

Docker permite crear redes aisladas entre los distintos contenedores. De esa forma , si un contenedor es atacado, no se tendrá acceso por red al resto de los contenedores sino únicamente a los de su propia red.

Orden Explicación
docker network create Crea una red
docker network rm Borrar una red
docker network ls Ver las redes que hay
docker network connect Conecta un contenedor a una red
docker network disconnect Desconecta un contenedor de una red

Para trabajar con redes, lo que debemos hacer es

docker network create nombreDeLaRed
docker network connect nombreDeLaRed nombreDelContenedor
docker container run \
 -dit \
 -v /opt/mariadb:/var/lib/mysql  \
 -e MYSQL_ROOT_PASSWORD=root  \
 -p 4000:3306  \
 --network nombreDeLaRed \
 --name  prueba_mariadb \
 mariadb:10.1




Proxy con Nginx

¿Recuerdas la cabecera Host de HTTP? Servía para indicar a que servidor web iba dirigida la petición ya que en una misma máquina se ponían varios servidores web.

Pues vamos ahora a configurar Docker para que todos los servidores compartan el mismo puerto (el 80). Para ello vamos a usar un servidor proxy llamado Nginx. Obviamente, Nginx va estar dentro de otro contenedor de Docker. La imagen a usar es jwilder/nginx-proxy con tag 0.7.0.

Para arrancar el servidor usamos la siguiente orden:

sudo docker container run \
  -dit \
  -p 80:80 \
  --restart always \
  -v /var/run/docker.sock:/tmp/docker.sock:ro \
  --name nginx-proxy \
  nginxproxy/nginx-proxy:1.1.0 
  

Como vemos no tiene nada de especial excepto la línea -v /var/run/docker.sock:/tmp/docker.sock:ro pero solo decir que es para que Nginx pueda acceder al Docker real de la máquina real.

Y ahora , ¿Como arrancamos nuestro servidores web? Pues simplemente hay que añadir dos parámetros y quitar uno.

Veamos el siguiente ejemplo:

sudo docker container run \
  -dit \
  -v /home/alumno/lorenzo/httpd:/var/www/html \
  -e VIRTUAL_PORT=80
  -e VIRTUAL_HOST=lorenzo.daw2.pve3.fpmislata.com  \
  --name lorenzo_apache \
  php:8.1-apache-bullseye

Vemos que el servidor está escuchando en el puerto 80 y va a gestionar las peticiones del dominio lorenzo.daw2.pve3.fpmislata.com que lleguen a Nginx.

Los servidores de Base de datos u otros contenedores que no son el servidor web no tienen que hacer nada especial por usar Nginx ya que no se accede a ellos a través del proxy sino directamente a ellos o únicamente de forma interna.

Mas información:

El fichero hosts

Ahora para que funcione el proxy con nginx ya no podemos acceder a la máquina real con la IP sino que habrá que usar el nombre de dominio. Si no tenemos acceso a un nombre de dominio real, podemos simular nosotros uno modificando el fichero hosts de la máquina donde vayamos a hacer la petición.

El fichero hosts simplemente contiene IPs y nombre e dominio que usará nuestro ordenador. De esa forma simularemos tener un dominio.

En los siguientes artículos se explica como modificar el fichero hosts