Docker na Prática – Parte II

Postado por DBC Company Em: Capacitação, Desenvolvimento, Tecnologia Sem comentarios

Eaí, tudo bem?! Como falado no final do artigo anterior Docker na Prática – Parte I, hoje vamos ver como subir uma aplicação completa, com banco de dados usando o Docker-Compose! Vem comigo e vamos subir uns containers!

Disclaimer

Este artigo é somente para fins didáticos, onde iremos subir uma aplicação utilizando a stack PHP, pois é a linguagem onde tenho mais domínio, porém acredito que se você entender os conceitos irá conseguir subir uma aplicação feita em qualquer outra linguagem utilizando Docker.

Iniciando

Os códigos fontes utilizados neste projeto estão disponíveis em:

https://github.com/IgorSantos17/docker-na-pratica/tree/master/php-docker-advanced

Para começar devo explicar a estrutura do projeto, que está da seguinte maneira:

  • O diretório api/ contém uma api feita em PHP utilizando o micro framework Lumen, api essa que exibe uma lista de autores do blog da DBC (com dados fakes).
  • E o diretório setup/ que contém os arquivos do Docker e de configurações para os containers.

docker-compose

Construir nossa aplicação com o docker-compose simplifica muito o processo de configurar e criar a nossa infraestrutura com Docker.

No arquivo docker-compose, definimos os três serviços necessários para subir nossa aplicação, sendo eles:

  • Servidor de Aplicação (api)
  • Servidor Web (nginx)
  • Banco de Dados (mysql).

Então, o arquivo docker-compose ficará da seguinte forma:

CALMA! Não se assuste, agora vamos entender melhor o que é cada item desse arquivo.

Container PHP (Servidor de Aplicação)

api: é o container em si;
container_name: define o nome utilizado para o container;
build: define o Dockerfile a ser utilizado, em nosso caso está em: setup/php/;
image: neste caso. declara o nome utilizado para a imagem (pois estamos utilizando a imagem declarada no Dockerfile);
working_dir: define o diretório de trabalho do container;
volumes: faz o mapeamento do diretório físico dos fontes para o container e do arquivo de config do php;
networks: define a rede que vai ser utilizada;

O Dockerfile declara uma imagem do PHP 7.4 e instala os drivers MySql necessários para realizar a conexão com o banco de dados.

O arquivo local.ini copiado nos volumes permite que você customize suas configurações do php necessárias, em nosso caso sobrescrevemos o tamanho de upload e posts.

Container Nginx (Servidor Web)

api: é o container em si;
container_name: define o nome utilizado para o container;
image: define a imagem do nginx que será utilizada para montar o container;
ports: define as portas de acesso ao container;
volumes: faz o mapeamento do diretório físico dos fontes para o container e do arquivo de config do servidor web;
networks: define a rede que vai ser utilizada;

O arquivo conf.d copiado nos volumes define as configurações necessárias para rodar nossa aplicação no servidor web Nginx.

Container MySQL (Banco de Dados)

api: é o container em si;
container_name: define o nome utilizado para o container;
image: define a imagem do mysql que será utilizada para montar o container;
ports: define as portas de acesso ao container;
environment: declara as variáveis para acesso ao banco de dados;
volumes: faz o mapeamento do diretório físico dos fontes para o container e do arquivo de config do banco de dados;
networks: define a rede que vai ser utilizada;

O arquivo my.cnf copiado nos volumes permite que você customize suas configurações do mysql necessárias, em nosso caso sobrescrevemos os valores para ativar logs do banco.

Networks e Volumes

networks: declara uma rede bridge chamada api-network, para facilitar a comunicação entre os containers.

volumes: declara o volume com nome dbdata que persiste o conteúdo da pasta /var/lib/mysql presente dentro do container. Isso permite que você pare e reinicie o serviço db sem perder dados.

“Mão na Massa”

Bom, agora já deu pra entender como os containers são construídos e configurados, certo?!
Então vamos pôr a mão na massa?! Primeiro vamos rodar o comando de build para gerar as imagens dos containers, para isto utilize o comando:

docker-compose -f .\setup\docker-compose.yml build

Concluído isso, vamos rodar o comando para “subir” os containers e deixá-los operacionais. Utilizando o comando:

docker-compose -f .\setup\docker-compose.yml up -d

Feito isso, se der tudo certo irá aparecer uma mensagem de done ao lado do nome dos containers, você pode executar o comando docker ps para verificar se todos os containers subiram. Como podemos ver na imagem abaixo:

PS: Lembrando que o CONTAINER_ID é o identificador único para cara container, enquanto NAMES são os nomes associados a cada um no docker-compose.

Você pode utilizar ambos identificadores para acessar os containers.

Agora vamos acessar o container do php (que chamamos de api) e executar a instalação das dependências necessárias para nossa api funcionar, através do composer (o qual é a ferramenta para gerenciamento de dependências do php).
Para isso execute o seguinte comando:

docker-compose -f .\setup\docker-compose.yml exec api composer install

Após realizar a instalação de todas as dependências, execute o comando abaixo para copiar o arquivo .env que contém as configurações do projeto e acessos ao banco de dados.

docker-compose -f .\setup\docker-compose.yml exec api cp .env.example .env

Feito isso, agora vamos gerar as tabelas para o nosso banco de dados através das migrations, com o comando:

docker-compose -f .\setup\docker-compose.yml exec api php artisan migrate

E após vamos gerar dados “fakes” (que serão inseridos nas tabelas criadas acima) para que a api possa consumir esses dados e ser testada.

docker-compose -f .\setup\docker-compose.yml exec api php artisan db:seed

Se não deu nenhum problema (e eu espero que não), tudo deve estar funcionando!

Então vamos aos finalmentes…

Agora nossa aplicação está “no ar”, vamos acessar no navegador o endereço http://localhost:8080/api/authors e conferir se tudo está funcionando mesmo.

Se tudo ocorreu bem, você verá uma resposta em Json com alguns autores DBC.

Ou você pode acessar no Postman (ferramenta para testar APIs) dando um GET na URL.

Concluindo

Com esse artigo podemos ver como subir nossa aplicação completa com múltiplos containers, assim como alguns comandos úteis. Podemos ver também que o Docker Compose nos permite criar uma infraestrutura para nossa aplicação ou produto com vários containers Docker, definidos em um único arquivo com um único comando. Isso também facilita para realizar integração contínua, mas isso é assunto para outro artigo.

Ah e não perca, nos próximos artigos vamos ver algumas ferramentas úteis para nosso dia a dia e um artigo especial para completar essa saga de artigos sobre Docker. Até lá!

Por Igor Santos, Desenvolvedor de Sistemas na DBC Company.

igor.santos@dbccompany.com.br

7 Likes