Brook Preloader

Un container MongoDB su Docker

Per creare un container all’interno del nostro computer, abbiamo bisogno di un’immagine da cui partire. Il container infatti è esprimibile come l’istanza di un’immagine di partenza.

Tutte le immagini per essere messe a disposizione degli utilizzatori di Docker vengono immagazzinate all’interno di una repository online che si chiama Docker Hub.

Utilizzando il comando docker pull <nome_immagine> scarichiamo in automatico dal Docker Hub l’immagine che corrisponde al nome selezionato, l’assenza di un tag di versione implica automaticamente che siamo interessato all’ultima versione dell’immagine sul Docker Hub.

 

 PS C:\Users\gpace> docker pull mongo

L’avvio della procedura ha come il seguente output che ci permette di comprendere meglio cos’è un’immagine:

 

 PS C:\Users\gpace> docker pull mongo
 Using default tag: latest
 latest: Pulling from library/mongo
 675920708c8b: Downloading [================================>                  ]  18.57MB/28.57MB
 6f9c8c301e0f: Download complete
 73738965c4ce: Download complete
 7fd6635b9ddf: Download complete
 73a471eaa4ad: Download complete
 bcf274af89b0: Download complete
 04fc489f2a3b: Download complete
 e1abc36251b9: Downloading [=>                                                 ]  7.564MB/193.6MB
 396db6f4d800: Download complete

Come possiamo vedere, dalla riga 4 ala riga 12 del precedente script, parte una procedura di download in parallelo di dimensioni varie, quelli che vengono scaricati sono i layer che comporranno l’immagine di MongoDB desiderata.

L’immagine seguente sarà più esplicativa:

 

Al completamento dell’operazione verrà controllato il valore di Digest che verifica il checksum dei layer appena scaricati.

 

 ...
 e1abc36251b9: Pull complete
 396db6f4d800: Pull complete
 Digest: sha256:c57e511ce78d6847e2605db8e374611492f588e24f93c80e0c6baba9d6c029c3
 Status: Downloaded newer image for mongo:latest
 docker.io/library/mongo:latest

Tutte le immagini scaricate sul nostro elaboratore sono elencabili tramite il comando docker image ls.

 

 PS C:\Users\gpace> docker image ls
 REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
 mongo        latest    a70885e78ca8   3 days ago   695MB

Come possiamo analizzare dall’output:

 

  • REPOSITORY corrisponde alla repository richiesta su Docker Hub dalla quale è stata scaricata l’immagine.
  • TAG è il numero di versione richiesta, in questo caso è latest poiché è stata richiesta l’ultima versione disponibile all’esecuzione del comando
  • IMAGE ID è l’identificativo univoco dell’immagine all’interno del nostro hard disk che ci servirà per effettuare delle operazioni sull’immagine (es. esecuzione o eliminazione)
  • CREATED la data in cui è stata creata questa versione e resa disponibile su Docker Hub
  • SIZE dimensione sull’hard disk dell’immagine comprensiva di tutti i layer

 

Avvio del container MongoDB

Per avvio del container si intende la procedura secondo la quale, partendo dall’immagine, viene avviata una copia di essa totalmente indipendente da eventuali altri container.

Guardiamo come viene utilizzato in questo specifico scenario il comando docker run:

 

 docker run -d --name mongo_test -p 27117:27017 -e MONGO_INITDB_ROOT_USERNAME=usertest -e MONGO_INITDB_ROOT_PASSWORD=passwordtest -v $HOME/DOCKER/dockerMongoDB/data:/data/db mongo:latest

Analizziamo i parametri inseriti:

 

  • -d è il comando di avvio in modalità detached ovvero in modalità background. In assenza di questo comando il container andrà in stato di stop alla chiusura del terminale, in questo modo anche alla chiusura del terminale il container rimarrà in stato running.
  • -name è il nome del container che potremo utilizzare nelle fasi successive per procedura di stop, eliminazione, avvio. In assenza di questo parametro il nome viene generato in maniera randomica.
  • -p è relativo al mapping delle porte tra host e container, questa procedura collega la porta 27117 del host con la porta 27017 del container. La porta del host è diversa e possiamo assegnarla arbitrariamente (tra quelle disponibili) perché ci servirà per avviare più di un container che utilizza la stessa porta di destinazione. Grazie a questo “ponte” tra la porta dell’host e quella del container, tutto il traffico diretto alla porta 27117 del host verrà indirizzato alla 27017 del container.
  • -e crea due variabili d’ambiente (enviroment variables) che sono relative alla creazione dell’utente (username) con permessi di root sul database tramite MONGO_INITDB_ROOT_USERNAME e relativa password tramite MONGO_INITDB_ROOT_PASSWORD.
  • -v creazione immediata di un volume sulla cartella locale del host, questa verrà utilizzata come deposito dei database file di MongoDB. Salviamo il database file sul nostro host perché altrimenti, alla distruzione del container perdiamo tutto il contenuto del database, in questo modo utilizziamo il container solo da DBMS e mettiamo al sicuro il contenuto del DataBase al di fuori di esso.

 

 PS C:\Users\gpace> docker run -d --name mongo_test -p 27117:27017 -e MONGO_INITDB_ROOT_USERNAME=usertest -e MONGO_INITDB_ROOT_PASSWORD=passwordtest -v $HOME/DOCKER/dockerMongoDB/data:/data/db mongo:latest
 ​
 2356a437628e3d05864122aa3a1b6ae07b8591cc0a30264ac2424b0df75341f1

La stringa in output all’avvio dell’istruzione è un identificativo univoco all’interno del nostro host che ci servità per eliminare il container, fermarlo o riavviarlo.

 

Operazioni sul container

Per visualizzare tutti i container avviati possiamo usare il comando docker container ls:

 

 CONTAINER ID   IMAGE          COMMAND                  ...
 40775031d184   mongo:latest   "docker-entrypoint.s…"   ...

Per fermare un container usiamo docker stop <nome_immagine>, se ci verrà restituito il nome dell’immagine allora il comando è andato a buon fine.

 

 PS C:\Users\gpace> docker stop mongo_test
 mongo_test

Per avviare un container usiamo docker start <nome_immagine> stando attenti ad utilizzare il lower-case.

 

 PS C:\Users\gpace> docker start mongo_test
 mongo_test

 

Avviare comandi all’interno del container

Per collegare il terminale al nostro container dobbiamo utilizzare il comando docker exec:

 

 docker exec -it mongo_test bash

Questo avvierà una console (bash) interattiva -it all’interno del container con nome mongotest. Si tratta di una vera e propria connessione che ci permette di interfacciarci con la console bash del container Linux.

A questo punto possiamo interagire direttamente con MongoDB connettendoci al server locale (locale dall’interno del container), utilizzando il comando mongosh –username <valore_username> –password <valore_password> incorporato nei mongo tools incorporati nell’immagine.

 

 PS C:\Users\gpace> docker exec -it mongo_test bash
 root@40775031d184:/# mongosh --username usertest --password passwordtest
 Current Mongosh Log ID: 633b47c4c397aff65b186c92
 Connecting to:          mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0
 Using MongoDB:          6.0.2
 Using Mongosh:          1.6.0
 ...

Una volta connessi all’interno del sistema ci verranno mostrati tutti i dettagli sulla versione di MongoDB e MongoSH utilizzati permettendoci quindi di avviare le prime query, per controllare che tutto sia apposto avviamo il comando per visualizzare i database presenti all’interno del volume condiviso.

 

 test> show dbs
 admin   100.00 KiB
 config   12.00 KiB
 local    72.00 KiB
 test>

Come suggerito dalle prime stringhe di MongoSH, per connetterci da remoto tramite ad esempio MongoDB Compass possiamo utilizzare la seguente stringa di connessione:

 

 mongodb://usertest:passwordtest@127.0.0.1:27117/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0

Dobbiamo stare attenti all’inserimento delle credenziali usertest:passwordtest seguendo il formato username:password e poniamo la giusta attenzione alla porta di connessione che, connettendoci dall’host non sarà più la 27017 ma bensì la 27117 esposta dal container all’host.