Docker è una piattaforma estremamente utile che consente agli sviluppatori di sviluppare e distribuire facilmente le applicazioni. In questo articolo, vedremo come utilizzare i contenitori Docker per ospitare più siti Web su un unico server. Uno dei vantaggi più significativi dell'utilizzo dei container Docker è che sono leggeri, veloci e facili da gestire.
Questo mese ho spostato due delle mie applicazioni personalizzate da due server separati a un unico server, ciascuna nel proprio contenitore Docker. È più facile gestire entrambe le applicazioni e mi ha anche ridotto i costi di produzione.
Ogni applicazione è configurata all'interno del proprio ambiente protetto ed è accessibile tramite un nome di dominio. Prima di passare alle istruzioni, discutiamo brevemente di come funzionerà e di quali strumenti avremo bisogno per impostare tutto. Allora iniziamo.
Cosa vogliamo configurare?
Vogliamo utilizzare i contenitori Docker per configurare un unico server in grado di servire più applicazioni o siti Web. Quando un utente richiede un URL per uno dei siti Web ospitati, il server principale deve inviare la richiesta al container, che dovrebbe quindi servire il contenuto.
Avremo bisogno di configurare un server per raggiungere questo obiettivo. Ho configurato un server con un indirizzo IP statico per questo articolo. Dai un'occhiata a MassiveGRID, DigitalOcean o Vultr se stai cercando un buon servizio di cloud hosting.
In secondo luogo, creeremo un proxy per instradare le richieste degli utenti ai contenitori appropriati. Ci sono molti strumenti disponibili per questo scopo, ma userò nginx-proxy perché è estremamente semplice da configurare e ha quasi tutte le funzionalità di cui abbiamo bisogno. Infine, utilizzeremo Cloudflare come gestore DNS per indirizzare il nome di dominio al server host (indirizzo IP).
Consiglio anche di utilizzare Portainer, un'interfaccia grafica facile da usare per la gestione dei contenitori docker. Per configurare Portainer, segui questa guida.Una volta che il tuo server è attivo e funzionante, ssh nel server e aggiornalo.
ssh [email protected]
Se hai impostato la chiave ssh per accedere, usa l'opzione -i option in the ssh command to log in
con la chiave ssh privata.
ssh -i path-to-ssh-key [email protected]
Prepara il server
Sulla macchina host, sto eseguendo Ubuntu 20.04. Le istruzioni saranno le stesse sia che tu stia usando Debian o un'altra distribuzione basata su Debian. Per qualsiasi altra distribuzione, le uniche istruzioni per la configurazione della finestra mobile saranno diverse e tutto il resto rimarrà lo stesso. Segui questa guida per installare Docker su Ubuntu.
Utilizzo del certificato SSL con nginx-proxy
Il secondo passaggio consiste nel creare una directory che memorizzerà i certificati SSL e le chiavi per ciascun dominio. Sul server host, creare una directory nella directory /etc/. Puoi nominare questa directory come preferisci. Per questo articolo lo chiamo cloudflare.
mkdir /etc/cloudflare
Successivamente, collegheremo questa directory con nginx-proxy per accedere ai certificati e alle chiavi SSL per ciascun nome di dominio.
Crea rete Docker
Creeremo anche una rete virtuale a cui si connetterà ogni container docker, incluso nginx-proxy.
docker network create nginx-proxy
Imposta nginx-proxy
Se vogliamo, possiamo creare un proxy per affrontare tali situazioni. Per fortuna, gli sviluppatori di nginx hanno creato un'intera immagine Docker che terrà traccia di tutti i container e si aggiornerà non appena verrà creato un nuovo container. Per creare la finestra mobile nginx-proxy (con in mente ssl), esegui il seguente comando –
docker run -d –name nginx-proxy -p 80:80 -p 443:443 –net nginx-proxy -v /etc/cloudflare:/etc/nginx/certs -v /var/run/docker.sock:/tmp/docker.sock:ro nginxproxy/nginx-proxy
Analizziamo passo dopo passo il comando precedente.
- corri – Questa opzione creerà il contenitore.
- -d – Abilita la modalità di debug. Nel caso qualcosa vada storto, verranno restituite le informazioni utili per scovare il problema.
- –nome – Il nome del contenitore.
- -p 80:80 – È estremamente importante. Il parametro -p associa la porta dell'host alla porta del contenitore. Sul lato sinistro di 80:80 c'è la porta host e viceversa.
- –net – Collega il container appena creato con la rete nginx-proxy.
- -v /etc/cloudflare:/etc/nginx/certs – Necessario se intendi utilizzare SSL sui tuoi siti web. Associazione della directory host con la directory del contenitore nginx-proxy in cui memorizza i certificati e le chiavi SSL.
- -v /var/run/docker.sock:/tmp/docker.sock:ro – Collegamento del socket docker al contenitore per comunicare con il daemon docker.
- nginxproxy/nginx-proxy – L'indirizzo dell'immagine della finestra mobile nginx-proxy ospitata su hub.docker.com.
Abbiamo risolto il più grande enigma del gioco dopo aver creato il contenitore proxy nginx. Era molto semplice. Giusto? È tutto grazie all'immagine proxy nginx; altrimenti, dovremmo fare tutto manualmente.
Crea un container con la variabile di ambiente VIRTUAL_HOST
La variabile di ambiente VIRTUAL HOST viene utilizzata da nginx-proxy per determinare quale dominio deve essere puntato a quale server. Ogni volta che crei un nuovo container, imposta il valore della variabile VIRTUAL HOST sul nome di dominio a cui vuoi puntare a questo container.
docker run -it -d --name gaminggroup.online -h gaminggroup.online --expose 80 --net nginx-proxy -e VIRTUAL_HOST=gaminggroup.online -e VIRTUAL_HOST=www.gaminggroup.online httpd
Analizziamo passo dopo passo il comando precedente.
- -h – imposta il nome di dominio completo (imposta il nome di dominio)
- –esporre – Espone la porta 80 per consentire il traffico HTTP
- –net – Collega il container appena creato alla rete nginx-proxy
- VIRTUAL_HOST=dominio.xyz – La variabile VIRTUAL_HOST viene utilizzata da nginx-proxy per reindirizzare le richieste degli utenti ai rispettivi contenitori
- httpd – Estrarre l'immagine del server Apache dall'hub Docker
Il comando sopra avvierà il container con il popolare server web Apache. Qualsiasi richiesta che raggiunge il server host viene reindirizzata al proxy nginx, che quindi la inoltra alla porta 80 di questo contenitore .
Pubblica il dominio al server
Infine, configura il nome di dominio in modo che punti al server host. Crea un record A con il nome "@" e IPv4 come indirizzo IP del server host. Aspetta un po' dopo aver finito. La propagazione del DNS può richiedere da pochi minuti a diverse ore.
Una volta completata la propagazione DNS, il tuo nome di dominio punterà al container appena creato che ospita il server web Apache. Ora è tutto pronto. Tutto quello che devi fare è continuare a creare container con la variabile VIRTUAL_HOST e nginx-proxy reindirizzerà correttamente il traffico al container.
Utilizzo di SSL/HTTPS all'interno di Docker
Poiché la maggior parte di noi preferisce fornire contenuti tramite HTTPS piuttosto che HTTP non sicuro, nginx-proxy può gestirlo facilmente. Abbiamo già passato il parametro -v con la directory /etc/cloudflare
quando impostiamo il nginx-proxy contenitore. Questa directory è associata al nginx-proxy directory /etc/nginx/certs
.
Ogni certificato e chiave SSL deve essere archiviato in /etc/cloudflare
con il nome proprio. I certificati e le chiavi SSL devono essere rinominati in base al nome di dominio a cui si riferiscono. Ad esempio, per il nome di dominio, example.com
, il certificato SSL deve essere rinominato example.com.crt
e la chiave deve essere example.com.key
.
Conclusione
L'uso di nginx-proxy ha notevolmente semplificato il processo. Distribuisci semplicemente un container che gestisca tutto il resto. Al termine, puoi distribuire tutti i contenitori che desideri senza doverti preoccupare di troppi file di configurazione. I container sono leggeri, ma con l'aumento del traffico/carico di lavoro, saranno necessarie più risorse.
Se hai avuto difficoltà a seguire i passaggi precedenti, faccelo sapere nella sezione dei comandi di seguito o unisciti al nostro server Discord per un rapido aiuto.