Den största fördelen med att använda MongoDB är att det är lätt att använda. Man kan enkelt installera MongoDB och börja arbeta på det på några minuter. Docker gör denna process ännu enklare.
En häftig sak med Docker är att vi, med väldigt lite ansträngning och viss konfiguration, kan snurra upp en container och börja arbeta med vilken teknik som helst. I den här artikeln kommer vi att snurra upp en MongoDB-behållare med Docker och lära oss hur man kopplar lagringsvolymen från ett värdsystem till en container.
Förutsättningar för att distribuera MongoDB på Docker
Vi behöver bara Docker installerat i systemet för denna handledning.
Skapa en MongoDB-bild
Skapa först en mapp och skapa en fil med namnet Dockerfile i den mappen:
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Klistra in detta innehåll i din Dockerfile:
FROM debian:jessie-slim
RUN apt-get update && \
apt-get install -y ca-certificates && \
rm -rf /var/lib/apt/lists/*
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6 && \
gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg
ARG MONGO_PACKAGE=mongodb-org
ARG MONGO_REPO=repo.mongodb.org
ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
ENV MONGO_MAJOR 3.4
ENV MONGO_VERSION 3.4.18
RUN echo "deb http://$MONGO_REPO/apt/debian jessie/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR main" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN echo "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN apt-get update
RUN apt-get install -y ${MONGO_PACKAGE}=$MONGO_VERSION
VOLUME ["/data/db"]
WORKDIR /data
EXPOSE 27017
CMD ["mongod", "--smallfiles"]
Kör sedan det här kommandot för att bygga din egen MongoDB Docker-avbildning:
docker build -t hello-mongo:latest .
Förstå Docker-filinnehållet
Strukturen för varje rad i docker-filen är som följer:
INSTRUCTIONS arguments
- FRÅN:Basbild från vilken vi börjar bygga behållaren
- KÖR:Detta kommando kör alla instruktioner för att installera MongoDB i basavbildningen.
- ARG:Lagrar vissa standardvärden för Docker-bygget. Dessa värden är inte tillgängliga för behållaren. Kan åsidosättas under byggprocessen av bilden med argumentet --build-arg.
- ENV:Dessa värden är tillgängliga under byggfasen såväl som efter lansering av behållaren. Kan åsidosättas genom att skicka argumentet -e till kommandot docker run.
- VOLYM:Bifogar data/db-volymen till behållaren.
- WORKDIR:Ställer in arbetskatalogen för att köra alla RUN- eller CMD-kommandon.
- EXPONERING:Exponerar containerns port för att vara värd för systemet (omvärlden).
- CMD:Startar mongod-instansen i behållaren.
Starta MongoDB-behållaren från bilden
Du kan starta MongoDB-behållaren genom att utfärda följande kommando:
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- --name:Behållarens namn.
- -d:Startar behållaren som en bakgrundsprocess (demon). Ange inte detta argument för att köra behållaren som förgrundsprocess.
- -v:Bifoga /tmp/mongodb-volymen för värdsystemet till /data/db-volymen för behållaren.
- -p:Mappa värdporten till containerporten.
- Sista argument är bildens namn/id.
För att kontrollera om behållaren körs eller inte, utfärda följande kommando:
docker ps
Utdata för detta kommando bör se ut så här:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7e04bae0c53 hello-mongo "mongod --smallfiles" 7 seconds ago Up 6 seconds 0.0.0.0:27017->27017/tcp my-mongo
Åtkomst till MongoDB från värden
När behållaren väl är igång kan vi komma åt den på samma sätt som när vi kommer åt den fjärranslutna MongoDB-instansen. Du kan använda vilket verktyg som helst som Compass eller Robomongo för att ansluta till den här instansen. För tillfället kommer jag att använda mongo-kommandot för att ansluta. Kör följande kommando i din terminal:
mongo 27017
Det kommer att öppna mongo-skalet där du kan utföra alla mongo-kommandon. Nu ska vi skapa en databas och lägga till lite data i den.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Nu för att kontrollera om vår volymmappning är korrekt eller inte, kommer vi att starta om behållaren och kontrollera om den har våra data eller inte.
Docker restart <container_id>
Anslut nu igen till mongo shell och kör detta kommando:
db.myColl.find().pretty()
Du bör se detta resultat:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
Det betyder att vår behållare behåller databasdata även efter att den har startat om. Detta är möjligt på grund av volymkartläggning. Behållaren kommer att lagra all vår data i katalogen /tmp/mongodb i värdsystemet. Så när du startar om behållaren kommer all data inuti behållaren att raderas och en ny behållare kommer åt data från värdkatalogen tmp/mongodb.
Åtkomst till MongoDB Container Shell
$ docker exec -it <container-name> /bin/bash
Åtkomst till MongoDB Container Logs
$ docker logs <container-name>
Ansluta till MongoDB-behållaren från en annan behållare
Du kan ansluta till MongoDB-behållaren från vilken annan behållare som helst med --link-argumentet som följer följande struktur.
--link <Container Name/Id>:<Alias>
Där Alias är ett alias för länknamn. Kör det här kommandot för att länka vår Mongo-behållare med express-mongo-behållare.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
Detta kommando kommer att dra mongo-express-bilden från dockerhub och starta en ny behållare. Mongo-express är ett administratörsgränssnitt för MongoDB. Gå nu till http://localhost:8081 för att komma åt detta gränssnitt.
Mongo-express Admin UISlutsats
I den här artikeln lärde vi oss hur man distribuerar en MongoDB-avbildning från början och hur man skapar en MongoDB-behållare med Docker. Vi gick också igenom några viktiga koncept som volymkartläggning och att ansluta till en MongoDB-behållare från en annan behållare med hjälp av länkar.
Docker förenklar processen med att distribuera flera MongoDB-instanser. Vi kan använda samma MongoDB-bild för att bygga valfritt antal behållare som kan användas för att skapa replikauppsättningar. För att göra denna process ännu smidigare kan vi skriva en YAML-fil (konfigurationsfil) och använda docker-compose-verktyget för att distribuera alla behållare med det enda kommandot.