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.