Come eseguire MongoDB in un container Docker

0
463

MongoDB è un motore di database NoSQL orientato ai documenti che ha ottenuto popolarità tra gli sviluppatori per il suo modello di archiviazione simile a JSON. MongoDB fornisce spesso una mappatura più diretta tra codice e dati persistenti, facilitando l'iterazione rapida e aiutando a risolvere il considerevole disadattamento di impedenza dei database SQL tradizionali.

Docker è una piattaforma che confeziona i componenti dell'applicazione come contenitori isolati. La containerizzazione del database MongoDB lo rende portabile in più ambienti, consentendoti di avviare un'istanza ovunque sia disponibile Docker.

In questa guida, ti mostreremo come iniziare a eseguire MongoDB in Docker. La considerazione chiave è l'archiviazione dei dati: i container Docker sono effimeri per impostazione predefinita e perdono i dati quando si fermano. Dovrai montare un volume nel tuo contenitore MongoDB per abilitare la persistenza.

Avvio di un contenitore MongoDB

Puoi iniziare un contenitore MongoDB usa e getta con docker run:

docker run -d -p 27017:27017 –name example-mongo mongo:latest

Questo ti darà un server live che esegue l'ultima versione di MongoDB. Utilizza l'immagine ufficiale disponibile su Docker Hub. Il flag -d (detach) indica che il contenitore verrà eseguito in background, separatamente dal processo della shell.

Annuncio

La porta del contenitore 27017, l'impostazione predefinita di MongoDB, è collegata alla porta 27017 sul tuo ospite. Sarai in grado di connetterti alla tua istanza Mongo su localhost:27017. Se vuoi cambiare il numero di porta, modifica la prima parte del flag -p, come 9000:27017 per usare localhost:9000.

L'immagine MongoDB include anche la shell mongo. Il comando docker exec fornisce un modo per accedervi in ​​un contenitore in esecuzione:

docker exec -it example-mongo mongo

Questo avvierà una sessione di shell Mongo interattiva nel tuo terminale. È l'ideale per interagire rapidamente con l'istanza del database senza aggiungere dipendenze esterne.

 

Puoi ispezionare i log di Mongo con il comando docker logs:

log docker example-mongo –follow

Il flag –follow significa che i log verranno continuamente trasmessi al tuo terminale.

Connessione da un altro contenitore

Se stai implementando Mongo in Docker, è probabile che vorrai connetterti da un altro contenitore come il tuo server API. È meglio unire entrambi a una rete Docker condivisa. Ciò significa che non dovrai pubblicare le porte Mongo sul tuo host, riducendo la superficie di attacco.

docker network create mongo-network docker run -d –network mongo-network –name example-mongo mongo:latest Advertisement

Il tuo “client” container dovrebbe unirsi anche alla rete mongo. Sarà in grado di fare riferimento al contenitore per nome all'interno delle stringhe di connessione MongoDB. In questo esempio, potrebbe raggiungere il database contattando example-mongo:27017.

Dati persistenti con volumi

Devi utilizzare i volumi Docker se ospiterai un database reale nel tuo contenitore Mongo. L'utilizzo di un volume mantiene i dati in modo che non vadano persi quando si arresta il contenitore o si riavvia il demone Docker.

L'immagine MongoDB è configurata per memorizzare tutti i suoi dati nella directory /data/db in il filesystem contenitore. Montare un volume in questa posizione garantirà che i dati vengano mantenuti all'esterno del contenitore.

docker run -d -p 27017:27017 –name example-mongo -v mongo-data:/data/db mongo: ultimo

Questa versione del comando docker run crea un nuovo volume Docker chiamato mongo-data e lo monta nel contenitore. Il volume sarà gestito da Docker; puoi vederlo eseguendo docker volumes ls.

Aggiungi alcuni dati a Mongo:

usa test-db db.demos.save({foo: “bar”})

Prossimo riavvio il tuo contenitore:

docker restart example-mongo

I dati aggiunti in precedenza rimarranno intatti mentre Docker ricollega il volume dopo il riavvio. Puoi verificarlo riconnettendoti a Mongo e interrogando la raccolta di demo:

usa test-db db.demos.find({foo: “bar”})

Puoi rimuovere il contenitore ed eseguirne uno completamente nuovo con lo stesso volume di dati mongo. Poiché i file del volume esisteranno ancora sul tuo host, Docker li rimonterà nel contenitore sostitutivo. Mongo salta automaticamente la sua solita routine di inizializzazione del database quando la directory dei dati è già popolata all'avvio del contenitore.

