MongoDb Docker
Usar o MongoDB Docker é a forma mais prática de ter um banco Mongo disponível na máquina de desenvolvimento sem instalar um serviço que fica sempre em execução. Neste guia, você vai baixar a imagem oficial, subir o container, montar a connection string e resolver o erro de autenticação mais comum.
Por que usar MongoDB com Docker
Instalar o MongoDB diretamente no sistema operacional deixa um serviço rodando o tempo todo, consumindo memória mesmo quando você não está programando. Além disso, trocar de versão ou limpar o ambiente costuma dar trabalho.
Com o MongoDB Docker, o banco vive dentro de um container que você liga e desliga quando quiser. Assim, cada projeto pode usar a versão de que precisa, e remover tudo leva apenas um comando.
Outro ganho é a padronização. Afinal, toda a equipe sobe o mesmo ambiente com o mesmo comando, independentemente do sistema operacional de cada pessoa.
Por fim, o container isola o banco do restante do sistema. Assim, testar uma nova versão do Mongo ou começar com um banco vazio deixa de ser arriscado, porque basta criar outro container ao lado do atual, em uma porta diferente.
Requisitos
Antes de começar, prepare três itens: um bom terminal, o Docker instalado e, no Windows, o WSL 2. Cada um deles aparece nas próximas subseções.
Terminal
Se você usa Mac ou Linux, provavelmente já tem um terminal bem completo. Porém, no Windows, a recomendação forte é usar o Windows Terminal para executar os comandos deste artigo.
O artigo Windows Terminal mostra a instalação e as configurações usadas pelo autor.
Docker instalado
Você também precisa do Docker instalado e em execução na sua máquina. Caso ainda não tenha feito essa instalação, o artigo Docker: instalação, configuração e primeiros passos mostra o passo a passo.
WSL 2 somente no Windows
No Windows, a recomendação é instalar e usar o WSL, um subsistema Linux que roda dentro do próprio Windows. Com ele, o Docker trabalha sobre um kernel Linux real e ganha desempenho.
Esse processo precisa acontecer antes da instalação do Docker. Para isso, siga o guia do artigo WSL.
Obtendo a imagem do MongoDB no Docker
Primeiro, confirme que o Docker está em execução e abra um novo terminal. Em seguida, verifique a versão instalada com o comando docker --version.
No ambiente usado no material original, a saída foi a mostrada abaixo. A sua versão provavelmente será mais nova, mas os comandos deste guia continuam os mesmos.
Docker version 19.03.12, build 48a66213fe
O próximo passo é obter a imagem do Mongo, que serve de molde para criar os containers. Para isso, execute o comando pull.
docker pull mongo
Note que a primeira mensagem será Using default tag: latest. Isso significa que o Docker baixa a versão mais recente dessa imagem, normalmente com a última versão estável do Mongo.
Caso queira uma versão específica, consulte as tags disponíveis no Docker Hub. Por exemplo, docker pull mongo:7.0 baixa a linha 7.0 e evita surpresas quando uma nova versão principal sai.
Em projetos de equipe, fixar a tag é uma boa prática. Dessa forma, todo mundo roda o MongoDB Docker na mesma versão, e o comportamento do banco não muda de uma hora para outra.
Imagem da comunidade ou imagem da MongoDB
A imagem mongo usada neste artigo é a imagem oficial mantida no Docker Hub. Além dela, a própria empresa MongoDB publica as imagens mongodb/mongodb-community-server e mongodb/mongodb-enterprise-server.
As duas opções funcionam para desenvolvimento local, e os conceitos de porta, volume e credenciais continuam os mesmos. No entanto, nomes de variáveis e detalhes de inicialização podem variar, então consulte a página da imagem escolhida antes de trocar.
Neste guia, seguimos com a imagem mongo, a mesma do material original. Dessa forma, todos os comandos do MongoDB Docker apresentados aqui funcionam sem ajustes.
Rodando o MongoDB Docker
Para criar e executar o container, use o comando abaixo. Não se esqueça de trocar os valores de MONGO_INITDB_ROOT_USERNAME e MONGO_INITDB_ROOT_PASSWORD pelo usuário e pela senha que você deseja.
docker run --name mongodb -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=balta -e MONGO_INITDB_ROOT_PASSWORD=e296cd9f mongo
Cada parte do comando tem uma função clara. A lista abaixo resume o papel de cada uma.
--name mongodbdá um nome fixo ao container, o que facilita os próximos comandos.-p 27017:27017publica a porta padrão do Mongo no host.-e MONGO_INITDB_ROOT_USERNAMEe-e MONGO_INITDB_ROOT_PASSWORDcriam o usuário administrador na primeira inicialização.mongoindica a imagem baixada no passo anterior.
As duas variáveis de ambiente só têm efeito quando o container inicia com o diretório de dados vazio. Ou seja, se você mudar a senha depois, precisa recriar o container ou alterar o usuário pelo próprio Mongo.
Windows com WSL 2
No Windows com WSL 2, o material original recomenda informar um volume para o container com a flag -v ~/docker. O comando completo fica assim:
docker run -v ~/docker --name mongodb -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=balta -e MONGO_INITDB_ROOT_PASSWORD=e296cd9f mongo
Para parar a execução, pressione CTRL + C no terminal. A partir daí, o container aparece na Dashboard do Docker Desktop, onde você pode parar ou iniciar o banco a qualquer momento.
Persistindo os dados do MongoDB Docker
Dentro do container, o Mongo grava os dados no diretório /data/db. Por isso, mapear um volume nomeado para esse caminho garante que os dados sobrevivam mesmo quando você remove o container.
docker volume create mongodb-data
docker run -d --name mongodb -p 27017:27017 -v mongodb-data:/data/db -e MONGO_INITDB_ROOT_USERNAME=balta -e MONGO_INITDB_ROOT_PASSWORD=e296cd9f mongo
A flag -d executa o container em segundo plano e libera o terminal. Assim, você continua trabalhando enquanto o MongoDB Docker roda em background.
Gerenciando o container no dia a dia
Depois de criado, o container não precisa ser recriado a cada uso. Basta ligá-lo e desligá-lo com os comandos start e stop.
# Inicia o container já existente
docker start mongodb
# Para o container sem apagar os dados
docker stop mongodb
# Lista os containers em execução
docker ps
# Mostra os logs do Mongo
docker logs mongodb
O comando docker logs ajuda bastante quando o banco não sobe. Em geral, a mensagem de erro aparece logo nas últimas linhas da saída.
Se preferir declarar tudo em arquivo, o Docker Compose descreve o mesmo ambiente em YAML. Dessa forma, o MongoDB Docker sobe com docker compose up -d e para com docker compose down.
services:
mongodb:
image: mongo
container_name: mongodb
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: balta
MONGO_INITDB_ROOT_PASSWORD: e296cd9f
volumes:
- mongodb-data:/data/db
restart: unless-stopped
volumes:
mongodb-data:
A política restart: unless-stopped religa o container quando o Docker reinicia, a menos que você o tenha parado manualmente. Para um ambiente de desenvolvimento, esse comportamento costuma ser o mais confortável.
Connection string do MongoDB Docker
Se você usou as mesmas configurações deste artigo, a connection string será igual à mostrada abaixo. Caso tenha alterado usuário, senha ou porta, ajuste os valores correspondentes.
mongodb://balta:e296cd9f@localhost:27017/admin
A string segue o formato mongodb://usuario:senha@host:porta/banco. Nesse caso, o banco admin também funciona como base de autenticação, porque o usuário root nasce nele.
Quando a aplicação precisa acessar outro banco com o usuário root, informe a base de autenticação com o parâmetro authSource. Por exemplo, mongodb://balta:e296cd9f@localhost:27017/store?authSource=admin conecta no banco store autenticando pelo admin.
Essa mesma string funciona no driver oficial do MongoDB para .NET, Node.js ou qualquer outra linguagem. Assim, a aplicação nem percebe que o MongoDB Docker roda dentro de um container.
Cliente com interface gráfica
Caso queira gerenciar o banco de forma visual, você pode usar uma ferramenta gratuita. A principal opção é o cliente oficial:
No Compass, basta colar a connection string acima na tela inicial e clicar em conectar. Em seguida, a ferramenta lista os bancos, as coleções e os documentos.
Acessando o shell do Mongo no container
Além do Compass, você pode abrir o shell do Mongo diretamente dentro do container. Para isso, use o comando docker exec com as flags -it, que mantêm a sessão interativa.
docker exec -it mongodb mongosh -u balta -p e296cd9f --authenticationDatabase admin
As imagens mais recentes trazem o mongosh, o shell moderno do Mongo. Já as imagens anteriores à versão 6.0 usam o shell antigo, chamado mongo, com os mesmos parâmetros.
Dentro do shell, comandos como show dbs e use store ajudam a explorar o banco. Para sair, digite exit.
Verificando se o banco está respondendo
Para confirmar que tudo funciona, execute um comando de ping dentro do shell. Se o banco estiver saudável, a resposta traz o campo ok com valor 1.
// Retorna { ok: 1 } quando o servidor responde
db.runCommand({ ping: 1 })
Esse teste rápido ajuda a separar problemas do banco de problemas da aplicação. Em outras palavras, se o ping responde e a aplicação falha, o erro provavelmente está na connection string.
Conectando uma aplicação .NET ao MongoDB Docker
Com o banco no ar, o próximo passo natural é consumi-lo a partir de uma aplicação. Como exemplo, vamos usar o driver oficial do MongoDB para .NET, distribuído pelo pacote MongoDB.Driver.
dotnet new console -o MongoSample
cd MongoSample
dotnet add package MongoDB.Driver
Em seguida, crie uma classe simples para representar os documentos e grave um registro na coleção. O exemplo usa a connection string montada na seção anterior.
using MongoDB.Bson;
using MongoDB.Driver;
// Mesma connection string usada no Compass
var connectionString = "mongodb://balta:e296cd9f@localhost:27017/admin";
var client = new MongoClient(connectionString);
var database = client.GetDatabase("store");
var products = database.GetCollection<Product>("products");
await products.InsertOneAsync(new Product { Name = "Keyboard", Price = 199.90m });
var all = await products.Find(_ => true).ToListAsync();
foreach (var product in all)
Console.WriteLine($"{product.Name}: {product.Price}");
public class Product
{
public ObjectId Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
}
O MongoClient abre a conexão, o GetDatabase seleciona o banco e o GetCollection aponta para a coleção. Repare que o Mongo cria o banco store e a coleção products automaticamente na primeira gravação.
Em uma aplicação real, a connection string fica no appsettings.json ou em variáveis de ambiente, e não no código. Dessa forma, você troca o MongoDB Docker local por um cluster em produção sem alterar nenhuma linha.
Boas práticas de segurança no MongoDB Docker
Mesmo em desenvolvimento, alguns cuidados simples evitam dores de cabeça. Afinal, um banco exposto na rede com senha fraca é um alvo fácil.
Primeiro, publique a porta apenas na interface local com -p 127.0.0.1:27017:27017. Assim, só a sua própria máquina acessa o banco, mesmo quando você está em uma rede compartilhada.
Além disso, evite deixar usuário e senha escritos diretamente no docker-compose.yml versionado. O Docker Compose lê variáveis de um arquivo .env, que você pode manter fora do controle de versão.
Por fim, crie um usuário com a role readWrite para cada aplicação, em vez de usar o root em todo lugar. Com isso, um vazamento de credencial afeta apenas um banco, e não o MongoDB Docker inteiro.
Erros comuns no MongoDB Docker
Mesmo com tudo configurado, alguns problemas aparecem com frequência. O mais comum envolve autenticação, e os outros costumam envolver porta ou volume.
Authentication failed
Alguns cenários apresentam erro de autenticação, principalmente ao acessar bancos que não sejam o admin. Isso acontece porque o usuário root pertence ao banco admin, e a conexão tenta autenticar em outro banco.
Uma solução é criar um usuário próprio para o banco da aplicação. Primeiro, abra o shell no container com o comando da seção anterior; depois, selecione o banco e crie o usuário, trocando your_database pelo nome desejado.
// Seleciona o banco em que o usuário será criado
use your_database
db.createUser(
{
user: "balta",
pwd: "baltaio",
roles: [
{ role: "readWrite", db: "your_database" }
]
})
A role readWrite permite ler e gravar dados apenas naquele banco. Assim, a aplicação conecta com mongodb://balta:baltaio@localhost:27017/your_database, sem depender do usuário administrador.
O original executava docker exec mongo sem as flags e sem o shell. Na prática, o comando precisa do nome do container e do executável do shell, como mostramos acima.
Porta 27017 ocupada
Se você já tem um Mongo instalado localmente, a porta 27017 pode estar em uso. Nesse caso, o Docker recusa a publicação e o container não sobe.
A saída mais simples é publicar outra porta no host, como em -p 27018:27017. Então, a connection string passa a apontar para localhost:27018.
Dados perdidos ao recriar o container
Quando você remove o container sem um volume mapeado para /data/db, os dados vão junto. Por isso, use sempre um volume nomeado no MongoDB Docker, como mostramos na seção de persistência.
Se precisar de um ambiente limpo, remova o container e o volume de forma intencional. Dessa forma, você controla quando os dados somem.
Conclusão sobre MongoDB Docker
Com poucos comandos, você colocou o MongoDB Docker em funcionamento sem instalar nenhum serviço permanente na máquina. Além disso, aprendeu a persistir os dados, gerenciar o container e montar a connection string.
O mesmo raciocínio vale para outros bancos. Por exemplo, o artigo SQL Server no Docker aplica a mesma ideia ao banco relacional da Microsoft.
A partir daqui, o próximo passo é conectar a sua aplicação ao banco e criar usuários específicos para cada projeto. Assim, o ambiente de desenvolvimento fica organizado, seguro e fácil de reproduzir.
FAQ
Qual a porta padrão do MongoDB no Docker?
A porta padrão do Mongo é a 27017. Você a publica no host com a flag -p 27017:27017.
Os dados somem quando eu paro o container?
Não, parar o container mantém os dados. Eles só se perdem quando você remove o container sem um volume mapeado para /data/db.
Posso mudar a senha do root depois de criar o container?
As variáveis MONGO_INITDB só valem na primeira inicialização com o diretório vazio. Depois disso, altere a senha pelo shell ou recrie o container e o volume.
Qual shell uso dentro do container?
Nas imagens recentes, use mongosh. Nas imagens anteriores à versão 6.0, o shell se chama mongo.
Preciso do WSL 2 para rodar o Mongo no Windows?
O WSL 2 é a recomendação para o Docker Desktop no Windows. Ele precisa estar instalado antes do Docker.