Negli anni, le applicazioni e gli strumenti sono diventati più complessi per stare al passo con le mutevoli esigenze e aspettative delle persone. Ma questo può creare problemi di compatibilità del codice e accesso remoto. Ad esempio, una base di codice che funziona correttamente su Windows può sviluppare errori di compatibilità quando viene installata su Linux.
Fortunatamente, Docker viene in soccorso. Ma ti starai chiedendo: cos’è Docker e come aiuta? Imparerai tutto questo e altro in questo tutorial.
Ma prima di iniziare, ecco alcuni prerequisiti:
-
Conoscenza dei comandi Linux
-
Conoscenza dell’uso del terminale
-
Conoscenza di Node.js e Express.js
Indice
Cosa è Docker?
Docker è uno strumento open-source che facilita l’esecuzione di software in modo coerente, indipendentemente da dove ti trovi. Lo fa mettendo la tua applicazione e tutto ciò di cui ha bisogno (come librerie e impostazioni) in un contenitore (di cui parlerò di più tra poco).
Pensa a un contenitore come a una scatola: contiene la tua app e tutte le sue parti, quindi funziona esattamente allo stesso modo sul tuo laptop, su un server o nel cloud. Docker aiuta gli sviluppatori a evitare il problema del “funziona sulla mia macchina” assicurando che tutto sia pacchettizzato insieme in modo affidabile e portatile.
Docker è stato creato da Solomon Hykes nel 2013. Nel corso degli anni, si è evoluto per coprire una vasta gamma di strumenti. È diventato uno strumento di riferimento per migliorare i processi di distribuzione e networking delle applicazioni.
Prima di procedere, ecco alcuni termini chiave che incontrerai mentre segui questo tutorial:
Docker Engine
Il motore Docker, come suggerisce il nome, è il motore delle applicazioni Docker. Ha un componente client e uno server. Il client Docker, nel nostro caso, è lo strumento della riga di comando o il terminale Docker che utilizzeremo per inviare i comandi pertinenti per l’esecuzione del progetto. Il server Docker, comunemente noto come daemon, è il server che gestisce l’esecuzione delle varie immagini e contenitori Docker.
Immagine Docker
Le immagini Docker sono modelli predefiniti di software e sistemi eseguibili. Docker offre una vasta gamma di immagini che vanno dai modelli di sistemi operativi a quelli di server, a modelli di software e così via. Puoi trovare tutto questo nel registro Docker Hub dove sono memorizzate queste immagini.
Puoi anche creare un’immagine specifica e ospitarla sia pubblicamente su Docker Hub che in un registro privato.
Contenitori Docker
I contenitori Docker sono istanze compatte eseguibili costruite sul modello generato, che è l’immagine Docker. Sono pacchetti leggeri e portatili che includono tutto il necessario per eseguire un pezzo di software: codice, runtime, librerie e strumenti di sistema. Un contenitore garantisce che l’applicazione venga eseguita in modo coerente indipendentemente dall’ambiente.
Benefici dell’uso di Docker
Ecco alcuni dei benefici dell’uso di Docker come sviluppatore backend:
-
Docker è un ottimo strumento per creare una solida cultura DevOps per lo sviluppo di applicazioni, poiché chiarisce le funzioni dei team di sviluppo e operazioni.
-
È anche abbastanza flessibile, consentendo una facile distribuzione di microservizi e applicazioni backend monolitiche distribuite.
-
Minimizza anche gli errori da configurazioni errate delle dipendenze durante le installazioni, poiché trasferisce l’app con tutte le dipendenze necessarie in un colpo solo.
Passando oltre, ci immergeremo in come Dockerizzare un’applicazione Node.JS Express. Ma prima di ciò, dovrai installare Docker sul tuo computer. Puoi saltare questo passaggio se lo hai già installato.
Come installare Docker
Docker è uno strumento multipiattaforma che può essere installato su tutti i sistemi operativi più diffusi (Windows, Mac OS e distribuzioni Linux). Per questo tutorial, evidenzierò solo come configurare Docker su Windows.
Se stai attualmente utilizzando un sistema operativo diverso da Windows, puoi facilmente configurare Docker seguendo i passaggi nella documentazione di Docker qui.
Per gli utenti Windows, è essenziale che il tuo PC soddisfi le specifiche minime: altrimenti l’installazione non avrà successo. I requisiti minimi sono i seguenti:
-
Una versione del sistema operativo Windows non inferiore a Windows 10 Home
-
Un PC con WSL-2 installato o Hypervisor abilitato.
Detto ciò, passiamo al download dell’eseguibile dell’installer di Docker. Puoi scaricare l’ultima versione dell’installer di Docker qui. Dopo averlo fatto, esegui il software e accetta i termini e le condizioni. Al termine con successo, avvia l’applicazione. Questo è ciò che dovresti vedere:
Per confermare che hai installato correttamente l’applicazione, naviga al terminale del prompt dei comandi e digita Docker –-version
. Dovresti vedere la versione esatta dell’istrumento Docker che hai installato se tutto è andato a buon fine.
Ora passeremo al progetto vero e proprio.
Progetto dimostrativo: Come containerizzare un’applicazione Node.js
In questa sezione, containerizzeremo un semplice servizio backend basato su Node.js con dipendenze minime. Questo ti mostrerà come containerizzare e portare un’applicazione utilizzando una tecnica di containerizzazione delle applicazioni Docker nota come Dockerfile. Tieni presente che se hai un’applicazione più complessa, potrebbe essere meglio utilizzare lo strumento Docker compose YAML.
Per iniziare, configureremo l’applicazione di esempio Node.js. Fornirò l’intero codice di configurazione in questo articolo, qui sotto. Ma prima, comprendiamo cos’è un dockerfile.
Cosa è un Dockerfile?
Fondamentalmente, un Dockerfile è un sistema di template che consente all’utente di inserire comandi che, una volta eseguiti, possono produrre un’immagine funzionale dell’applicazione. Questa immagine può poi essere convertita in un container.
Ecco alcuni comandi inclusi nella struttura di base di un Dockerfile:
-
CMD
: imposta il comando predefinito da eseguire se non viene specificato alcun comando quando il container si avvia. Può essere sovrascritto fornendo un comando durante l’esecuzione del container (docker run ...
). -
ENTRYPOINT
: Specifica il comando principale che viene sempre eseguito quando il container si avvia. Non è facilmente sovrascrivibile, ma gli argomenti possono essere aggiunti.
Nota cheCMD
eENTRYPOINT
specificano entrambi quale comando o processo il container dovrebbe eseguire quando si avvia. Ma vengono utilizzati in modo diverso e hanno scopi distinti. UsaCMD
per un comportamento predefinito che può essere sovrascritto. UsaENTRYPOINT
per un comando fisso che definisce lo scopo principale del container. -
FROM
: Questo è solitamente l’istruzione iniziale in un Dockerfile. Questo comando recupera un’immagine di base che forma le fondamenta per costruire l’immagine dell’applicazione in questione. Ad esempio, nella nostra applicazione, l’immagine di base per un’applicazione Node.js è avere installato il motore Node.js di base. -
WORKDIR
: Questa sintassi definisce la directory di lavoro attiva in cui risiederanno i file dell’applicazione all’interno del contenitore definito. Una cartella automatica verrà creata se non è già disponibile. -
COPY
: Questa sintassi è utilizzata per garantire che i file necessari per creare l’immagine Docker dal file del progetto di base siano copiati nel nuovo contenitore Docker creato. Le directory di questi file sono evidenziate con attenzione. -
RUN
: Questa sintassi specifica lo script che desideri venga eseguito prima di completare la containerizzazione dell’applicazione. -
ENV
: Questa sintassi è utilizzata per evidenziare le variabili ambientali e i segreti che verranno invocati durante il processo di esecuzione dell’applicazione. -
EXPOSE
: Questa sintassi mappa la porta di navigazione attraverso la quale l’applicazione comunica con l’internet esterno. Ad esempioEXPOSE: 3000
mappa l’interfaccia web dell’applicazione alocalhost:3000
.
Approfondendo Docker, vediamo rapidamente alcuni comandi chiave di Docker che utilizzeremo durante questo tutorial:
-
Docker ps
: Questo comando elenca tutti i container in esecuzione sul tuo terminale Docker. -
Docker run
: Questo comando esegue un’immagine Docker per attivare un’istanza di un container. -
Docker build
: Questo comando funziona sulla base del file Docker per generare un’immagine di un servizio o di un’applicazione. -
Docker rm
: questo comando può essere utilizzato per eliminare un’immagine utilizzando i dettagli di identificazione dell’immagine.
Come containerizzare l’app
Ora possiamo iniziare a containerizzare la nostra semplice applicazione Node/Express. Per seguire il tutorial, puoi ottenere il codice di base da qui.
Testandolo localmente, restituisce un’API CRUD dove puoi creare, recuperare, aggiornare e eliminare prodotti quando viene eseguita. Impacchetteremo l’applicazione per una facile distribuzione nel cloud utilizzando il nostro motore Docker. Saremo in grado di farlo utilizzando lo strumento Dockerfile di cui abbiamo discusso sopra.
Passo 1: Crea il dockerfile
Nella tua cartella di progetto, crea un file chiamato Dockerfile
. Assicurati che il nome sia esattamente “Dockerfile” (senza estensione e sensibile al maiuscolo in alcuni sistemi – quindi assicurati che sia in maiuscolo).
Se stai usando un editor di codice, crea semplicemente un nuovo file chiamato Dockerfile
. Se stai usando un editor di testo di base, salva il file con il nome Dockerfile
e assicurati che non venga accidentalmente salvato con un’estensione come .txt
.
Poi inserisci la prima riga:
FROM Node:18-alpine
Questo comando recupera l’immagine di base che utilizzeremo per alimentare la nostra applicazione Express, che è il motore Node stesso.
Potresti chiederti a cosa serve alpine
. Alpine è una versione leggera, molto più compressa di un’immagine Docker. Esclude l’incorporazione di pacchetti aggiuntivi non direttamente essenziali per il sistema operativo di base. È consigliato come una buona prassi di codifica standard utilizzare distribuzioni leggere per una esecuzione più veloce e un uso facile.
Passo 2: Imposta la directory di lavoro
WORKDIR /app
Questo imposta la directory di lavoro dell’immagine sulla cartella /app
del contenitore. Assicura che tutte le azioni sui file avvengano qui e che tutti i file siano copiati in questa directory.
Passo 3: Copia i file necessari
COPY package.json
Questo comando copia il file package.json
che contiene un elenco di dipendenze e pacchetti da installare per alimentare la nostra applicazione.
Passo 4: Esegui uno script di configurazione
RUN npm install
Questo comando assicura che tutte le dipendenze necessarie per alimentare le nostre applicazioni Node.js siano installate nel contenitore.
Passo 5: Copia i file di codice
COPY . .
Questo comando assicura che tutti i file all’interno della directory locale vengano copiati nel file system del contenitore all’interno della directory di lavoro stabilita.
Passo 6: Esporre la porta del server
EXPOSE 3000
Questo comando espone la porta del server che intendiamo utilizzare per accedere al contenitore. In questo caso è la porta 3000.
Passo 7: Includere il comando per far funzionare il contenitore
CMD ["npm", "run", "dev"]4
Questo comando viene eseguito alla fine per accendere l’applicazione Node.js. Esegue semplicemente il comando npm run dev
che è quello che useresti per un ambiente di sviluppo. Per eseguirlo in un ambiente di produzione, useresti invece il comando npm start
.
Completato questo processo, ecco come dovrebbe apparire la struttura finale del Dockerfile:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
Testare il contenitore Docker
Per concludere, creeremo un’immagine Docker della nostra applicazione Node.js. Per fare ciò, esegui il comando docker build -t nodeapp .
. Il comando docker build
costruisce l’immagine, mentre il -t
consente di specificare i dettagli del tag dell’immagine.
Nel nostro caso, stiamo assegnando il nome nodeapp
all’immagine che stiamo creando e l’immagine sarà creata all’interno della directory di lavoro.
Congratulazioni! Hai costruito con successo la tua prima immagine Docker. Per vedere tutte le immagini nel tuo repository locale, esegui il comando docker images
.
Per creare un’istanza funzionante della tua immagine per i test, esegui il comando docker run nodeapp
.
Stiamo usando MongoDB come nostro database per questo tutorial, quindi dovremo passare l’URL di MongoDB come variabile d’ambiente al contenitore Docker. Le variabili d’ambiente ti aiutano a proteggere alcune variabili chiave che non dovrebbero essere esposte al pubblico. Altre variabili che possono essere passate come variabili d’ambiente includono chiavi API e codici di crittografia.
Per passare l’URL di MongoDB al contenitore Docker, utilizziamo il tag -e
per assicurarci che Docker riconosca il valore corrispondente inserito come variabile d’ambiente.
docker run -e JWT_SECRETS={inserisci il valore di tua scelta} -e MONGO_URL={l'url mongo di tua scelta} nodeapp
.
Per utilizzare anche il contenitore in background, basta allegare il tag -d
che rappresenta l’opzione di distacco. Questa opzione consente al contenitore di funzionare in background nonostante l’uscita dal terminale della riga di comando.
In assenza di errori, navigare su localhost:5000
dovrebbe anche produrre qualcosa di simile all’immagine qui sotto.
Conclusione
In questo articolo, hai appreso cos’è Docker e come funziona, insieme ai suoi comandi comuni e come utilizzarlo per containerizzare un’applicazione backend. Passando oltre le basi, puoi anche esplorare altri utilizzi di Docker nell’integrazione continua e nello sviluppo. Per saperne di più su Docker, puoi consultare la sua documentazione qui.
Ti consiglio anche di utilizzare le tue nuove conoscenze per distribuire progetti con casi d’uso reali, così come di esplorare la rete nelle applicazioni Docker. Per rendere la tua app operativa, puoi facilmente distribuire l’immagine Docker che hai creato su uno dei popolari fornitori di servizi cloud come AWS, GCP, Azure e così via.
Sentiti libero di farmi qualsiasi domanda! Puoi anche dare un’occhiata ai miei altri articoli qui. Fino alla prossima volta, continua a programmare!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/