Como executar o MongoDB em um contêiner Docker

O MongoDB é um mecanismo de banco de dados NoSQL orientado a documentos que ganhou popularidade entre os desenvolvedores por seu modelo de armazenamento semelhante ao JSON. O MongoDB geralmente fornece um mapeamento mais direto entre o código e os dados persistentes, facilitando a iteração rápida e ajudando a resolver a incompatibilidade de impedância considerável dos bancos de dados SQL tradicionais.
O Docker é uma plataforma que empacota os componentes do seu aplicativo como contêineres isolados. Colocar seu banco de dados MongoDB em contêineres o torna portátil em todos os ambientes, permitindo que você gere uma instância em qualquer lugar que o Docker esteja disponível.
Neste guia, mostraremos como começar a executar o MongoDB no Docker. A principal consideração é o armazenamento de dados: os contêineres do Docker são efêmeros por padrão e perdem seus dados quando param. Você precisará montar um volume em seu contêiner MongoDB para habilitar a persistência.
Iniciando um contêiner MongoDB
Você pode iniciar um contêiner MongoDB descartável com docker run:
docker run -d -p 27017: 27017 --name example-mongo mongo: mais recente
Isso fornecerá a você um servidor ativo executando a versão mais recente do MongoDB. Ele usa a imagem oficial disponível no Docker Hub. O sinalizador -d (detach) significa que o contêiner será executado em segundo plano, separadamente do seu processo de shell.
Publicidade
A porta 27017 do contêiner, o padrão do MongoDB, está ligada à porta 27017 em seu host. Você poderá se conectar à sua instância do Mongo no localhost: 27017. Se você quiser alterar o número da porta, modifique a primeira parte do sinalizador -p, como 9000: 27017 para usar localhost: 9000.
A imagem MongoDB também inclui o shell mongo. O comando docker exec fornece uma maneira de acessá-lo em um contêiner em execução:
docker exec -it example-mongo mongo
Isso iniciará uma sessão shell interativa do Mongo em seu terminal. É ideal para interagir rapidamente com sua instância de banco de dados sem adicionar dependências externas.

