DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on • Edited on

1

Docker Compose

Anteriormente, aprendemos aspectos importantes sobre imagens, volumes, redes, etc. O problema é que a combinação desses conceitos em uma abordagem onde cada passo é executado manualmente é um processo sujeito a erro, já que cada comando deve ser inserido corretamente e as etapas devem ser executadas na ordem correta. Para evitar esses problemas é que serve o Docker Compose.

O Docker Compose é uma ferramenta usada para escrever aplicaçãoes complexas e gerenciar os contêineres, as redes e os volumes que essa aplicação exigem para funcionar.

Ele simplifica o processo de configuração e execução de aplicativos para que você não precise digitar comandos complexos que podem levar a erros de configuração. É usado para descrever aplicações de forma consistente e previsível usando um arquivo de composição (extensão .yml) que contém detalhes de todos os volumes, redes e contêiners que compõem um aplicativo e os relacionamentos entre eles.

Image description

Docker Compose — Preparando nosso ambiente

Se você chegou aqui pelos seguindo os “artigos” anteriores, vimos que na abordagem manual usada até o momento, tínhamos feito:

  • Criamos uma rede chamada backend
  • Criamos uma rede chamada frontend
  • Criamos um volume de dados em MSQL e um contêiner MYSQL
  • Criamos um contêiner da aplicação mvc1, mvc2, mvc3 com a definição do Dockerfile
  • Criamos também um contêiner de balanceador de carga com o haproxy.cfg

Testamos utilizar o navegador e o fluxograma da junção de todas as nossas tecnologias ficou assim:

Image description

vamos limpar todas as nossas [imagens], [volumes], [redes] e [contêineres] criados em nosso ambiente. Vamos fazer todos os processos anteriores, só que dessa vez utilizando a tecnologia do Docker Compose.

Docker Compose — Roteiro Básico

  1. Defnir o ambiente necessário para sua aplicação funcionar utilizando um Dockerfile
  2. Criar o arquivo de composição (.yml) definindo quais são os serviços essenciais para a sua aplicação e o relacionamento entre eles
  3. Processo o arquivo de composição executando o comando docker-compose para que seu ambiente seja criado e configurado.

O Arquivo de composição (.yml ou yaml)

O arquivo de composição é o ponto de partida na utilização do Docker Compose. Embora seja possível colocar o arquivo de composição em qualquer local do projeto, por convenção, ele é colocado na raiz do diretório do projeto. Isso facilita o acesso e a organização.

YAML ou YML é um formato usado para cria arquivos de configuração de fácil leitura. Organizando os arquivos em seções e usa a identação com espaços para expressas a estrutura do arquivo.

version: "3"

volumes:
        produtosdata:

networks:
        frontend:
        backend:
Enter fullscreen mode Exit fullscreen mode

version: Define a versão do Docker Compose que está sendo usada.

volumes: Define volumes persistentes que podem ser usados pelos contêineres para armazenar dados de forma que, mesmo se o contêiner for removido, os dados não sejam perdidos.

networks: Define redes personalizadas para que os contêineres possam se comunicar entre si.

Caso não tenha ficado claro como funciona os pontos definidos, você pode ler individualmente para que fique mais claro. volumes, networks.

Criando o arquivo de composição Docker-compose.yml

Como já foi estruturado a base anteriormente nosso arquivo docker-compose.yml, vamos dar continuidade a sua estruturação.

volumes:
 produtosdata:

networks:
 frontend:
 backend:

Enter fullscreen mode Exit fullscreen mode

Explicando a seção Services

Agora surge uma nova seção chamada services, que descreve os serviços usados para criar contêineres. A seção services do arquivo docker-compose.yml é onde definimos os serviços que compõem a nossa aplicação. Cada serviço nada mais é do que um contêiner que será criado e configurado automaticamente pelo Docker Compose.

Cada service representa uma parte funcional da sua aplicação, como por exemplo:

  • Um banco de dados (ex: mysql, postgres)
  • Uma API backend (ex: aspnet, node)
  • Um frontend (ex: React, Angular, Razor Pages)
  • Um balanceador de carga (ex: haproxy, nginx)
  • Um cache (ex: redis, memcached)
  • Entre outros serviços que rodam em contêineres

Comparando docker run com docker-compose.yml

Docker Run

Como vimos anteriormente, podemos criar a imagem do MySQL com o comando:

docker container run -d 
--name mysql 
-v -produtosdata:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=numsey 
-e bind-address=0.0.0.0 
mysql:5.7
Enter fullscreen mode Exit fullscreen mode

Rodando em Docker Compose

Agora, veja como tudo isso pode ser feito de forma mais organizada, legível e reutilizável usando o docker-compose.yml:

volumes:
 produtosdata:

networks:
 frontend:
 backend:

services:
  mysql:
   image: "mysql:5.7"
   volumes: 
   - produtosdata:/var/lib/mysql
   networks:
   - backend
   environment:
   - MYSQL_ROOT_PASSWORD=numsey
   - bind-address=0.0.0.0
Enter fullscreen mode Exit fullscreen mode

docker-compose build

Processar o arquivo de composição docker compose e verificar sintaxe:

docker-compose build
Enter fullscreen mode Exit fullscreen mode

docker-compose up

Processar o arquivo de composição docker compose e iniciar aplicação

docker-compose up
Enter fullscreen mode Exit fullscreen mode

Ao rodar o docker-compose up, a aplicação Docker gerará as instâncias configuradas pelo arquivo. Até o momento nossa aplicação está funcional, ainda precisamos definir outros serviços. Mas vamos dar uma olhada nos contêineres, volumes e networks até o momento?
docker container ps -a

CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
c859974a3234   mysql:5.7   "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   3306/tcp, 33060/tcp   mvc1-mysql-1
Enter fullscreen mode Exit fullscreen mode

docker network ls

NETWORK ID     NAME               DRIVER    SCOPE
acdb16b2398f   mvc1_backend       bridge    local
Enter fullscreen mode Exit fullscreen mode

docker volume ls

DRIVER    VOLUME NAME
local     mvc1_produtosdata
Enter fullscreen mode Exit fullscreen mode

Se você perceber, o Docker utiliza prefixos baseados no nome da pasta do projeto ou no nome especificado no arquivo docker-compose.yml para garantir que os recursos, como containers, redes e volumes, não entrem em conflito entre diferentes projetos. Essa abordagem é útil quando você tem múltiplos projetos rodando em diferentes diretórios, mas com a mesma estrutura de nomes para containers, volumes ou redes.

Exemplo: Se o nome da pasta for mvc_project, os containers criados a partir do docker-compose.yml terão o prefixo mvc_project_, como mvc_project_mysql_1 ou mvc_project_mvc_1.

docker-compose down

Desfazer a operação, removendo contêineres e redes descritas no arquivo de composição

docker-compose down --volumes
Enter fullscreen mode Exit fullscreen mode

Por padrão, o comando docker-compose down não remove os volumes, pois eles armazenam dados persistentes dos containers. Usamos a opção --volumes quando queremos também remover esses volumes e apagar completamente o ambiente.

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay