Um pouco sobre Docker Compose

Nesta série de posts sobre Docker, mostrei diversos comandos, como os containers funcionam, como fazer os containers se comunicarem e até mesmo como orquestrar um cluster de containers. Todavia, tudo isso foi feito comando por comando. Seria bom se existisse uma ferramenta que possibilitasse que múltiplos containers fossem executados ao mesmo tempo e de forma organizada, não seria? Pois é… seria bom e existe. Esta ferramenta é o Docker Compose, que (não por coincidência) é o tema deste post.

A primeira coisa que você deve saber é que, com o Docker Compose, você cria um arquivo texto no formato YML com todas as informações.

Vantagens do Docker Compose?

  1. Suas definições de infraestrutura são armazenadas como texto. Imagine uma aplicação com 3 camadas: API, Servidor Web e Banco de Dados. Tudo que você precisa para instalação destas camadas estará no arquivo.
  2. Portabilidade, pois todas as orientações para instalação do seu ambiente estão neste arquivo. Sendo assim, um desenvolvedor pode subir o ambiente inteiro, o tester pode subir outro e os dois vão ser iguais. Não vai ter o famoso “momento oops” onde, após horas de debug, você lembra que esqueceu de avisar para o tester que ele precisava incluir uma variável de ambiente;
  3. Facilita os testes. Ao invés de executar os testes unitários na sua maquina (que é onde tudo funciona), você pode gerar ambientes bem próximos do que será o de produção e executar os testes nele.

 

Nada é perfeito… e as Desvantagens?

  1. Se você não possuir um cache completo das imagens utilizadas no seu setup, isso pode levar ao aumento no tempo de desenvolvimento do seu produto;
  2. Devido a forma com o Docker funciona, se você alterar o arquivo criado com a composição do ambiente, precisará recriar os containers. Se este for o caso, a utilização dos volumes vai ajudar muito;

 

Obviamente, existem outras vantagens e desvantagens para a utilização do Docker Compose, mas acho que estas já são suficientes para ilustrar as possibilidades.

 

Como utilizar?

Como já mencionei no inicio do post, o Docker Compose utiliza um formato de arquivo chamado YML (Yet-another Markup Language) e existem algumas regras para utilização dele…

  1. O arquivo deve se chamar docker-compose.yml OU docker-compose.yaml;
  2. Este arquivo deve estar no diretório onde você vai rodar o comando para executa-lo;

 

Para esta demonstração, vamos criar uma aplicação WordPress e um banco MySql.

Teoricamente, precisaríamos de dois containers e poderíamos cria-los com os comandos (nesta ordem, pois o WordPress depende do MySql):

docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql
docker run --name wordpress --link mysql:mysql -d -p 5000:80 wordpress

 

Se transformarmos estes comandos em um arquivo do docker-compose, ele ficaria assim:

version: '2'

services:
  wordpress:
    image: wordpress    
    depends_on:
      - mysql
    ports:
      - "5000:80"
    restart: always
  
  mysql:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
    restart: always

 

Para facilitar a vida, salvei este exemplo no meu Github. Se você estiver utilizando o Play With Docker (o que eu recomendo), clone este arquivo.

Exemplo: https://github.com/brenordv/docker-compose-demo.git

 

Agora que você tem o arquivo docker-compose.yml, para subir os containers e fazer a aplicação funcionar, basta utilizar o comando:

docker-compose up -d

Vale reforçar que você deve utilizar a flag -d, pois sem ela o terminal vai ficar ocupado e você não vai mais conseguir utiliza-lo.

Lembra das regras de utilização que eu falei la no inicio? Pois é, você deve executar este comando no diretório onde está o arquivo do compose.

 

Para desligar a aplicação e remover os containers:

docker-compose down

Atenção: Este comando (literalmente) remove os containers, ou seja, se algo for persistido, será perdido. Para manter o que foi salvo, utilize os volumes.

 

Estrutura do arquivo docker-compose

Atualmente (no momento em que este post foi feito) existem 3 versões (1, 2 e 3), com algumas sub-versões.  Elas variam de acordo com a versão do engine do docker e algumas coisas que eram compatíveis em um versão, podem não ser em outra.

Este é um assunto que pode gerar uma outra série de posts, então não vou detalhar demais. Todavia, vou explicar um pouco o que está no script que estamos utilizando:

  1. version: Indica a versão do arquivo docker-compose que estou utilizando;
  2. services: Dentro desta chave, existem os containers que serão criados;
  3. dependes_on: Configura que este container depende de outro;
  4. environment: Define as variáveis de ambiente e os seus respectivos valores;
  5. restart: Define a frequência e/ou circunstância com que o container será reiniciado. O padrão é não reiniciar. No caso, escolhi a opção always, que sempre reiniciado. Existe também a opção on-failure, que vai reiniciar o container, caso o exit-code dele indique erro.

 

Para saber mais sobre os arquivos do docker-compose, sugiro:

  1. Pesquisar no Google pelo nome do que você quer + docker-compose. Certamente alguém já fez um arquivo destes e você pode usar como base;
  2. Leia a seção específica da documentação do Docker. Ela é muito completa, super detalhada e bem simples.  Inclusive, ela explica algumas coisas sobre o que fazer para atualizar o arquivo.

 

Por enquanto é isso. Ainda estou com planos de publicar mais alguns posts sobre Docker e (possivelmente) mais alguns exemplos.

Espero ter ajudado!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico, Dev, Docker and tagged , , , .