2015-08-05 17 views
7

Ho 2 siti Web a cui i client devono connettersi sulla porta 80. Ogni sito Web viene eseguito nel proprio contenitore. Voglio eseguire entrambi i contenitori sullo stesso host Docker.Come ospitare due contenitori Docker che espongono la porta 80 sullo stesso server

Capisco che la porta 80 può essere esposta all'host solo una volta. Quali soluzioni esistono con un sovraccarico/amministrazione minimo che mi consenta di eseguire semplicemente entrambi i contenitori sullo stesso host (consentendo comunque ai client di raggiungere ogni container sulla porta 80)?

Sia sito 1 e il sito 2 dovrebbe comparire al cliente il browser web sulla porta 80 e hanno amichevole URL (es: www.web1.com, www.web2.com)

+1

Non sei sicuro di finestra mobile, ma in IIS usiamo intestazione host per consentire a più siti web sulla porta 80 – Hakunamatata

risposta

10

Utilizzare un nginx reverse proxy :

  1. installare Nginx nell'host. Su Debian/Ubuntu: apt-get install nginx. Nota: ho presunto che tu non abbia già apache o qualche altro server web sull'host ...
  2. Per ogni sito, scrivi un file di sito nginx nella directory /etc/nginx/sites-available che reindirizza quel sito a http del contenitore di una finestra mobile che funzionerà su un altro porto predisposto (ad esempio, 2001, 2002, ...). Ogni sito riceve il proprio file, come quello qui sotto, ma con diverse porte predisposte per ciascun sito. Gli utenti esterni accedono a questi alla porta 80 dello stesso indirizzo IP ma con nomi di siti Web diversi e da questi nomi nginx gestirà le connessioni interne necessarie in modo invisibile.
  3. simulare i file del sito in modo che vengano visualizzati nella directory /etc/nginx/sites-enabled e riavviare nginx. Successivamente, è possibile rimuovere uno di questi collegamenti e riavviare nginx se è necessario disabilitare temporaneamente l'accesso a un sito.
  4. avviare i contenitori al riavvio del sistema aggiungendo i comandi docker run a /etc/rc.local e reindirizzando la porta host predisposta (localhost: 2001) alla porta del contenitore 80, ad es. docker run -d -p localhost:2001:80 imageA

Se un contenitore non funziona, si verificherà un errore di gateway da nginx. Questo potrebbe essere personalizzato per mostrare una pagina HTML personalizzata. Per maggiore robustezza, potrebbe essere meglio gestire i container in supervisord o qualche altro gestore di processo che respawn i processi morti.

Ecco un file del sito nginx esempio per un reindirizzamento alla porta 2001:

upstream dockerA { 
     server localhost:2001; 
} 

server { 
     listen 192.168.1.8:80; // REPLACE WITH HOST NUMERIC IP ADDRESS 
     root /var/web/siteAstaticfiles; 
     index index.html; 
     server_name www.siteA.com; 

     location/{ 
       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
       proxy_set_header Host $http_host; 
       proxy_set_header X-NginX-Proxy true; 
       proxy_pass http://dockerA; 
     }    
} 

In questo esempio, anche se una directory del disco locale per i file HTML è impostato per il sito A, non viene utilizzato. Invece tutte le richieste vengono inviate a monte. Non ho verificato se le linee root e index possono essere omesse in sicurezza.

+1

Perché installare Nginx sull'host quando è possibile utilizzare un altro contenitore? –

+1

Sicuro. Ho pubblicato quello che ho a portata di mano. Se hai questa soluzione sentiti libero di postarla. – Paul

Problemi correlati