A principal vantagem de usar o MongoDB é que é fácil de usar. Pode-se instalar facilmente o MongoDB e começar a trabalhar nele em minutos. O Docker torna esse processo ainda mais fácil.
Uma coisa legal sobre o Docker é que, com muito pouco esforço e alguma configuração, podemos criar um contêiner e começar a trabalhar em qualquer tecnologia. Neste artigo, criaremos um contêiner do MongoDB usando o Docker e aprenderemos como anexar o volume de armazenamento de um sistema host a um contêiner.
Pré-requisitos para implantar o MongoDB no Docker
Só precisaremos do Docker instalado no sistema para este tutorial.
Criando uma imagem do MongoDB
Primeiro crie uma pasta e crie um arquivo com o nome Dockerfile dentro dessa pasta:
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Cole este conteúdo em seu 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"]
Em seguida, execute este comando para criar sua própria imagem do MongoDB Docker:
docker build -t hello-mongo:latest .
Compreendendo o conteúdo do arquivo do Docker
A estrutura de cada linha no arquivo docker é a seguinte:
INSTRUCTIONS arguments
- FROM:imagem base a partir da qual começaremos a construir o contêiner
- RUN:Este comando executa todas as instruções para instalar o MongoDB na imagem base.
- ARG:armazena alguns valores padrão para a compilação do Docker. Esses valores não estão disponíveis para o contêiner. Pode ser substituído durante o processo de construção da imagem usando o argumento --build-arg.
- ENV:esses valores estão disponíveis durante a fase de construção e também após o lançamento do contêiner. Pode ser substituído passando o argumento -e para o comando docker run.
- VOLUME:anexa o volume de dados/db ao contêiner.
- WORKDIR:define o diretório de trabalho para executar qualquer comando RUN ou CMD.
- EXPOSE:expõe a porta do contêiner para hospedar o sistema (mundo externo).
- CMD:inicia a instância do mongod no contêiner.
Iniciando o contêiner MongoDB a partir da imagem
Você pode iniciar o contêiner do MongoDB emitindo o seguinte comando:
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- --name:nome do contêiner.
- -d:irá iniciar o container como um processo de background (daemon). Não especifique este argumento para executar o contêiner como processo em primeiro plano.
- -v:anexa o volume /tmp/mongodb do sistema host ao volume /data/db do contêiner.
- -p:mapeia a porta do host para a porta do contêiner.
- O último argumento é o nome/id da imagem.
Para verificar se o contêiner está em execução ou não, emita o seguinte comando:
docker ps
A saída deste comando deve se parecer com o seguinte:
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
Acessando o MongoDB a partir do host
Depois que o contêiner estiver em execução, podemos acessá-lo da mesma maneira que acessamos a instância remota do MongoDB. Você pode usar qualquer utilitário como Compass ou Robomongo para se conectar a esta instância. Por enquanto, usarei o comando mongo para conectar. Execute o seguinte comando no seu terminal:
mongo 27017
Ele abrirá o shell do mongo, onde você poderá executar qualquer comando do mongo. Agora vamos criar um banco de dados e adicionar alguns dados nele.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Agora, para verificar se nosso mapeamento de volume está correto ou não, reiniciaremos o contêiner e verificaremos se ele possui nossos dados ou não.
Docker restart <container_id>
Agora, novamente, conecte-se ao shell do mongo e execute este comando:
db.myColl.find().pretty()
Você deve ver este resultado:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
Isso significa que nosso contêiner está persistindo os dados do banco de dados mesmo após reiniciá-lo. Isso é possível devido ao mapeamento de volume. O contêiner armazenará todos os nossos dados no diretório /tmp/mongodb no sistema host. Portanto, quando você reiniciar o contêiner, todos os dados dentro do contêiner serão apagados e um novo contêiner acessará os dados do diretório tmp/mongodb do host.
Acessando o shell de contêiner do MongoDB
$ docker exec -it <container-name> /bin/bash
Acessando logs de contêiner do MongoDB
$ docker logs <container-name>
Conectando-se ao contêiner MongoDB de outro contêiner
Você pode se conectar ao contêiner do MongoDB de qualquer outro contêiner usando o argumento --link que segue a estrutura a seguir.
--link <Container Name/Id>:<Alias>
Onde Alias é um alias para o nome do link. Execute este comando para vincular nosso contêiner Mongo ao contêiner express-mongo.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
Este comando extrairá a imagem mongo-express do dockerhub e iniciará um novo contêiner. Mongo-express é uma interface de usuário de administração para MongoDB. Agora vá para http://localhost:8081 para acessar esta interface.
Mongo-express Admin UI
Conclusão
Neste artigo, aprendemos como implantar uma imagem do MongoDB do zero e como criar um contêiner do MongoDB usando o Docker. Também passamos por alguns conceitos importantes, como mapeamento de volume e conexão a um contêiner MongoDB de outro contêiner usando links.
O Docker facilita o processo de implantação de várias instâncias do MongoDB. Podemos usar a mesma imagem do MongoDB para construir qualquer número de contêineres que podem ser usados para criar conjuntos de réplicas. Para tornar esse processo ainda mais fácil, podemos escrever um arquivo YAML (arquivo de configuração) e usar o utilitário docker-compose para implantar todos os contêineres com o único comando.