Orquestração de Containers com Docker Compose

1. Sobre o Docker Compose

O docker compose é uma ferramenta para orquestrar e executar diversos container docker. Auxilia na organização evitando imensas linhas de comando docker com muitas passagens de parâmetros.

[[img/logos/docker-compose-logo.png |height = 250px]]

2. Configuração

2.1. O arquivo yml

O compose usa um arquivo de configuração chamado docker-compose.yml, nesse arquivo define-se os serviços que serão levantados pelo compose. Os serviços usam uma imagem base, podendo ser criada a partir de um Dockerfile ou baixada do docker hub. Veja o exemplo abaixo:

version: '3'

services:
  redis:
    build: .
    ports:
      - "6379:6379"

No exemplo, cria-se um serviço redis utilizando o Dockerfile que se encontra na mesma pasta que o docker-compose.yml indicado pelo caractere .. Poderia-se também utilizar a imagem oficial do redis disponivel no docker hub, basta substituir o build: . por image: redis, onde o valor redis na chave refere-se ao nome da imagem.

2.2. Chaves básicas

2.2.1. ports

A comunicação com um container é normalmente feita via porta exposta. No exemplo acima, a porta 6379 do container é mapeada para a porta de mesmo número do host. Isto significa que ao acessar a porta 6379 no localhost o conteúdo apresentado refere-se à aplicação em execução no container.

O mapeamento é iniciado pela porta do host seguida pela porta do container: "host:conatainer".

2.2.2. volumes

Arquivos e pastas podem ser compartilhados entre o host e um container, ou entre containers, usando volumes. No docker-compose.yml o mapeamento de volume é feita com o uso da chave volumes. No exemplo, o arquivo nginx.conf é compartilhado com o container nginx. Dessa forma será possível executar alterações nas configurações do nginx diretamente do host, de forma que essas mudanças são refletidas no arquivo nginx.conf do container.

services:
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

2.2.3. depends_on

Muitas vezes é preciso subir containers em uma ordem específica por questões de dependência. A chave depends_on evita que um container suba antes de suas dependencias estarem em execução. No exemplo, o serviço web irá esperar o serviço redis para iniciar.

  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - redis

2.2.4. command

Esta chave executa o comando passado como seu valor assim que o container está em execução. No exemplo, ao terminar a build da imagem, será levantado o servidor do django.

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000

2.2.5. environment

Variáveis de ambiente podem ser passadas aos containers usando a chave enviroment, como no exemplo abaixo:

postgres:
    image: postgres
    environment:
        POSTGRES_PASSWORD: 1234
        POSTGRES_DB: postgres
        POSTGRES_USER: eu

Porém, por questões de seguraça não é legal expor senhas desta maneira. Mas, ao usar outra chave chamada env_file, é possível externalizar as variáveis para um arquivo .env e utilizá-lo como a seguir:

web:
  env_file:
    - web-variables.env

3. Executando o Docker Compose

Após configurado o docker-compose.yml, pode-se executar e subir todos os serviços com o comando:

docker-compose up

3.1. Comandos úteis:

Obs: Estes comandos exigem sudo, a menos, que tenha configurado para que não.