Cómo implementar un proxy inverso simple en Docker con Nginx para poder tener varios contenedores con diferentes servicios web en diferentes dominios. Configuración de red DNS para acceso a estos dominios desde cualquier equipo de la red LAN y de Internet.
- Requisitos para desplegar proxy inverso en Docker.
- Infraestructura de contenedores en Docker con proxy inverso y dos sitios web.
- Ficheros para el despliegue del proxy inverso y dos sitios web con Apache.
- Descargar, desplegar e iniciar imágenes y contenedores.
- Configuración DNS del equipo Linux con Docker y de la red LAN.
- Configuración de acceso desde Internet y DNS públicos a los servicios web en Docker.
- Añadir/Modificar ficheros de los servidores web en Docker.
Requisitos para desplegar proxy inverso en Docker
Necesitaremos disponer de Docker instalado en un equipo, que será el anfitrión, donde desplegaremos los contenedores. Este equipo puede ser Windows o Linux.
Necesitaremos disponer de Docker Compose también instalado en el equipo, dado que realizaremos el despliegue de los contenedores con Compose.
En el siguiente enlace mostramos un tutorial para instalar Docker en Windows:
En este otro tutorial explicamos cómo instalar Docker en Linux:
En este otro tutorial explicamos cómo instalar Docker Desktop en Linux Ubuntu Server 24:
En este caso, realizaremos el despliegue de la infraestructura sobre Docker en Linux Ubuntu Server 24.
Infraestructura de contenedores en Docker con proxy inverso y dos sitios web
Realizaremos el despliegue de tres contenedores, con las siguientes funciones y características cada uno:
Contenedor | Uso | Servicio web | Dominio |
nginx-proxy | Proxy inverso | Nginx | |
facturacion | Sitio web para app de facturación de la empresa | Apache | facturacion.proyectoa.com |
contabilidad | Sitio web para app de contabilidad de la empresa | Apache | contabilidad.proyectoa.com |
El contenedor nginx-proxy será el encargado de distribuir las peticiones en función del FQDN (URL) de origen, si vienen de facturacion.proyectoa.com las enviará al contenedor «facturacion» y si son de contabilidad.proyectoa.com las enviará al contenedor «contabilidad».
De esta forma podremos tener varios servicios web separados en el mismo servidor Docker con sus respectivas URL de acceso.
Ficheros para el despliegue del proxy inverso y dos sitios web con Apache
A continuación describimos estructura de carpetas y ficheros para el despliegue automatizado de toda la infraestructura. Con este método, mediante Docker Compose, desplegaremos los tres contenedores (y los ficheros de los sitios web) con un solo comando. los ficheros necesarios para desplegar tres contenedores en Docker.
En primer lugar, crearemos una carpeta para almacenar toda la estructura, con:
1 |
mkdir docker_proyectoa |
Desde esta carpeta, crearemos dos subcarpetas para cada sitio web que desplegaremos:
1 2 |
mkdir facturacion mkdir contabilidad |
Accederemos a la carpeta «facturacion» y crearemos dos ficheros, el primero será el fichero HTML que se cargará al navegar al sitio web con la App de Facturación (facturacion.proyectoa.com), lo llamaremos facturacion.html:
1 |
nano facturacion.html |
Y tendrá este contenido de ejemplo HTML:
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h1>App Facturación - ProyectoA</h1> <p>Sitio web de gestión de la facturación de la empresa.</p> </body> </html> |

Crearemos en la misma carpeta el fichero Dockerfile que contendrá lo necesario para el despliegue del contenedor con la imagen Apache y copiará el fichero facturacion.html al contenedor, a la carpeta de inicio del sitio web:
1 |
nano Dockerfile |
Con el contenido:
1 2 |
FROM httpd:2.4 COPY facturacion.html /usr/local/apache2/htdocs/index.html |

Repetiremos el proceso para el caso de la carpeta «contabilidad», para el sitio web con la App de contabilidad de la empresa (contabilidad.proyectoa.com). Accederemos a la carpeta «contabilidad» y crearemos el fichero contabilidad.html, con el contenido:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h1>App Contabilidad - ProyectoA</h1> <p>Sitio web de gestión de la contabilidad de la empresa.</p> <br><br> <p><a href="extractos_contables.html">Extractos contables</a>.</p> </body> </html> |
Crearemos el fichero Dockerfile, con el contenido:
1 2 |
FROM httpd:2.4 COPY contabilidad.html /usr/local/apache2/htdocs/index.html |
Quedando cuatro ficheros, dos en cada carpeta:

En la carpeta raíz de nuestro proyecto Compose, en este caso en /docker_proyectoa, crearemos el fichero docker-compose.yml, con el contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
services: facturacion: build: facturacion environment: VIRTUAL_HOST: facturacion.proyectoa.com restart: always contabilidad: build: contabilidad environment: VIRTUAL_HOST: contabilidad.proyectoa.com restart: always nginx-proxy: image: jwilder/nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro restart: always privileged: true |
Descargar, desplegar e iniciar imágenes y contenedores
Una vez creado el fichero docker-compose.yml, desde la misma carpeta, desplegaremos la infraestructura final con:
1 |
sudo docker-compose build |

