En el curro me he puesto a «dockerizar» todos los servicios webs de gestión que teníamos (y de paso a integrarlos con LDAP) y una de las cosas que he me encontrado es como tener el puerto 80 para todos y reenviar el usuario a un docker u otro simplemente por la URL a la que acceda.
He pensado que a más de uno le pondría interesar, así que os lo comento porque es una herramienta sencilla, bonita, fácil con multitud de opciones.
Pues bien, esto se hace en cuestión de segundos usando Nginx Proxy. Simplemente instalamos este docker ocupando el puerto 80/443 para que todas las peticiones vayan a él.
Ahora, a cada docker le añadimos una variable de entorno con el dominio (o dominios) con los que queramos acceder, lo recreamos y listo.
Los servicios no tienen que tener el puerto 80/443 abierto. Solo lo debe tener el proxy, y como accederemos a través de él no habrá problema.
Además, permite configurar que dockers estarán accesibles desde cualquier sitio y cuales solo desde una IP interna, por ejemplo.
¿Queréis rizar más el rizo? Con LetsEncrypt Nginx Proxy Companion activaremos el HTTPS firmado con Lets Scripts de forma automática. Sin hacer nada.
Os pongo un docker compose de ejemplo:
version: "2"
services:
gitlab:
container_name: gitlab
image: gitlab/gitlab-ce:latest
environment:
VIRTUAL_HOST: gitlab.ejemplo.com
LETSENCRYPT_HOST: gitlab.ejemplo.com
phpldap:
image: osixia/phpldapadmin
container_name: phpldap
environment:
- VIRTUAL_HOST=ldap.ejemplo.com
- NETWORK_ACCESS=internal
letsencrypt:
container_name: letsencrypt
image: jrcs/letsencrypt-nginx-proxy-companion
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
En este ejemplo tendríamos que según si entramos a ldap.ejemplo.com o gitlab.ejemplo.com iríamos a un servicio u otro. En el caso de Gitlab, nos crearía un certificado HTTPS con LetScript y el de LDAP solo estaría accesible desde una red local al servidor.
Por limitaciones propias de LetScript no podríamos tener un certificado para un sistema que solo está en red local. Sé que hay formas manuales de obtenerlo, pero no es precisamente sencillo…