Docker Compose não é nada mais que um orquestrador de containers. Esse plugin para Docker permite definir e gerenciar vários containers de maneira fácil, assim, é possível orquestrar vários containers Docker. Imagine que você possui uma aplicação simples em PHP e MYSQL, caso você deseje implementar esse ambiente em Docker, na mão, você teria que criar um container para o PHP, outro para MySQL, e também para cada instância de VM que vai rodar a aplicação. Com Compose, você precisa apenas definir quais e como fazer cada container necessário para a sua aplicação em um arquivo YAML. O processo de deploy da sua aplicação fica muito mais fácil com Compose, pois basta um arquivo contendo todos os parâmetros e instruções que será possível criar, executar e atualizar os containers.
Se você estiver utilizando o Docker Engine, muito possivelmente não foi instalado o Docker Compose. Docker Desktop possui no pacote o Compose.
Se a sua instalação estiver condizente com o tutorial disponível em Instalação e Configuração, para instalar o Docker Compose execute sudo apt-get install docker-compose-plugin
Os comandos do Docker Compose são essenciais para criar, iniciar, parar e gerenciar contêineres interligados e facilitar a administração de ambientes complexos com múltiplos serviços. Aqui estão os comandos básicos mais comuns do Docker Compose:
A estrutura básica do arquivo YAML que controlará o Compose é essa:
version: '3.8'
networks:
volumes:
services:
exemplo:
image:
ports:
deploy:
restart:
networks:
volumes:
Compose trata cada container como um serviço, logo para declarar um container, precisamos declarar dentro da coleção services
Para cada container declarado dentro de services, precisamos definir a imagem do container. A opção image permite declarar qual imagem usar no container. Por exemplo, para criar um container MySQL, declaramos image:mysql. Caso esteja utilizando uma imagem que precisa ser construída, declaramos build, em vez da instrução passada, com o DockerFile e o ambiente para construir a imagem.
A opção port define a porta que o container utilizará do hospedeiro para ofertar algum serviço. Já a opção expose define as portas que o container abrirá para se comunicar com outros containers dentro da mesma rede.
A opção networks define as redes que o container participará, incluindo drivers e sub-redes. Em volumes definimos os volumes que o container utilizará, podendo criar ou acessar volumes do hospedeiro que desejamos referenciar.
Em environment definimos o ambiente que o container terá, incluindo as varíaveis de ambiente. Já em depends_on definimos os containers que será requisitos para a nossa aplicação. Por exemplo, a aplicação PHP precisará de um container MySQL.
Nesse exemplo, criaremos um arquivo YAML para uma aplicação Wordpress. Inicialmente, vamos criar um arquivo
chamado aplicacao.yml
Comando: nano aplicacao.yml
Dentro do aplicacao.yml, vamos inserir uma linha contendo a versão do Compose que estamos utilizando,
a versão atual da data deste tutorial.
version: '3.8'
Então vamos declarar a nossa aplicação dentro de services:
version: '3.8'
services:
aplicacao:
Inserimos a imagem que o container utilizará, a porta e a política de reinício.
version: '3.8'
services:
aplicacao:
image:wordpress
restart:always
ports:
-"80:80"
Então inseremos as variáveis de ambiente para o Wordpress, que conterá os dados do banco de dados.
version: '3.8'
services:
aplicacao:
image:wordpress
restart:always
ports:
-"80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
Como toda aplicação Wordpress precisa de um banco de dados, precisamos criar um container MySQL. Primeiro adicionamos a opção depends_on dentro de aplicação e então adicionamos um novo container dentro de services declarando o container MySQL.
version: '3.8'
volumes:
db_data:
services:
aplicacao:
image:wordpress
restart:always
ports:
-"80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
depends_on:
-db
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: senharoot
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
Com o nosso arquivo aplicacao.yml pronto, para executar, rodamos o comando:
docker-compose -f aplicacao.yml up
Já existem arquivos prontos para a sua aplicação, disponível no repositório GIT Awesome Compose. Aproveite para explorá-los!