Le principal avantage d'utiliser MongoDB est qu'il est facile à utiliser. On peut facilement installer MongoDB et commencer à travailler dessus en quelques minutes. Docker rend ce processus encore plus simple.
Une chose intéressante à propos de Docker est que, avec très peu d'effort et une certaine configuration, nous pouvons faire tourner un conteneur et commencer à travailler sur n'importe quelle technologie. Dans cet article, nous allons faire tourner un conteneur MongoDB à l'aide de Docker et apprendre à attacher le volume de stockage d'un système hôte à un conteneur.
Prérequis pour déployer MongoDB sur Docker
Nous n'aurons besoin que de Docker installé dans le système pour ce didacticiel.
Création d'une image MongoDB
Créez d'abord un dossier et créez un fichier avec le nom Dockerfile dans ce dossier :
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Collez ce contenu dans votre 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"]
Exécutez ensuite cette commande pour créer votre propre image Docker MongoDB :
docker build -t hello-mongo:latest .
Comprendre le contenu du fichier Docker
La structure de chaque ligne dans le fichier docker est la suivante :
INSTRUCTIONS arguments
- FROM :image de base à partir de laquelle nous allons commencer à créer le conteneur
- RUN :cette commande exécute toutes les instructions pour installer MongoDB dans l'image de base.
- ARG :stocke certaines valeurs par défaut pour la construction Docker. Ces valeurs ne sont pas disponibles pour le conteneur. Peut être remplacé pendant le processus de construction de l'image à l'aide de l'argument --build-arg.
- ENV :ces valeurs sont disponibles pendant la phase de construction ainsi qu'après le lancement du conteneur. Peut être remplacé en passant l'argument -e à la commande docker run.
- VOLUME :Attache le volume de données/db au conteneur.
- WORKDIR :définit le répertoire de travail pour exécuter toutes les commandes RUN ou CMD.
- EXPOSE :expose le port du conteneur pour héberger le système (monde extérieur).
- CMD :Démarre l'instance mongod dans le conteneur.
Démarrer le conteneur MongoDB à partir de l'image
Vous pouvez démarrer le conteneur MongoDB en lançant la commande suivante :
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- --name :nom du conteneur.
- -d :démarrera le conteneur en tant que processus d'arrière-plan (démon). Ne spécifiez pas cet argument pour exécuter le conteneur en tant que processus de premier plan.
- -v :Attachez le volume /tmp/mongodb du système hôte au volume /data/db du conteneur.
- -p :mappe le port hôte sur le port du conteneur.
- Le dernier argument est le nom/id de l'image.
Pour vérifier si le conteneur est en cours d'exécution ou non, exécutez la commande suivante :
docker ps
La sortie de cette commande devrait ressembler à ceci :
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
Accéder à MongoDB depuis l'hôte
Une fois que le conteneur est opérationnel, nous pouvons y accéder de la même manière que l'accès à l'instance MongoDB distante. Vous pouvez utiliser n'importe quel utilitaire comme Compass ou Robomongo pour vous connecter à cette instance. Pour l'instant, je vais utiliser la commande mongo pour me connecter. Exécutez la commande suivante dans votre terminal :
mongo 27017
Il ouvrira mongo shell où vous pourrez exécuter toutes les commandes mongo. Nous allons maintenant créer une base de données et y ajouter des données.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Maintenant, pour vérifier si notre mappage de volume est correct ou non, nous allons redémarrer le conteneur et vérifier s'il contient ou non nos données.
Docker restart <container_id>
Maintenant, connectez-vous à nouveau au shell mongo et exécutez cette commande :
db.myColl.find().pretty()
Vous devriez voir ce résultat :
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
Cela signifie que notre conteneur conserve les données de la base de données même après son redémarrage. Ceci est possible grâce au mappage de volume. Le conteneur stockera toutes nos données dans le répertoire /tmp/mongodb du système hôte. Ainsi, lorsque vous redémarrez le conteneur, toutes les données à l'intérieur du conteneur seront effacées et un nouveau conteneur accédera aux données à partir du répertoire hôte tmp/mongodb.
Accéder au shell du conteneur MongoDB
$ docker exec -it <container-name> /bin/bash
Accéder aux journaux du conteneur MongoDB
$ docker logs <container-name>
Connexion au conteneur MongoDB à partir d'un autre conteneur
Vous pouvez vous connecter au conteneur MongoDB à partir de n'importe quel autre conteneur en utilisant l'argument --link qui suit la structure suivante.
--link <Container Name/Id>:<Alias>
Où Alias est un alias pour le nom du lien. Exécutez cette commande pour lier notre conteneur Mongo au conteneur express-mongo.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
Cette commande extrait l'image mongo-express de dockerhub et démarre un nouveau conteneur. Mongo-express est une interface utilisateur d'administration pour MongoDB. Allez maintenant sur http://localhost:8081 pour accéder à cette interface.
Interface d'administration Mongo-expressConclusion
Dans cet article, nous avons appris à déployer une image MongoDB à partir de zéro et à créer un conteneur MongoDB à l'aide de Docker. Nous avons également abordé certains concepts importants tels que le mappage de volume et la connexion à un conteneur MongoDB à partir d'un autre conteneur à l'aide de liens.
Docker facilite le processus de déploiement de plusieurs instances MongoDB. Nous pouvons utiliser la même image MongoDB pour créer n'importe quel nombre de conteneurs pouvant être utilisés pour créer des ensembles de répliques. Pour rendre ce processus encore plus fluide, nous pouvons écrire un fichier YAML (fichier de configuration) et utiliser l'utilitaire docker-compose pour déployer tous les conteneurs avec une seule commande.