Główną zaletą korzystania z MongoDB jest to, że jest łatwy w użyciu. MongoDB można łatwo zainstalować i rozpocząć pracę w kilka minut. Docker czyni ten proces jeszcze łatwiejszym.
Fajną rzeczą w Dockerze jest to, że przy niewielkim wysiłku i pewnej konfiguracji możemy rozkręcić kontener i rozpocząć pracę nad dowolną technologią. W tym artykule rozkręcimy kontener MongoDB za pomocą Dockera i dowiemy się, jak podłączyć wolumin pamięci z systemu hosta do kontenera.
Wymagania wstępne instalacji MongoDB w Dockerze
W tym samouczku będziemy potrzebować tylko Dockera zainstalowanego w systemie.
Tworzenie obrazu MongoDB
Najpierw utwórz folder i utwórz plik o nazwie Dockerfile w tym folderze:
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Wklej tę treść do pliku 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"]
Następnie uruchom to polecenie, aby zbudować własny obraz Docker MongoDB:
docker build -t hello-mongo:latest .
Zrozumienie zawartości pliku Docker
Struktura każdego wiersza w pliku dockera jest następująca:
INSTRUCTIONS arguments
- OD:Obraz bazowy, od którego zaczniemy budować kontener
- URUCHOM:To polecenie wykonuje wszystkie instrukcje instalacji MongoDB w obrazie podstawowym.
- ARG:przechowuje niektóre wartości domyślne dla kompilacji platformy Docker. Te wartości nie są dostępne dla kontenera. Może zostać nadpisany podczas procesu budowania obrazu za pomocą argumentu --build-arg.
- ENV:Te wartości są dostępne w fazie budowania, a także po uruchomieniu kontenera. Można to zmienić, przekazując argument -e do polecenia docker run.
- VOLUME:Dołącza wolumin danych/db do kontenera.
- WORKDIR:Ustawia katalog roboczy do wykonywania poleceń RUN lub CMD.
- EXPOSE:Udostępnia port kontenera jako hosta systemu (świat zewnętrzny).
- CMD:uruchamia instancję mongod w kontenerze.
Uruchamianie kontenera MongoDB z obrazu
Możesz uruchomić kontener MongoDB, wydając następujące polecenie:
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- --name:Nazwa kontenera.
- -d:Uruchomi kontener jako proces działający w tle (demon). Nie podawaj tego argumentu, aby uruchomić kontener jako proces na pierwszym planie.
- -v:Dołącz wolumin /tmp/mongodb systemu hosta do woluminu /data/db kontenera.
- -p:mapuj port hosta na port kontenera.
- Ostatni argument to nazwa/identyfikator obrazu.
Aby sprawdzić, czy kontener jest uruchomiony, wydaj następujące polecenie:
docker ps
Wynik tego polecenia powinien wyglądać następująco:
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
Dostęp do MongoDB z hosta
Gdy kontener jest już uruchomiony i działa, możemy uzyskać do niego dostęp w taki sam sposób, jak dostęp do zdalnej instancji MongoDB. Możesz użyć dowolnego narzędzia, takiego jak Compass lub Robomongo, aby połączyć się z tą instancją. Na razie do połączenia użyję polecenia mongo. Uruchom następujące polecenie w swoim terminalu:
mongo 27017
Otworzy powłokę mongo, w której możesz wykonać dowolne polecenia mongo. Teraz utworzymy jedną bazę danych i dodamy do niej trochę danych.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Teraz, aby sprawdzić, czy nasze mapowanie woluminów jest poprawne, czy nie, ponownie uruchomimy kontener i sprawdzimy, czy zawiera nasze dane, czy nie.
Docker restart <container_id>
Teraz ponownie połącz się z powłoką mongo i uruchom to polecenie:
db.myColl.find().pretty()
Powinieneś zobaczyć ten wynik:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
Oznacza to, że nasz kontener utrzymuje dane bazy danych nawet po ponownym uruchomieniu. Jest to możliwe dzięki mapowaniu głośności. Kontener będzie przechowywać wszystkie nasze dane w katalogu /tmp/mongodb w systemie hosta. Tak więc po ponownym uruchomieniu kontenera wszystkie dane w kontenerze zostaną usunięte, a nowy kontener uzyska dostęp do danych z katalogu hosta tmp/mongodb.
Uzyskiwanie dostępu do powłoki kontenera MongoDB
$ docker exec -it <container-name> /bin/bash
Dostęp do dzienników kontenera MongoDB
$ docker logs <container-name>
Łączenie się z kontenerem MongoDB z innego kontenera
Możesz połączyć się z kontenerem MongoDB z dowolnego innego kontenera za pomocą argumentu --link, który ma następującą strukturę.
--link <Container Name/Id>:<Alias>
Gdzie Alias jest aliasem nazwy łącza. Uruchom to polecenie, aby połączyć nasz kontener Mongo z kontenerem express-mongo.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
To polecenie pobierze obraz mongo-express z dockerhub i uruchomi nowy kontener. Mongo-express to interfejs administratora dla MongoDB. Teraz przejdź do http://localhost:8081, aby uzyskać dostęp do tego interfejsu.
Interfejs administratora Mongo-expressWniosek
W tym artykule dowiedzieliśmy się, jak wdrożyć obraz MongoDB od podstaw i jak utworzyć kontener MongoDB za pomocą Dockera. Przejrzeliśmy również kilka ważnych koncepcji, takich jak mapowanie woluminów i łączenie się z kontenerem MongoDB z innego kontenera za pomocą linków.
Docker ułatwia proces wdrażania wielu instancji MongoDB. Możemy użyć tego samego obrazu MongoDB do zbudowania dowolnej liczby kontenerów, które można wykorzystać do tworzenia zestawów replik. Aby proces ten był jeszcze płynniejszy, możemy napisać plik YAML (plik konfiguracyjny) i użyć narzędzia docker-compose do wdrożenia wszystkich kontenerów za pomocą jednego polecenia.