È possibile utilizzare Docker per separare i siti Web per gli utenti?


12

Gestisco server in cui gli utenti hanno i propri siti Web su cui è possibile accedere tramite FTP (come una società di hosting) e invece di lavorare sull'isolamento dei processi dello stack LAMP, mi chiedevo se fosse possibile implementare Docker e utilizzare immagini per sito Web.

Da quello che ho capito, puoi esporre l'istanza Docker tramite le loro porte, quindi se esegui due istanze docker sullo stesso server, dovrai esporre due porte diverse.

Ma è possibile esportare non le porte, ma il nome del server, come:

  • www.somewebsite.com: istanza Docker 1
  • www.otherwebsite.com: istanza Docker 2
  • www.etc.com: istanza Docker ...

E quello, nello stesso server.

Ho pensato di installare solo Apache sul server, che avrebbe reindirizzato la richiesta all'istanza Docker dedicata in base al nome del server, ma poi avrei dovuto installare Apache (di nuovo!) E MySQL su qualsiasi istanza Docker.

È possibile e inoltre è interessante in termini di prestazioni (o per niente)?

Grazie per l'aiuto.


1
Teoricamente è possibile, Apache farebbe un ProxyPass verso la porta che ogni istanza Docker sta ascoltando.
ringrazia il

Risposte:


12

Sì, è possibile. Quello che devi fare è fornire diverse 80 porte. uno per ogni URL. Puoi farlo usando, ad esempio, Virtual Host of Apache in esecuzione sul server host Docker.

  1. Imposta DNS CNAME.
  2. Esegui istanze docker e mappa la loro porta 80 sulla porta, diciamo 12345 ~ 12347 dell'host docker.
  3. Esegui il server Apache sull'host docker e imposta un host virtuale per ciascun URL e imposta ProxyPass e ProxyPassReverse su localhost: 12345 che è una delle tue istanze docker.

Il file di configurazione di Apache sarà simile al seguente:

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

4
Grazie! Questo ha aiutato molto. Inoltre, c'è il ProxyPreserveHost On, quindi non finisci con molti collegamenti a local.hostname.ofDockerHost: 12345 all'interno del tuo sito web. Ecco altre informazioni che mi sono state utili: digitalocean.com/community/tutorials/…
Sebastián Ramírez

La finestra mobile salverà le modifiche al database ecc.?
EminezArtus,

3

È possibile. Puoi usare apache (o meglio, haproxy, nginx o vernice, che potrebbero essere più efficienti di apache solo per quell'attività di reindirizzamento) nel server principale, per reindirizzare alle porte apache di ciascun contenitore.

Ma, a seconda dei siti che gestisci lì (e delle loro configurazioni di apache), potrebbe richiedere molta più memoria rispetto all'utilizzo di un singolo apache centrale con virtualhosts, specialmente se hai moduli (cioè php) che richiedono molta RAM.


La ringrazio per la risposta. In effetti, il servizio di "hosting" che fornirò include cose come Prestashop, Wordpress, ecc., Quindi, basato molto su PHP e motori pesanti (sto parlando di più su Prestashop qui).
Cyril N.

1
Un sistema di hosting virtuale Dockerized sarebbe meglio modularizzato separando PHP nei propri container Docker e facendo in modo che i container Apache utilizzino quel container per l'elaborazione PHP? Lo stesso vale per i database? Ad esempio avere traffico proxy host verso i contenitori Apache (che contengono siti Web degli utenti), che a loro volta inviano tutta l'elaborazione PHP a un contenitore PHP e il database legge / scrive su un contenitore MySQL? O il PHP avrebbe meno fame di risorse in questo modo? PHP-FPM, SuPHP o simili fornirebbero lo stesso tipo di configurazione in un ambiente non Docker?
ojrask,

PHP-FPM in un contenitore sarebbe almeno un po 'ridondante in termini di spazio per i file: code.google.com/p/sna/wiki/NginxWithPHPFPM L'installazione di Apache / Nginx deve copiare i file PHP nel contenitore PHP-FPM in ordine affinché questo sistema funzioni. Un contenitore di dati condivisi montato risolverebbe questo problema?
ojrask,

Se hai bisogno di condividere dati (cioè i file php) tra contenitori, i volumi sono la strada da percorrere, puoi montarli da altri contenitori (anche quelli dedicati ai dati) o dal vero filesystem. Il modulo apache era il modo più veloce per eseguire il codice php, avendo uno solo per php, non file statici, e aveva uno strato superiore per fornire il contenuto statico / memorizzabile nella cache (cioè vernice) potrebbe essere una buona combinazione.
gmuslera,

3

So che è già stata data una risposta, ma volevo fare un ulteriore passo avanti e mostrarvi un esempio di come ciò potrebbe essere fatto, per fornire una risposta più completa.

Si prega di vedere la mia immagine docker qui con le istruzioni su come usarlo, questo ti mostrerà come configurare due siti https://hub.docker.com/r/vect0r/httpd-proxy/

Come ha detto jihun, dovrai assicurarti di aver impostato la configurazione del tuo vhost. Il mio esempio usa la porta 80 per visualizzare un sito di prova example.com e 81 per visualizzare il sito di prova example2.com. È anche importante notare che sarà necessario specificare il contenuto ed esporre le porte richieste nel Dockerfile, come tale;

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"]

Spero che questo aiuti a spiegare il processo un po 'di più. Non esitate a farmi ulteriori domande su questo, felice di aiutarvi.

Saluti,

V


Ho anche caricato i file utilizzati per creare questa immagine su github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

Nel mio caso, dovevo aggiungere SSLProxyEngine On , ProxyPreserveHost On e RequestHeader impostare Front-End-Https "On" sul mio file vhost apache 2.4, perché volevo abilitare SSL sul contenitore docker. Informazioni su local.hostname.ofDockerHost , nel mio caso il nome del server host che esegue il contenitore docker era lucas e la porta mappata sulla porta 443 del contenitore docker era 1443 (perché la porta 443 era già in uso da apache nell'host server), in modo che la linea finisse in questo modo https: // lucas: 1443 /

Questa è la configurazione finale e funziona perfettamente!

<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>

Infine, nel contenitore della finestra mobile ho dovuto impostare le intestazioni SSL proxy. Nel mio caso, il contenitore stava eseguendo nginx e qualcosa chiamato omnibus per la configurazione di app ruby. Penso che questo possa essere impostato anche in un file di configurazione nginx. Lo scriverò come è nel caso qualcuno lo trovi utile

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'

Guida completa per apache, ISP Config, server Ubuntu 16.04 qui https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.