Instalação do Docker compose

Em um artigo anterior eu mostrei o processo para instalar o Docker que é uma das várias ferramentas básicas para criar e gerenciar contêineres. Agora eu mostro uma ferramenta completar que é o “Docker compose”, um plugin que permite ao Docker gerenciar aplicações em múltiplos contêineres.

O que é o Docker Compose

O Docker compose é uma ferramenta opcional para complementar o Docker mas, particularmente, apesar de ser extra eu considero fundamental e se você ainda não a conhece, creio que depois de ler estes exemplos você concordará comigo da importância deste plugin.

Vamos supor um cenário onde você precise implementar uma aplicação web, como o WordPress ou Nextcloud. Ambas escritas em PHP e que usam pelo menos uma base de dados MySQL, logo, nós precisamos ao menos dois contêineres para implementá-las. Um contêiner com Apache+php e outro com MySQL.

Note que eu disse “ao menos dois”. Isso porque há vários cenários alternativos. Por exemplo, poderíamos optar por manter separados o Apache e o PHP em contêineres diferentes, o que nos levaria a ter a três contêineres.

Ou ainda, poderíamos necessitar do REDIS para fazer cache, e que ficaria em um quarto contêiner.

Talvez um quinto contêiner rodando “MinIO” ou outro serviço de armazenamento de objetos fosse desejável

Indo mais longe, poderíamos colocar um sexto contêiner com o Caddy ou Traefik para fazer balanceamento de carga, roteamento ou gerenciamento de certificados SSL em mais um contêiner.

Não existe limite para quantos contêineres você pode/deve usar na sua aplicação. E mais ainda, se alguém instalar um WordPress completo usando cinco contêineres, isso não estará mais certo ou mais errado do que a instalação de outra pessoa que use apenas dois contêineres.

O que é certo dizer é que qualquer que seja sua escolha, ela deverá atender a sua necessidade “agora”. Se futuramente ela não atender mais, ela deverá ser readequada de acordo com o resultado de uma nova avaliação.

Claro que você deve ter algum trabalho para estimar da melhor forma possível qual será o melhor cenário para o seu caso de forma que demore bastante para realizara readequação, mas não se aborreça demais com isso. Mente quem te disser que tem uma aplicação rodando a vários anos sem nunca ter feito qualquer ajuste em sua infra.

Embora o uso de contêineres facilite bastante a reestruturação do seu ambiente, independente da quantidade de contêineres que sua aplicação precise, gerencia-los de forma individual não é uma tarefa tão prática de ser feita apenas com o Docker sozinho.

É justamente aqui que entra o “Compose”, um plugin para Docker que o permitirá gerenciar diversos contêineres que fazem parte da mesma solução. 

Plugin ou aplicação a parte?

Esta informação é importante já que estamos em um período de transição de versões do “Docker Compose” e originalmente (na versão 1.x) ele era uma ferramenta independente do Docker, somente a partir da versão 2.x é que ele se tornou um plugin.

Se você já leu outros tutoriais por ai, é bem certo que, dependendo da época em que foram escritos, você perceba diferenças entre o processo de instalação e até na sintaxe de alguns comandos em razão disso.

Uma forma fácil de descobrir se o texto está tratando do Compose 1.x ou 2.x) é observar a sintaxe dos comandos de exemplos.

Se o comando é “docker-compose […]” (note a presença do hífen), é a versão 1.x, se o comando é “docker compose […]” (note a ausência do hífen), é a versão 2.x.

Na prática ambos se equivalem, havendo umas poucas funcionalidades da versão 1.x que até o momento não foram implementadas completamente na versão 2.x, mas em geral elas são equivalentes e dificilmente você notará qualquer diferença além do “-” durante o uso.

Instalando o plugin do Docker compose

Nós vamos optar pela instalação do plugin que é a versão 2.18 que, no momento em que escrevo este texto, é a versão mais atual disponível.

O processo é simples. Fazer o download do arquivo mais recente a partir do repositório no Github; copiá-lo para alguma das pastas de plugins do Docker ($HOME/.docker ou então /usr/local/lib/docker/cli-plugins) e em seguida dar permissão de execução para o arquivo baixado.

Se quiser fazer isso de forma rápida, segue um snippet com a forma que normalmente uso.

COMPOSE_VERSION="v2.18.1"
ARCH="x86_64"
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-${ARCH} -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

Nas duas primeiras linhas, altere a versão do Compose e a arquitetura do seu sistema, conforme sua necessidade e execute estes comandos, na sua máquina.

Obs: verifique qual é a última versão disponível para sua arquitetura lá na página de releases do repositório e altere os valores como necessário.

Para testar se o plugin está adequadamente instalado basta exibir a sua versão, como abaixo:

docker compose version

Docker Compose version v2.18.1

Se ela for exibida sem erros como mostrado acima, o plugin está corretamente instalado.

Instalando um ambiente WordPress em contêiner

Para comprovarmos que está tudo funcionando vamos iniciar uma estrutura simples com WordPress rodando em dois contêineres rodando em nossa máquina.

