¿Es posible usar Docker para separar los sitios web de los usuarios?


12

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 aislar los procesos de pila de LAMP, me preguntaba si era posible implementar Docker y usar imágenes 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 del servidor, como:

  • www.somewebsite.com: Docker instancia 1
  • www.otherwebsite.com: Docker instancia 2
  • www.etc.com: instancia de Docker ...

Y eso, en el mismo servidor.

Pensé en instalar solo Apache en el servidor, que redirigiría la solicitud a la instancia dedicada de Docker en función del nombre del servidor, pero luego tendría que instalar Apache (¡otra vez!) Y MySQL en cualquier instancia de Docker.

¿Es esto posible y, además, es interesante en términos de rendimiento (o no en absoluto)?

Gracias por tu ayuda.


1
Teóricamente es posible, Apache haría un ProxyPass hacia el puerto que escucha cada instancia de Docker.
Thanasisk

Respuestas:


12

Sí, es posible. Lo que debe hacer es proporcionar varios 80 puertos. uno para cada URL. Puede hacerlo utilizando, por ejemplo, el host virtual de Apache que se ejecuta en el servidor host Docker.

  1. Establecer DNS CNAME.
  2. Ejecute instancias de Docker y asigne su puerto 80 al puerto, digamos, 12345 ~ 12347 del host Docker.
  3. Ejecute el servidor Apache en el host 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í:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

44
¡Gracias! Esto ayudó mucho. Además, está el ProxyPreserveHost On, así que no terminas con muchos enlaces a local.hostname.ofDockerHost: 12345 en tu sitio web. Aquí hay más información que me fue útil: digitalocean.com/community/tutorials/…
Sebastián Ramírez

¿Docker guardará los cambios en la base de datos, etc.?
EminezArtus

3

Es posible. Puede usar apache (o mejor aún, haproxy, nginx o barniz, que puede ser más eficiente que apache solo para esa tarea de redireccionamiento) 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.


Gracias por su respuesta. De hecho, el servicio de "hosting" que proporcionaré incluye cosas como Prestashop, Wordpress, etc., por lo que se basa mucho en PHP y motores pesados ​​(estoy hablando más sobre Prestashop aquí).
Cyril N.

1
¿Se modularizaría mejor un sistema de alojamiento virtual Dockerized separando PHP en sus propios contenedores Docker y haciendo que los contenedores Apache utilicen ese contenedor para el procesamiento de PHP? ¿Se aplicaría lo mismo a las bases de datos? Por ejemplo, ¿tiene tráfico proxy de host a los contenedores de Apache (que contienen sitios web de usuarios), que a su vez envían todo el procesamiento de PHP a un contenedor de PHP y las lecturas / escrituras de la base de datos a un contenedor de MySQL? ¿O el PHP estaría menos hambriento de recursos de esta manera? ¿PHP-FPM, SuPHP o similar proporcionaría el mismo tipo de configuración en un entorno que no sea Docker?
ojrask

PHP-FPM en un contenedor al menos sería un poco redundante en cuanto al espacio de archivos : code.google.com/p/sna/wiki/NginxWithPHPFPM La instalación de Apache / Nginx necesita copiar los archivos PHP en el contenedor PHP-FPM para poder para que este sistema funcione ¿Un contenedor de datos compartidos montado resolvería este problema?
ojrask

Si necesita compartir datos (es decir, los archivos php) entre contenedores, los volúmenes son el camino a seguir, puede montarlos desde otros contenedores (incluso tener datos dedicados) o el sistema de archivos real. El módulo apache solía ser la forma más rápida de ejecutar código php, tener uno solo para php, no archivos estáticos, y tener una capa superior para entregar el contenido estático / almacenable en caché (es decir, barniz) podría ser un buen combo.
gmuslera

3

Sé que esto ya ha sido respondido, sin embargo, quería ir un paso más allá y mostrarle un ejemplo de cómo se podría hacer esto, para proporcionar una respuesta más completa.

Consulte la imagen de mi ventana acoplable aquí con instrucciones sobre cómo usarla, esto le mostrará cómo configurar dos sitios https://hub.docker.com/r/vect0r/httpd-proxy/

Como dijo jihun, deberá asegurarse de tener configurada la configuración de vhost. Mi ejemplo utiliza 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;

FROM centos:latest
Maintainer vect0r
LABEL Vendor="CentOS"

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all

EXPOSE 80 81

#Simple startup script to aviod some issues observed with container restart
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh

#Copy config file across
COPY ./httpd.conf /etc/httpd/conf/httpd.conf
COPY ./example.com /var/www/example.com
COPY ./example2.com /var/www/example2.com
COPY ./sites-available /etc/httpd/sites-available
COPY ./sites-enabled /etc/httpd/sites-enabled

CMD ["/run-httpd.sh"]

Espero que esto ayude a explicar un poco más el proceso. Por favor, siéntase libre de hacerme más preguntas sobre esto, feliz de ayudar.

Saludos,

V


También he subido los archivos utilizados para hacer esta imagen en github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

En mi caso, necesitaba agregar SSLProxyEngine On , ProxyPreserveHost On y RequestHeader establecieron Front-End-Https "On" en mi archivo vhost apache 2.4, porque quería habilitar SSL en el contenedor de la ventana acoplable. Sobre el local.hostname.ofDockerHost , en mi caso, el nombre del servidor host que ejecuta el contenedor Docker era lucas , y el puerto asignado al puerto 443 del contenedor Docker era 1443 (porque el puerto 443 ya estaba en uso por Apache en el host servidor), 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 ómnibus para configurar aplicaciones de 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 encuentre útil

nginx['redirect_http_to_https'] = true
nginx['proxy_set_headers'] = {
    "Host" => "$http_host",
    "X-Real-IP" => "$remote_addr",
    "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
    "X-Forwarded-Proto" => "https",
    "X-Forwarded-Ssl" => "on"
}
nginx['real_ip_trusted_addresses'] = ['10.0.0.77'] # IP for lucas host
nginx['real_ip_header'] = 'X-Real-IP'
nginx['real_ip_recursive'] = 'on'

Guía completa para apache, ISP Config, servidor Ubuntu 16.04 aquí https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.