Docker come creare un’immagine basata su NodeJs

Docker come creare un’immagine basata su NodeJs
Docker come creare un’immagine basata su NodeJs
Docker & Containers

Docker come creare
un’immagine basata
su NodeJs

Creare un'immagine Docker, basata su NodeJs scopriamo come crearla ed avviarla.

Docker è ormai una piattaforma che ci permette di fare tante cose interessanti e che agevolano la vita sia agli sviluppatori che agli amministratori di sistema.

Oggi imapreremo a creare un’immagine basata su NodeJS e come evitare possibili errori che potrebbero nascere soprattutto in un ambiente windows.

Ricordiamoci che in Docker il termine “immagine” rappresenta un pacchetto che contiene tutto il necessario per essere poi eseguito nel container; mentre, “Container” rappresenta un’istanza run-time dell’immagine.

Adesso che abbiamo ripreso questi concetti passiamo alla parte pratica.

Creiamo il nostro progetto con dentro i dati NodeJS:

>> npm init -y

Una volta creato il file package.json installiamo il nostro amato express:

>> npm install –save express

Ed infine apriamo il nostro editor preferito (io uso vscode) e creiamo il nostro file index.js con il seguente codice dentro:

index.js


'use strict';

const express = require('express');

// Creiamo APP come istanza di express
const app = express();
app.get('/', (req, res) => {
res.send('Tutto funziona :-) \n');
});

app.listen('3000', '127.0.0.1');
console.log('Run on 127.0.0.1:3000`);

Avviamolo con il comando:

>> node index.js

Se tutto funziona correttamente passiamo alla parte di Docker, creiamo quindi il file per procedere alla build dell’immagine, creaimo quindi un file di nome “Dockerfile” e mettiamo il seguente codice all’interno:

Dockerfile


FROM node:10

WORKDIR /app

COPY package.json /app
RUN npm install 
COPY . /app

CMD node index.js

EXPOSE 3000

Passiamo alla spiegazione di ogni singola linea di codice:

FROM node:10

L’istruzione sopra serve a definire quale immagine volgiamo utilizzare per la build dell’immagine

WORKDIR /app

Questo comando serve a creare la directory che conterrà i files dell’applicazione e che saràla nostra directory di lavoro

COPY package.json /app

RUN npm install

Le due istruzioni sopra servono invece rispettivamente a copiare il file package.json nella directory app e poi con il comando RUN eseguo un’istruzione che, in questo caso, installa tutte le dipendenze che ho

COPY .  /app

Questa istruzione invece impacchetta il codice della nostra applicazione nell’immagine che stiamo creando

CMD node index.js

Con questa istruzione invece diciamo cosa deve essere eseguito in fase di run dell’immagine nel container

EXPOSE 3000

Expose infine si occupa di esporre il servizio e mapparlo su una precisa porta del container in esecuzione

 

Una volta creato il file Dockerfile possiamo procedere a creare la build:

Nel caso voglia creare in locale la mia build da windows darò come comando(dalla cartella in cui è presete il docker file):

>> docker build -t nomeimage .            (non dimenticate alla fine il punto)

Alla fine del processo, sempre se tutto è andato per il verso giusto mi ritrovero con la mia immagine pronta. Pronta per cosa? Per essere usata. Io preferisco sempre caricare su docker hub e mettere li le mia immagini.

Prima di mettere su docker hub la nostra immagine vediamo se in locale tutto funziona.

Andiamo da powershell e scriviamo:

>> docker run -p 3000:3000 nomeimage

Anche se abbiamo usato expose in locale conviene sempre mappare le porte esterna ed interna (-p 3000:3000).

Se funziona tutto avremo il sistema funzionante, ma se non funziona tutto correttamente? Ecco un errore che mi è capitato ed ecco come risolverlo:

se doveste ottenere un errore che fa riferimento all’avvio e alla connessione esterna tra le porte quando date il comando di run….errore simile al seguente:

docker: Error response from daemon: driver failed programming external connectivity on endpoint Error starting userland proxy: mkdir /port/tcp:0.0.0.0

allora molto probabilmente dovrete andare a controllare che le extended features siano disabilitate, poi riavviare docker, fermare tutti i container attivi e poi avviare nuovamente la nostra immagine i comandi in sequenza sono i seguenti:

>> docker ps -a -q | ForEach { docker stop $_ }

Che andra a fermare tutti i contenitori avviati e poi nuovamente:

>> docker run -p 3000:3000 nomeimage

Torniamo ora al discorso di Docker Hub (https://hub.docker.com/) qui registrandovi potete creare/caricare le vostre immagini e renderle private o pubbliche.

Vediamo come fare:

iniziamo con il login:

>> docker login

Alla richiesta di nome utente e password mettiamo quelli scelti in fase di registrazione.

>> docker build -t nomeutente/nomeimage . (mi raccomando non dimenticate il punto alla fine delcomando)

Alla fine dell’esecuzione del comando build vi ritroverete l’immagine caricata su docker hub.

Per ora questo è tutto nelle prossime lezioni approfondiremo altri aspetti e creeremo il nostro ambiente di sviluppo e produzione. Scopriremo come fare manutenzione, backup ecc.. e come scalare all’aumentare del carico….. ed infine impareremo come utilizzare kubernets per gestire i nostri container.