Como o objetivo é só demonstrar o funcionando da ferramenta recém instalada, eu não vou entrar em detalhes sobre como usar o Docker compose e nem detalhar os comandos usados, mas espero que no final você, leitor iniciante, tenha ao menos uma ideia de como a coisa toda funciona.

Antes de mais nada crie uma pasta chamada “website” e dentro dela, salve um arquivo com o nome “docker-compose.yml” e que tenha exatamente o conteúdo a seguir:

version: '3.0'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: usuariodb
      WORDPRESS_DB_PASSWORD: SenhaSecreta+123
      WORDPRESS_DB_NAME: bancodados
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql
    restart: always
    environment:
      MYSQL_DATABASE: bancodados
      MYSQL_USER: usuariodb
      MYSQL_PASSWORD: SenhaSecreta+123
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

Este é um arquivo de configuração do nosso ambiente para implementar o WordPress usando o Docker compose para os nossos testes.

Nele nós estamos usando a sintaxe versão 3.0 do Compose, o que em algumas implementações pode alterar a sintaxe e até mesmo as seções possíveis de serem usadas em dada estrutura. Consulte a documentação para obter informações sobre as versões e sua sintaxe.

Na seção “service” nós descrevemos os dois serviços (contêineres) usados pela nossa aplicação. Um chamado sugestivamente de “wordpress” e que será baseado na imagem do WordPress, e o segundo contêiner chamado “db” e que usará a imagem do banco de dados Mysql ambos disponíveis no hub.docker.com.

Algumas variáveis de ambiente foram declaradas para configurar as aplicações quando elas iniciarem e observe que a variável com o nome do servidor de banco de dados (WORDPRESS_DB_HOST) aponta para “db” este é o nome do nosso serviço de banco de dados e também será usado como “hostname” do nosso contêiner de banco de dados.

Importante: Você deve sempre consultar a documentação oficial das imagens usadas em seus projetos para saber quais variáveis estão disponíveis para uso e como usá-las adequadamente.

Os nossos contêineres usarão volumes gerenciados pelo Docker e a única forma de acesso a eles será de dentro dos contêineres. Como não precisamos enviar arquivos do ambiente externo para eles, isso basta.

Iniciando o ambiente

Com o arquivo salvo na pasta, nós podemos iniciar os contêineres, disponibilizando o WordPress para uso apenas com o comando abaixo:

docker compose up

[+] Building 0.0s (0/0)                                                     
[+] Running 3/3
 ✔ Network website_default        Created                              0.1s 
 ✔ Container website-db-1         Created                              0.0s 
 ✔ Container website-wordpress-1  C...                                 0.0s 
Attaching to website-db-1, website-wordpress-1
website-wordpress-1  | WordPress not found in /var/www/html - copying now...
website-db-1         | 2023-06-20 18:09:18+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started.
[...]

Você observará que serão exibidas muitas mensagens na tela (eu trunquei a mensagem para que ficasse uma listagem muito extensa) mas quando elas pararem de ser exibidas, isso significa que sua aplicação está rodando (ou deveria estar).

Se você acessar agora, pelo seu navegador, o endereço http://localhost:8080 provavelmente verá a tela de boas vindas e configuração do WordPress. Bastará seguir as instruções do assistente de configuração até o final para que seu WordPress esteja rodando e pronto para uso.

Para encerrar a aplicação completa tecle CTRL-C na janela de terminal onde ela foi iniciada e em seguida use o comando abaixo que removerá os contêineres encerrados.

docker compose down

Note que quando removemos o contêiner isso não quer dizer que a aplicação foi destruída, mas apenas que os dados temporários gerados por ela foram removidos. Se você usar o “docker compose up” novamente, você verá seu WordPress rodando novamente e com toda a configuração que você tinha feito.

Isso ocorre porque os dados da sua aplicação nunca estão dentro do contêiner (pelo menos em contêineres bem construídos isso não deve acontecer).

Se você realmente quiser destruir os dados da aplicação para começar tudo do zero, será necessário destruir os volumes criados com o comando abaixo:

docker compose down --volumes

Ao fazer isso, se tentar iniciar sua aplicação novamente você terá que passar por todo o processo de configuração do WordPress novamente (e se fosse um ambiente de produção você teria destruído os seus dados, portanto cuidado).

Para encerrar

O objetivo era mostrar a instalação do Docker Compose e deixar um exemplo prático de uso com uma aplicação relativamente comum de ser implantada.

Se você alguma vez já precisou disponibilizar o WordPress a partir de um servidor físico ou mesmo máquina virtual, já deve ter perdido bons minutos ou até horas procurando o módulo certo do PHP para determinado plugin, ou mesmo ajustando parâmetros de bases de dados etc.

Conteineres facilitam muito a vida do administrador, e usar uma ferramenta de composição que permita agrupar os vários contêineres de sua aplicação, como o Docker Compose, leva o nosso trabalho para um outro nível.

Se você compreender bem como lidar com estas ferramentas básicas, você terá todo conceito de como um ambiente containerizado funciona.

Mas o assunto não se esgota ai, o céu(a nuvem) é o limite.

Até uma próxima oportunidade.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.