Pubblicità

I volumi persistono finché non li rimuovi con il comando docker volumes rm o usi il flag –volumes quando distruggi un contenitore con docker rm.

Aggiunta dell'autenticazione

I nuovi contenitori MongoDB mancano di autenticazione, quindi chiunque può connettersi al tuo server. Non esporre le porte del contenitore su un sistema in rete a cui potrebbe accedere un utente malintenzionato. Il sistema di autenticazione di Mongo dovrebbe essere utilizzato per proteggere adeguatamente il tuo database.

L'immagine Mongo Docker fornisce un comodo avvio rapido per il sistema di autenticazione relativamente complesso di Mongo. Puoi aggiungere un account utente iniziale impostando le variabili di ambiente MONGO_INITDB_ROOT_USERNAME e MONGODB_INITDB_ROOT_PASSWORD quando crei il tuo contenitore:

docker run -d -p 27017:27017 –name example-mongo -v mongo-data:/data/db -e MONGODB_INITDB_ROOT_USERNAME=utente-esempio -e MONGODB_INITDB_ROOT_PASSWORD=pass-esempio mongo:latest

Questo avvierà il database con un nuovo account utente chiamato example-user. All'utente verrà assegnato il ruolo di root nel database di autenticazione dell'amministratore, garantendo i privilegi di superutente.

Considerando i poteri associati a questo account, fornire la sua password come variabile di ambiente di testo semplice può essere problematico. Un approccio più sicuro consiste nell'iniettare la password come file:

docker run -d -p 27017:27017 –name example-mongo -v mongo-data:/data/db -e MONGODB_INITDB_ROOT_USERNAME= user-esempio -e MONGODB_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo-root-pw mongo:latest

Il suffisso delle variabili di ambiente dell'immagine con _FILE indica a Mongo di leggere il contenuto del file di riferimento, invece di utilizzare il valore così com'è. Il percorso effettivo del file è arbitrario – montare un file dal computer host o utilizzare Docker Secrets. In entrambi i casi, la tua password non sarà visibile quando utilizzi Docker Inspect per visualizzare le variabili del contenitore.

Configurazione del tuo server

< p>Il modo più semplice per fornire valori di configurazione Mongo personalizzati è utilizzare i flag offerti dal binario mongod. L'immagine Docker è preconfigurata per passare i suoi flag di esecuzione docker a mongod.

Pubblicità

Ecco un esempio in cui Mongo è impostato per ascoltare sulla porta 9000 invece della 27017 predefinita:

docker run -d –name example-mongo -v mongo-data:/data/db mongo:latest –port 9000

Puoi aggiungere un file di configurazione Mongo montandone uno nel tuo contenitore, quindi usando il flag –config per dire a Mongo dove cercare:

docker run -d –name example-mongo -v mongo-data:/data/db -v ./mongo.conf:/etc/mongo/mongo.conf mongo:latest –config /etc/mongo/mongo.conf

Il flag –config deve essere usato – Mongo non carica le impostazioni da nessun percorso file per impostazione predefinita.

L'immagine Docker fornisce un meccanismo per eseguire il seeding del database ed eseguire script bootstrap alla prima esecuzione. Tutti i file .sh o .js inseriti nella directory /docker-entrypoint-initdb.d verranno eseguiti in ordine alfabetico. I file .js verranno trattati come script Mongo ed eseguiti sul database di prova. Puoi modificare questo database predefinito impostando la variabile di ambiente MONGODB_INITDB_DATABASE su un nome di schema personalizzato.

Conclusione

L'esecuzione di MongoDB in Docker ti dà isolamento e portabilità per il tuo database . Puoi avviare rapidamente nuove istanze senza installare manualmente il server Mongo. I contenitori delle tue applicazioni possono essere collegati direttamente a Mongo su una rete Docker condivisa.

Pubblicità

L'immagine Mongo su Docker Hub ha tag per tutte le versioni supportate attivamente, incluse 4.4 e 5.0. L'ultimo tag punta sempre alla versione più recente, attualmente 5.0, quindi il suo utilizzo mette a rischio di ricevere salti di versione principali indesiderati. È più sicuro indicare una versione specifica all'avvio dei contenitori.

L'immagine ufficiale può essere utilizzata anche come base per quelli preconfigurati personalizzati. La creazione di un Dockerfile che aggiunge il tuo file di configurazione, sovrascrive il COMANDO per includerlo e le copie nei tuoi script di seeding ti darebbero un modo per far apparire una nuova istanza di database con meno flag di esecuzione della finestra mobile.