Hur man kör MongoDB i en Docker Container

0
153

MongoDB är en dokumentorienterad NoSQL-databasmotor som har vunnits popularitet hos utvecklare för sin JSON-liknande lagringsmodell. MongoDB tillhandahåller ofta en mer direkt mappning mellan kod och kvarstående data, vilket underlättar snabb iteration och hjälper till att åtgärda den betydande impedansmissmatchen för traditionella SQL-databaser.

Docker är en plattform som paketerar dina applikationskomponenter som isolerade behållare. Att behålla din MongoDB-databas gör den portabel över miljöer, så att du kan snurra upp en instans var som helst där Docker är tillgänglig.

I den här guiden visar vi dig hur du kommer igång med att köra MongoDB i Docker. Det viktigaste är datalagring: Docker-containrar är tillfälliga som standard och förlorar sin data när de slutar. Du måste montera en volym i din MongoDB-behållare för att möjliggöra beständighet.

Starta en MongoDB-behållare

Du kan börja en engångsmongoDB-behållare med docker run:

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

Detta ger dig en liveserver som kör den senaste versionen av MongoDB. Den använder den officiella bilden som är tillgänglig på Docker Hub. Flaggan -d (lösgör) betyder att behållaren kommer att köras i bakgrunden, separat för din skalprocess.

Annons

Behållarporten 27017, MongoDB-standarden, är bunden tillbaka till port 27017 på din värd. Du kommer att kunna ansluta till din Mongo-instans på localhost:27017. Om du vill ändra portnumret, ändra den första delen av flaggan -p, t.ex. 9000:27017 för att använda localhost:9000.

MongoDB-bilden innehåller också mongoskalet. Docker exec-kommandot tillhandahåller ett sätt att komma åt det i en körande behållare:

docker exec -it example-mongo mongo

Detta kommer att starta en interaktiv Mongo-skalsession i din terminal. Den är idealisk för att snabbt interagera med din databasinstans utan att lägga till några externa beroenden.

 

Du kan inspektera Mongos loggar med kommandot docker logs:

docker logs example-mongo –follow

Flaggan –follow betyder att loggar kontinuerligt strömmas till din terminal.

Ansluter från en annan container

h2>

Om du distribuerar Mongo i Docker, är chansen stor att du vill ansluta från en annan behållare som din API-server. Det är bäst att ansluta båda till ett delat Docker-nätverk. Det betyder att du inte behöver publicera Mongo-portar till din värd, vilket minskar din attackyta.

docker-nätverk skapa mongo-nätverk docker kör -d –nätverk mongo-nätverk –namn exempel-mongo mongo:senaste Annons

Din “klient” container bör också ansluta till mongo-nätverket. Den kommer att kunna referera till behållaren med namn inom MongoDB-anslutningssträngar. I det här exemplet kan den nå databasen genom att kontakta example-mongo:27017.

Bestående data med volymer

Du måste använda Docker-volymer om du ska vara värd för en riktig databas i din Mongo-behållare. Att använda en volym behåller din data så att den inte går förlorad när du stoppar behållaren eller startar om Docker-demonen.

MongoDB-avbildningen är konfigurerad för att lagra all sin data i /data/db-katalogen i behållarens filsystem. Att montera en volym på den här platsen säkerställer att data finns kvar utanför behållaren.

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

Denna version av docker run-kommandot skapar en ny Docker-volym som kallas mongo-data och monterar den i behållaren. Volymen kommer att hanteras av Docker; du kan se det genom att köra docker-volymer ls.

Lägg till lite data till Mongo:

använd test-db db.demos.save({foo: “bar”})

Nästa omstart din behållare:

docker restart example-mongo

De tidigare tillagda data förblir intakta när Docker återansluter volymen efter omstarten. Du kan kontrollera detta genom att återansluta till Mongo och fråga demossamlingen:

använd test-db db.demos.find({foo: “bar”})

Du kan ta bort behållaren och köra en helt ny med samma mongo-datavolym. Eftersom volymens filer fortfarande finns kvar på din värd kommer Docker att montera tillbaka dem i ersättningsbehållaren. Mongo hoppar automatiskt över sin vanliga databasinitieringsrutin när datakatalogen redan är ifylld vid containerstart.

Annons