Você pode inspecionar os registros do Mongo com o comando docker logs:
docker registra example-mongo --follow
O sinalizador --follow significa que os logs serão continuamente transmitidos para o seu terminal.
Conexão de outro contêiner
Se você estiver implantando o Mongo no Docker, é provável que deseje se conectar a partir de outro contêiner, como o seu servidor de API. É melhor unir ambos a uma rede Docker compartilhada. Isso significa que você não precisará publicar portas Mongo em seu host, reduzindo a superfície de ataque.
docker network criar mongo-network docker run -d --network mongo-network --name example-mongo mongo: mais recente
Publicidade
Seu “ cliente ” o contêiner também deve se conectar à rede mongo. Ele poderá fazer referência ao contêiner por nome nas strings de conexão do MongoDB. Neste exemplo, ele pode chegar ao banco de dados entrando em contato com example-mongo: 27017.
Dados persistentes com volumes
Você deve usar volumes Docker se for hospedar um banco de dados real em seu contêiner Mongo. Usar um volume persiste em seus dados para que não sejam perdidos quando você interrompe o contêiner ou reinicia o daemon do Docker.
A imagem MongoDB é configurada para armazenar todos os seus dados no diretório / data / db no sistema de arquivos do contêiner. Montar um volume neste local garantirá que os dados sejam mantidos fora do contêiner.
docker run -d \ -p 27017: 27017 \ --name example-mongo \ -v mongo-data: / data / db \ mongo: mais recente
Esta versão do comando docker run cria um novo volume do Docker chamado mongo-data e o monta no contêiner. O volume será gerenciado pelo Docker; você pode ver isso executando docker volumes ls.
Adicione alguns dados ao Mongo:
use test-db db. demos. save ()
Em seguida, reinicie seu contêiner:
exemplo de reinicialização do docker-mongo
Os dados adicionados anteriormente permanecerão intactos enquanto o Docker reconecta o volume após a reinicialização. Você pode verificar isso reconectando-se ao Mongo e consultando a coleção de demos:
use test-db db. demos. find ()
Você pode remover o contêiner e executar um inteiramente novo com o mesmo volume de dados mongo. Como os arquivos do volume ainda existirão em seu host, o Docker os montará de volta no contêiner de substituição. O Mongo pula automaticamente sua rotina normal de inicialização do banco de dados quando o diretório de dados já está preenchido na inicialização do contêiner.
Publicidade
Os volumes persistem até que você os remova com o comando docker volumes rm ou use o sinalizador --volumes ao destruir um contêiner com docker rm.
Adicionando autenticação
Os contêineres Fresh MongoDB carecem de autenticação para que qualquer pessoa possa se conectar ao seu servidor. Não exponha as portas do contêiner em um sistema em rede que um invasor possa acessar. O sistema de autenticação do Mongo deve ser usado para proteger adequadamente o seu banco de dados.
A imagem Mongo Docker fornece um início rápido conveniente para o sistema de autenticação relativamente complexo do Mongo. Você pode adicionar uma conta de usuário inicial definindo as variáveis de ambiente MONGO_INITDB_ROOT_USERNAME e MONGODB_INITDB_ROOT_PASSWORD ao criar seu contêiner:
docker run -d \ -p 27017: 27017 \ --name example-mongo \ -v mongo-data: / data / db \ -e MONGODB_INITDB_ROOT_USERNAME = example-user \ -e MONGODB_INITDB_ROOT_PASSWORD = example-pass \ mongo: mais recente
Isso iniciará o banco de dados com uma nova conta de usuário chamada example-user. O usuário receberá a função raiz no banco de dados de autenticação do administrador, concedendo privilégios de superusuário.
Considerando os poderes associados a esta conta, fornecer sua senha como uma variável de ambiente de texto simples pode ser problemático. Uma abordagem mais segura é injetar a senha como um arquivo:
docker run -d \ -p 27017: 27017 \ --name example-mongo \ -v mongo-data: / data / db \ -e MONGODB_INITDB_ROOT_USERNAME = example-user \ -e MONGODB_INITDB_ROOT_PASSWORD_FILE = / run / secrets / mongo-root-pw \ mongo: mais recente
Sufixar as variáveis de ambiente da imagem com _FILE instrui o Mongo a ler o conteúdo do arquivo referenciado, em vez de usar o valor como está. O caminho real do arquivo é arbitrário – monte um arquivo de sua máquina host ou use Docker Secrets. De qualquer forma, sua senha não ficará visível ao usar o docker inspect para visualizar as variáveis do contêiner.
Configurando seu servidor
A maneira mais fácil de fornecer valores de configuração personalizados do Mongo é usar os sinalizadores oferecidos pelo binário mongod. A imagem do Docker é pré-configurada para passar seus sinalizadores de execução do docker para o mongod.
Publicidade
Aqui está um exemplo em que o Mongo está configurado para escutar na porta 9000 em vez do padrão 27017:
docker run -d \ --name example-mongo \ -v mongo-data: / data / db \ mongo: último --port 9000
Você pode adicionar um arquivo de configuração do Mongo montando um em seu contêiner e usando a sinalização --config para informar ao Mongo onde procurar:
docker run -d \ --name example-mongo \ -v mongo-data: / data / db \ -v ./mongo. conf:/etc/mongo/mongo. conf mongo: mais recente - config /etc/mongo/mongo. conf
O sinalizador --config deve ser usado – O Mongo não carrega configurações de nenhum caminho de arquivo por padrão.
A imagem Docker fornece um mecanismo para propagar seu banco de dados e executar scripts de bootstrap na primeira execução. Quaisquer arquivos . sh ou . js colocados no diretório /docker-entrypoint-initdb.d serão executados em ordem alfabética. Os arquivos . js serão tratados como scripts Mongo e executados no banco de dados de teste. Você pode alterar esse banco de dados padrão definindo a variável de ambiente MONGODB_INITDB_DATABASE para um nome de esquema personalizado.
Conclusão
Executar o MongoDB no Docker oferece isolamento e portabilidade para seu banco de dados. Você pode ativar rapidamente novas instâncias sem instalar manualmente o servidor Mongo. Os contêineres de seu aplicativo podem ser vinculados diretamente ao Mongo por meio de uma rede Docker compartilhada.
Publicidade
A imagem Mongo no Docker Hub possui tags para todas as versões ativamente suportadas, incluindo 4.4 e 5.0. A tag mais recente sempre aponta para a versão mais recente, atualmente 5.0, portanto, usá-la coloca você em risco de receber colisões indesejadas da versão principal. É mais seguro indicar uma versão específica ao iniciar seus contêineres.
A imagem oficial também pode ser usada como base para imagens personalizadas pré-configuradas. Construir um Dockerfile que adiciona seu arquivo de configuração, substitui o COMMAND para incluí-lo e cópias em seus scripts de propagação daria a você uma maneira de abrir uma nova instância de banco de dados com menos sinalizadores de execução do docker.
Nenhum comentário