Основното предимство на използването на MongoDB е, че е лесен за използване. Човек може лесно да инсталира MongoDB и да започне да работи върху него за минути. Docker прави този процес още по-лесен.
Едно страхотно нещо за Docker е, че с много малко усилия и известна конфигурация можем да завъртим контейнер и да започнем да работим по всяка технология. В тази статия ще завъртим MongoDB контейнер с помощта на Docker и ще научим как да прикачим обема за съхранение от хост система към контейнер.
Предварителни условия за разполагане на MongoDB в Docker
Ще ни трябва само Docker, инсталиран в системата за този урок.
Създаване на изображение на MongoDB
Първо създайте папка и създайте файл с името Dockerfile вътре в тази папка:
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Поставете това съдържание във вашия 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"]
След това изпълнете тази команда, за да създадете свое собствено изображение на MongoDB Docker:
docker build -t hello-mongo:latest .
Разбиране на съдържанието на файла Docker
Структурата на всеки ред в docker файла е както следва:
INSTRUCTIONS arguments
- ОТ:Основно изображение, от което ще започнем да изграждаме контейнера
- RUN:Тази команда изпълнява всички инструкции за инсталиране на MongoDB в основното изображение.
- ARG:Съхранява някои стойности по подразбиране за компилацията на Docker. Тези стойности не са налични за контейнера. Може да бъде отменено по време на процеса на изграждане на изображението с помощта на аргумента --build-arg.
- ENV:Тези стойности са налични по време на фазата на изграждане, както и след стартиране на контейнера. Може да бъде отменен чрез предаване на аргумента -e на командата за изпълнение на docker.
- VOLUME:Прикачва обема данни/db към контейнера.
- WORKDIR:Задава работната директория за изпълнение на RUN или CMD команди.
- EXPOSE:Разкрива порта на контейнера за хостване на системата (външен свят).
- CMD:Стартира екземпляра на mongod в контейнера.
Стартиране на контейнера MongoDB от изображението
Можете да стартирате контейнера MongoDB, като издадете следната команда:
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- --name:Име на контейнера.
- -d:Ще стартира контейнера като фонов (демон) процес. Не посочвайте този аргумент, за да стартирате контейнера като процес на преден план.
- -v:Прикачете обема /tmp/mongodb на хост системата към /data/db обема на контейнера.
- -p:Съпоставете хост порта с порта на контейнера.
- Последният аргумент е името/идентификаторът на изображението.
За да проверите дали контейнерът работи или не, издайте следната команда:
docker ps
Резултатът от тази команда трябва да изглежда по следния начин:
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
Достъп до MongoDB от хост
След като контейнерът е стартиран и работи, можем да получим достъп до него по същия начин като достъп до отдалечения екземпляр на MongoDB. Можете да използвате всяка помощна програма като Compass или Robomongo, за да се свържете с този екземпляр. Засега ще използвам команда mongo за свързване. Изпълнете следната команда във вашия терминал:
mongo 27017
Той ще отвори mongo shell, където можете да изпълнявате всякакви mongo команди. Сега ще създадем една база данни и ще добавим някои данни в нея.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Сега, за да проверим дали нашето съпоставяне на обема е правилно или не, ще рестартираме контейнера и ще проверим дали има нашите данни или не.
Docker restart <container_id>
Сега отново се свържете с mongo shell и изпълнете тази команда:
db.myColl.find().pretty()
Трябва да видите този резултат:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
Това означава, че нашият контейнер запазва данните от базата данни дори след рестартирането му. Това е възможно благодарение на картографирането на обема. Контейнерът ще съхранява всички наши данни в директорията /tmp/mongodb в хост системата. Така че, когато рестартирате контейнера, всички данни в контейнера ще бъдат изтрити и нов контейнер ще има достъп до данните от хост директорията tmp/mongodb.
Достъп до MongoDB Container Shell
$ docker exec -it <container-name> /bin/bash
Достъп до регистрационни файлове на контейнера MongoDB
$ docker logs <container-name>
Свързване към контейнера MongoDB от друг контейнер
Можете да се свържете с контейнера MongoDB от всеки друг контейнер, като използвате аргумент --link, който следва следната структура.
--link <Container Name/Id>:<Alias>
Където псевдоним е псевдоним за име на връзката. Изпълнете тази команда, за да свържете нашия контейнер Mongo с контейнер Express-mongo.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
Тази команда ще изтегли изображението на mongo-express от dockerhub и ще стартира нов контейнер. Mongo-express е администраторски потребителски интерфейс за MongoDB. Сега отидете на http://localhost:8081 за достъп до този интерфейс.
Потребителски интерфейс на администратора на Mongo-expressЗаключение
В тази статия научихме как да разположим изображение на MongoDB от нулата и как да създадем контейнер MongoDB с помощта на Docker. Освен това преминахме през някои важни концепции като картографиране на обема и свързване към контейнер MongoDB от друг контейнер с помощта на връзки.
Docker улеснява процеса на внедряване на множество екземпляри на MongoDB. Можем да използваме едно и също изображение на MongoDB, за да изградим произволен брой контейнери, които могат да се използват за създаване на набори реплики. За да направим този процес още по-гладък, можем да напишем YAML файл (конфигурационен файл) и да използваме помощната програма docker-compose за разгръщане на всички контейнери с една единствена команда.