Come eseguire NGINX Inside Docker (per un facile ridimensionamento automatico)

0
179

Uno dei carichi di lavoro più comuni di Docker è utilizzarlo per containerizzare i server web come NGINX e Apache per eseguire una flotta di distribuzione di contenuti ad alte prestazioni che può essere facilmente ridimensionata e gestita automaticamente. Ti mostreremo come configurarlo con NGINX.

Configurare NGINX all'interno di Docker

Docker è una piattaforma di containerizzazione, utilizzata per impacchettare la tua applicazione e tutto il suo codice in un'unica immagine contenitore facilmente gestibile. Il processo per farlo è abbastanza simile a come faresti per configurare un nuovo server—il contenitore è una lavagna vuota, quindi dovrai installare le dipendenze, creare il tuo codice, copiare il crea artefatti e copia su qualsiasi configurazione. Fortunatamente, non devi automatizzare così tanto. NGINX ha già un contenitore Docker disponibile pubblicamente, che puoi utilizzare come punto di partenza per la tua applicazione.

Ovviamente, a seconda dell'applicazione che stai containerizzando, questo può essere un po' più complicato. Se stai distribuendo un CMS come WordPress, probabilmente avrai bisogno di un database esterno, poiché i contenitori non sono progettati per essere persistenti. Un buon punto di partenza per WordPress, in particolare, sarebbe il contenitore Docker di WordPress.

Allo scopo di avere qualcosa di un po' più complesso di una semplice pagina web Hello World, faremo creare una nuova directory di progetto e inizializzare un'applicazione Vue.js di base. La tua configurazione sarà diversa a seconda del contenuto che stai offrendo, ma l'idea generale è la stessa.

Nella radice del tuo progetto, crea un nuovo file chiamato semplicemente Dockerfile senza estensione. Questo fungerà da configurazione di build. Per impostazione predefinita, il contenitore è vuoto e include solo le applicazioni e le dipendenze installate con l'immagine di base. Dovrai copiare il codice della tua applicazione; se stai solo offrendo contenuti statici, è facile, ma se stai lavorando con applicazioni lato server come WordPress, potresti dover installare dipendenze aggiuntive.

Pubblicità

La seguente configurazione è piuttosto semplice. Poiché si tratta di un'applicazione nodo, dobbiamo eseguire npm run build per ottenere una build pronta per la distribuzione. Possiamo gestire tutto questo nel Dockerfile, impostando una build del contenitore in due parti:

FROM node:latest come WORKDIR /src COPY package*.json ./RUN npm install COPY ./. RUN npm run build FROM nginx as production-stage RUN mkdir /src COPY –from=build-stage /src/dist /src COPY nginx.conf /etc/nginx/nginx.conf

Il comando FROM della prima riga estrae il contenitore del nodo da Docker Hub e crea un nuovo contenitore chiamato build-stage. Il cd successivo va in quella directory e viene copiato su package.json. Quindi, esegue npm install, quindi copia il codice dell'app e avvia il processo di compilazione. Se la tua applicazione deve essere compilata dal sorgente, ti consigliamo di fare qualcosa di simile a questo.

Lo stato successivo estrae il contenitore nginx per fungere da deployment di produzione. Crea la directory src e quindi copia, dal contenitore build-stage, la cartella /src/dist/ che contiene gli artefatti di build, nella cartella /src del contenitore di produzione. Quindi copia su un file di configurazione NGINX.

Desideri anche creare un nuovo file chiamato .dockerignore, per dirgli di ignorare node_modules così come qualsiasi artefatto di build dalle build locali.

**/node_modules **/dist

Il Dockerfile fa riferimento a un nginx.conf, che dovrai anche creare. Se stai eseguendo una configurazione più complessa con più configurazioni in /sites-available, potresti voler creare una nuova cartella per la tua configurazione NGINX e copiarla.

utente nginx; processo_lavoratore 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; eventi { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr – $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '”$http_user_agent” “$http_x_forwarded_for”'; access_log /var/log/nginx/access.log main; inviare file su; keepalive_timeout 65; server { ascolta 80; nome_server host locale; posizione/{ radice/origine; indice index.html; try_files $uri $uri//index.html; } pagina_errore 500 502 503 504 /50x.html; posizione = /50x.html { root /usr/share/nginx/html; } } }

Questo è solo un server web HTTP. Il modo più semplice per configurare HTTPS sarebbe eseguire il certbot di LetsEncrypt localmente e copiare il certificato da /etc/letsencrypt/live/example.com/fullchain.pem nel contenitore di produzione. Questi certificati sono validi per 90 giorni, quindi dovrai rinnovarli regolarmente. Puoi automatizzarlo come parte del processo di creazione del contenitore.

Annuncio

Una volta che tutto è in ordine, puoi eseguire la build Docker:

docker build . -t my-app

Questo creerà il contenitore come my-app, dopodiché sarai libero di taggarlo e inviarlo a ECS o a un registro del contenitore per l'eventuale distribuzione. Ovviamente dovresti prima testarlo localmente con docker run binding localhost:8080 alla porta 80 dell'istanza NGINX:

docker run -d -p 8080:80 my-app

Una volta creata un'immagine , distribuirlo in produzione è abbastanza semplice. Puoi leggere la nostra guida alla configurazione di una distribuzione di container con scalabilità automatica su AWS ECS per saperne di più, oppure leggere la nostra guida alla configurazione di una pipeline CI/CD con contenitori per gestire build e distribuzioni automatizzate.

< strong>RELAZIONATO: Che cos'è un file PEM e come lo usi?