Administro servidores donde los usuarios tienen sus propios sitios web a los que se puede acceder por FTP (como una empresa de alojamiento) y, en lugar de trabajar en el aislamiento de los procesos de pila LAMP, me preguntaba si era posible implementar Docker y usar una imagen por sitio web.
Por lo que entiendo, puede exponer la instancia de Docker a través de sus puertos, por lo que si ejecuta dos instancias de docker en el mismo servidor, tendrá que exponer dos puertos diferentes.
Pero, ¿es posible exportar no puertos, sino nombre de servidor, como :
www.somewebsite.com : Instancia de Docker 1
www.otherwebsite.com : Instancia 2 de Docker
www.etc.com : Instancia de Docker ...
Y eso, en el mismo servidor.
Pensé en instalar solo Apache en el servidor, eso redirigiría la solicitud a la instancia de Docker dedicada en función del nombre del servidor, pero luego tendría que instalar Apache (¡de nuevo !) Ymysql en cualquier instancia de Docker.
¿Es esto posible y, además, es interesante en términos de rendimiento (o no lo es en absoluto)?
Sí, es posible. Lo que necesita hacer es proporcionar varios puertos 80. una para cada URL. Puede hacer esto usando, por ejemplo, el host virtual de Apache que se ejecuta en el servidor host de Docker.
Establecer DNS CNAME.
Ejecute instancias de docker y asigne su puerto 80 al puerto, por ejemplo, 12345~12347 del host de docker.
Ejecute el servidor Apache en el host de docker y configure un Host virtual para cada URL y configure ProxyPass y ProxyPassReverse en localhost:12345, que es una de sus instancias de docker.
El archivo de configuración de Apache se verá así:
Sé que esto ya ha sido respondido, sin embargo, quería ir un paso más allá y mostrarles un ejemplo de cómo se podría hacer esto, para proporcionar una respuesta más completa.
Como dijo jihun, tendrá que asegurarse de tener configurada la configuración de su vhost. Mi ejemplo usa el puerto 80 para mostrar un sitio de prueba example.com y 81 para mostrar el sitio de prueba example2.com. También es importante tener en cuenta que deberá especificar su contenido y exponer los puertos necesarios en su Dockerfile, como tal;
Es posible. Puede usar apache (o mejor aún, haproxy, nginx o varnish, que pueden ser más eficientes que apache solo para esa tarea de redirección) en el servidor principal, para redirigir a los puertos apache de cada contenedor.
Pero, dependiendo de los sitios que ejecute allí (y sus configuraciones de apache), puede requerir mucha más memoria que usar un solo apache central con hosts virtuales, especialmente si tiene módulos (es decir, php) que requieren mucha RAM.
En mi caso necesitaba añadir SSLProxyEngine Encendido, ProxyPreserveHost En y RequestHeader establecer Front-End-Https "Activado" a mi archivo apache 2.4 vhost, porque quería habilitar SSL en el contenedor docker. Acerca de la local.nombre de host.ofDockerHost (en inglés), en mi caso, el nombre del servidor host que ejecuta el contenedor docker era lucas, y el puerto asignado al puerto 443 del contenedor acoplable era 1443 (porque el puerto 443 ya estaba en uso por apache en el servidor host), por lo que esa línea terminó de esta manera https://lucas:1443/
Esta es la configuración final, y está funcionando bien!
<VirtualHost *:443> # Change to *:80 if no https required ServerName www.somewebsite.com <Proxy *> Allow from localhost </Proxy> SSLProxyEngine On # Comment this out if no https required RequestHeader set Front-End-Https "On" # Comment this out if no https required ProxyPreserveHost On ProxyPass / http://local.hostname.ofDockerHost:12345/ ProxyPassReverse / http://local.hostname.ofDockerHost:12345/</VirtualHost>
Finalmente, en el contenedor docker, tuve que configurar encabezados SSL proxy. En mi caso, el contenedor ejecutaba nginx y algo llamado todo para configurar aplicaciones ruby. Creo que esto también se puede configurar en un archivo de configuración nginx. Lo escribiré tal como está en caso de que alguien lo encuentre útil