Iniciaremos los contenedores con:
1 |
sudo docker-compose up -d |

Para comprobar que los tres contenedores están correctamente desplegados e iniciados, ejecutaremos:
1 |
sudo docker ps |

Configuración DNS del equipo Linux con Docker y de la red LAN
Antes de configurar el acceso externo al servidor Linux Ubuntu Server anfitrión con Docker, deberemos asegurarnos de que los puertos 80 y 443 (si usamos SSL/TLS) están abiertos en el cortafuegos del equipo.
Si disponemos de algún servidor DNS lo configuraremos a tal efecto, en caso de no disponer de servidor DNS, estableceremos la configuración en el fichero /etc/hosts, para ello, desde el equipo Linux Ubuntu Server host anfitrión de Docker Desktop, definiremos los dos dominios que hemos establecido para los servicios web doquerizados. Para ello, editaremos el fichero /etc/hosts con:
1 |
sudo nano /etc/hosts |
Y agregaremos las siguientes líneas para definir las dos URL de los dos dominios:
1 2 |
127.0.1.1 facturacion.proyectoa.com 127.0.1.1 contabilidad.proyectoa.com |

Obtendremos la IP del equipo Linux Ubuntu Server, para definir los DNS externos de la red LAN apuntando a esta IP:
1 |
ip a |

En este caso, el equipo Linux Ubuntu Server tiene la IP 192.168.1.88.
Desde los equipos de la red LAN, si disponemos de algún servidor DNS (como pi-hole), agregaremos las dos URL a dicho servicio DNS, ambas apuntando a la misma IP 192.168.1.88 del servidor Linux Ubuntu Server:

En el caso de no disponer de un servicio de DNS, si los equipos clientes son Windows, podemos editar el archivo:
C:\Windows\System32\drivers\etc\hosts
Usando el Bloc de notas (ejecutándolo como administrador):

Elegiremos el fichero «hosts» (no tiene extensión, por lo que seleccionaremos «Todos los archivos» para que aparezca):

Agregaremos las líneas:
1 2 |
192.168.1.88 facturacion.proyectoa.com 192.168.1.88 contabilidad.proyectoa.com |

En caso de equipos cliente Linux, editaremos el fichero /etc/hosts y agregaremos las dos líneas anteriores.
Una vez configurados los DNS, podremos navegar a los dos sitios web de la empresa:

Configuración de acceso desde Internet y DNS públicos a los servicios web en Docker
Si queremos hacer público el acceso a los sitios web doquerizados, necesitaremos definir los DNS en algún alojamiento/hosting. para ello, necesitaremos conocer la IP pública de salida asignada a nuestra red, podemos obtenerla navegando a:

Desde el panel de control de nuestro proveedor de hosting, donde tengamos registrado el dominio, agregaremos dos nuevas zonas DNS de tipo A, con sus respectivas URL y la IP pública de nuestra organización:

Si disponemos de cortafuegos en nuestra organización, crearemos la regla de NAT para redireccionar las peticiones que lleguen desde Internet a los puertos 80 y 443 al servidor Linux con Docker, en este caso, a la IP 192.168.1.88. Si no disponemos de cortafuegos, accederemos al router proporcionado por el proveedor de Internet y agregaremos la regla de NAT correspondiente:

Añadir/Modificar ficheros de los servidores web en Docker
Si queremos modificar (reemplazar) o subir nuevos ficheros a cada sitio web de Docker, para actualizar nuestras App web de Facturación y Contabilidad, solo tendremos que obtener el nombre asignado a cada contenedor, con el comando:
1 |
sudo docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Names}}" |

Preparamos los ficheros que queramos subir en una carpeta del equipo host anfitrión:

Y realizamos la subida al contenedor Docker, si queremos modificar el nombre del fichero de destino, por ejemplo, el fichero origen del host anfitrión, en este caso, es contabilidad.html y queremos que pase al equipo Docker con el nombre index.html, por lo que ejecutaremos el siguiente comando (en la carpeta donde estén los ficheros del sitio web a subir):
1 |
sudo docker cp contabilidad.html 64ea12fd3f95:/usr/local/apache2/htdocs/index.html |
Teniendo en cuenta que 64ea12fd3f95 es el ID del contenedor del sitio web de Contabilidad.
Subiremos el resto de ficheros, con el nombre original:
1 |
sudo docker cp extractos_contables.html 64ea12fd3f95:/usr/local/apache2/htdocs/ |
Si volvemos a acceder al sitio web, ya tendremos las modificaciones aplicadas:

Pulsando en «Extractos contables», nos llevará a la página correspondiente:
