ASP.NET Core  - Web API com MongoDB - III


 Neste artigo veremos como acessar o MongoDB em um container Docker usando uma Web API ASP.NET Core.

Na primeira parte do artigo criamos uma Web API acessando o MongoDB local. Vamos agora usar esta API e acessar o MongoDB em um container Docker. Para isso vamos primeiro acessar o container diretamente da API e depois vamos criar um container para a nossa API e acessar o container do Mongo.

Se você não conhece o Docker acompanhe meu minicurso de Docker no canal :
https://www.youtube.com/playlist?list=PLJ4k1IC8GhW1kYcw5Fiy71cl-vfoVpqlV

Veja também o minicurso de Docker em artigos neste link: https://www.macoratti.net/Cursos/docker_mcurso.htm

Acessando o container do Mongo com a API

Nossa API esta pronta e já acessa o MongoDB local. Vamos agora acessar um container Docker do MongoDB com a nossa API.

Nota: Você precisa ter o Docker instalado no seu ambiente.

Para acessar o container do MongoDB primeiro vamos lembrar o comando usado para criar o container:

docker run --name mongo_container -e MONGO_INITDB_ROOT_USERNAME=macoratti -e MONGO_INITDB_ROOT_PASSWORD=numsey -d -p 27018:27017 mongo

Este comando criar o container de nome mongo_container e define o usuário macoratti e a senha numsey.

A string de conexão usada para acessar este container é :  mongodb://macoratti:numsey@localhost:27018/admin

Com isso definido podemos alterar a string de conexão no arquivo appsettings.json da nossa aplicação ASP.NET Core AlunosApi.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "DatabaseSettings": {
    "ConnectionString": "mongodb://macoratti:numsey@localhost:27018/admin",
    "DatabaseName": "AlunosDB"
  }
}

Agora basta executar nossa API e na interface do Swagger acessar os endpoints para criar novos alunos e exibir os dados dos alunos.

Como exemplo vamos acessar o endpoint POST /api/alunos e incluir um novo alunos conforme abaixo:

A seguir vamos acessar o endpoint GET /api/alunos e exibir o aluno criado:

Com isso estamos criando e consultando informações a partir do container do MongoDB e assim não precisamos instalar o MongoDB localmente.

Fica aqui o alerta de que como não criamos volumes neste exemplo os dados não serão preservados após o container morrer.

Criando um container para a API e acessando o container do Mongo

Agora vamos criar um container para a nossa aplicação AlunosApi e a seguir a partir deste container acessar o container do MongoDB. Assim estaremos usando apenas containers Docker em nosso ambiente.

Para isso teremos que criar uma imagem da nossa aplicação ASP.NET Core usando um arquivo Dockerfile e a seguir criar um arquivo docker-compose para orquestrar os dois containeres e realizar a conexão entre eles.

Um Dockerfile é um arquivo texto que descreve as etapas que o Docker precisa para preparar uma imagem, incluindo a instalação de pacotes, criação de diretórios e definição de variáveis de ambiente entre outras coisas.

O Docker Compose é usado para descrever aplicações de forma consistente e previsível usando um arquivo de composição que contém detalhes de todos os volumes, redes e contêineres que compõem um aplicativo e os relacionamentos entre eles. Para processar o arquivo de composição usamos o comando : docker-compose up

Felizmente podemos usar o ambiente do Visual Studio e criar esses dois arquivos de forma bem simples.

Para isso vamos abrir o nosso projeto AlunosApi no VS 2022 e clicar com o botão direito sobre o projeto;

A seguir selecione a opção Add -> Docker Support...

Selecione a opção Linux e clique em OK:

Após isso será criado o arquivo Dockerfile na raiz do projeto com o seguinte código :

Você notará que este arquivo também será executado e que será criada a imagem alunosapi com a tag dev e o container alunosapi:dev no ambiente do Docker como mostra a janela Output(Verifique isso usando o dashboard do Docker)

Para poder usar a imagem da aplicação ASP.NET Core em outros ambientes podemos enviar a imagem para o repositório do Docker Hub criando uma conta privada e assim poderemos acessar as imagens deste repositório de qualquer lugar.

Agora para poder orquestrar os containers da API e do Mongo vamos criar o arquivo docker compose.

Para isso clique novamente no projeto e selecione a opção : Add-> Container Orchestrator Support...

Marque a opção : Docker Compose

A seguir marque a opção :  Linux

Ao final teremos criado na solução o projeto docker-compose contendo os arquivos: docker-compose.yml e docker-compose.override.yml.

Vamos alterar o código do arquivo docker-compose.yml e definir os serviços para criar os containers da API e do Mongo e fazer a conexão entre eles.

Primeiro vamos alterar o código do arquivo docker-compose.yml incluindo o serviço para o container do MongoDB:

A seguir vamos alterar o código do arquivo docker-compose.override.yml definindo no serviço do container do mongo o volume e as portas, e, no serviço do container da API vamos definir o ambiente e a nova string de conexão que agora acessa o container alunosdb na porta 27017.

Agora podemos executar o projeto Docker-Compose e veremos que serão criados os dois containeres como podemos observar na janela Containers no VS 2022:

Note que podemos obter informações sobre o ambiente, Labels, Ports, Volumes , Files e Logs para cada container me execução.

A seguir podemos executar o projeto e usar a nossa API incluindo, alterando e consultando informações de alunos usando a interface do Swagger:

Agora temos em nosso ambiente local dois containeres em execução , o da API e o do Mongo que estão se comunicando e assim podemos distribuir os arquivos docker-compose e Dockerfile para serem executados em qualquer ambiente que possua o Docker. Como estamos usando volumes os dados serão persistidos localmente mesmo após os containeres serem destruídos.

Pegue o projeto aqui:  AlunosApi_Docker.zip

"Portanto nós também, pois que estamos rodeados de uma tão grande nuvem de testemunhas, deixemos todo o embaraço, e o pecado que tão de perto nos rodeia, e corramos com paciência a carreira que nos está proposta"
Hebreus 12:1

Referências:


José Carlos Macoratti