Volymer kvarstår tills du tar bort dem med kommandot docker volumes rm eller använder flaggan –volumes när du förstör en behållare med docker rm.

Lägga till autentisering

Färska MongoDB-behållare saknar autentisering så att vem som helst kan ansluta till din server. Exponera inte containerns portar på ett nätverkssystem som en angripare kan komma åt. Mongo’s autentiseringssystem bör användas för att säkra din databas ordentligt.

Mongo Docker-bilden ger en bekväm snabbstart för Mongo’s relativt komplexa autentiseringssystem. Du kan lägga till ett första användarkonto genom att ställa in miljövariablerna MONGO_INITDB_ROOT_USERNAME och MONGODB_INITDB_ROOT_PASSWORD när du skapar din behållare:

docker run -d -p 27017:27017 –name example-mongo -v mongo-data:/data/db -e MONGODB_INITDB_ROOT_USERNAME=exempelanvändare -e MONGODB_INITDB_ROOT_PASSWORD=exempelpass mongo:senaste

Detta kommer att starta databasen med ett nytt användarkonto som heter exempel-användare. Användaren kommer att tilldelas rotrollen i administratörsautentiseringsdatabasen, vilket ger superanvändarprivilegier.

Med tanke på de befogenheter som är associerade med detta konto kan det vara problematiskt att tillhandahålla lösenordet som en vanlig textmiljövariabel. En säkrare metod är att injicera lösenordet som en fil:

docker run -d -p 27017:27017 –name exempel-mongo -v mongo-data:/data/db -e MONGODB_INITDB_ROOT_USERNAME= exempel-användare -e MONGODB_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo-root-pw mongo:senaste

Att suffixera bildens miljövariabler med _FILE instruerar Mongo att läsa innehållet i den refererade filen, istället för att använda värdet som det är. Den faktiska filsökvägen är godtycklig – antingen montera en fil från din värddator eller använd Docker Secrets. Hur som helst kommer ditt lösenord inte att vara synligt när du använder docker inspect för att se containerns variabler.

Konfigurera din server

< p>Det enklaste sättet att tillhandahålla anpassade Mongo-konfigurationsvärden är att använda flaggorna som erbjuds av mongod-binären. Docker-bilden är förkonfigurerad för att skicka sina dockerrun-flaggor till mongod.

Annons

Här är ett exempel där Mongo är inställd på att lyssna på port 9000 istället för standard 27017:

docker run -d –namn exempel-mongo -v mongo-data:/data/db mongo:latest –port 9000

Du kan lägga till en Mongo-konfigurationsfil genom att montera en i din behållare och sedan Använd flaggan –config för att tala om för Mongo var den ska leta:

docker run -d –namn exempel-mongo -v mongo-data:/data/db -v ./mongo.conf:/etc/mongo/mongo.conf mongo: senaste –config /etc/mongo/mongo.conf

Flaggan –config måste användas – Mongo laddar inte inställningar från någon filsökväg som standard.

Docker-avbildningen tillhandahåller en mekanism för att se din databas och köra bootstrap-skript vid första körningen. Alla .sh- eller .js-filer som placeras i katalogen /docker-entrypoint-initdb.d kommer att köras i alfabetisk ordning. .js-filer kommer att behandlas som Mongo-skript och köras mot testdatabasen. Du kan ändra denna standarddatabas genom att ställa in miljövariabeln MONGODB_INITDB_DATABASE till ett anpassat schemanamn.

Slutsats

Att köra MongoDB i Docker ger dig isolering och portabilitet för din databas . Du kan snabbt skapa nya instanser utan att manuellt installera Mongo-servern. Dina applikationsbehållare kan länka direkt till Mongo över ett delat Docker-nätverk.

Annons

Mongo-bilden på Docker Hub har taggar för alla aktivt stödda versioner inklusive 4.4 och 5.0. Den senaste taggen pekar alltid på den senaste versionen, för närvarande 5.0, så att använda den riskerar att få oönskade större versionsstötar. Det är säkrare att ange en specifik version när du startar dina behållare.

Den officiella bilden kan också användas som bas för anpassade förkonfigurerade. Att bygga en Dockerfil som lägger till din konfigurationsfil, åsidosätter COMMAND för att inkludera den och kopior i dina såddskript skulle ge dig ett sätt att ta fram en ny databasinstans med färre flaggor för dockerkörning.