Como instalar o Docker Compose no Ubuntu 18.04

Introdução

O Docker é uma ótima ferramenta para automatizar a implantação de aplicativos Linux dentro de contêineres de software, mas para tirar total vantagem deste potencial, cada componente de um aplicativo deve executar em seu próprio contêiner individual. Para aplicativos complexos com vários componentes, orquestrar todos os contêineres para iniciar, comunicar e fechar ao mesmo tempo pode se tornar algo rapidamente complicado.

A comunidade do Docker surgiu com uma solução popular chamada Fig, que permitiu o uso de um arquivo único YAML para orquestrar todos os seus contêineres e configurações do Docker. Ele se tornou tão popular que a equipe do Docker decidiu fazer o Docker Compose baseado na fonte Fig, que agora está descontinuada. O Docker Compose facilita o funcionamento dos processos dos contêineres do Docker para os usuários, incluindo a inicialização, o desligamento e a configuração de ligação intra-contêineres e volumes.

Neste tutorial, mostraremos como instalar a última versão do Docker Compose para ajudar a gerenciar aplicativos multi-contêiner

Pré-requisitos

Para seguir este artigo, será necessário um servidor Ubuntu 18.04, com o seguinte:

  • Um usuário sem root com privilégios sudo (A configuração inicial do servidor com o Ubuntu 18.04e xplica como configurar isso.)
  • O Docker instalado com as instruções do Passo 1 e o Passo 2 do Como instalar e utilizar o Docker no Ubuntu 18.04

Uma vez que eles estejam funcionando, você pode continuar.

Nota: Embora os pré-requisitos dêem instruções para instalar o Docker no Ubuntu 18.04, os comandos do docker neste artigo devem funcionar em outros sistemas operacionais, desde que o Docker esteja instalado.

Passo 1 — Como instalar o Docker Compose

Embora possamos instalar o Docker Compose a partir dos repositórios oficiais do Ubuntu, ele está várias versões menores atrás do último lançamento, então vamos instalar o Docker Compose do repositório do GitHub do Docker. O comando abaixo é ligeiramente diferente daquele que você encontrará na página dos Lançamentos. Use a flag -o para especificar o arquivo de saída primeiro ao invés de redirecionar a saída, essa sintaxe evita executar um erro de autorização negada causada ao usar o sudo.

Vamos verificar o lançamento atual e, se necessário, atualizá lo no comando abaixo:

  • sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Em seguida, vamos definir as permissões:

  • sudo chmod +x /usr/local/bin/docker-compose

Então, vamos verificar se a instalação foi bem sucedida verificando a versão:

  • docker-compose --version

Isso aparecerá na tela a versão que instalamos:

Outputdocker-compose version 1.21.2, build a133471 

Agora que temos o Docker Compose instalado, estamos prontos para executar um exemplo “Hello World”.

Passo 2 — Como executar um Contêiner com o Docker Compose

O registro público do Docker, o Docker Hub, inclui uma imagem do Hello World para demonstração e teste. Ele ilustra a configuração mínima necessária para executar um contêiner utilizando o Docker Compose: um arquivo YAML que chama uma única imagem:

Primeiramente, vamos criar um diretório para o arquivo YAML e mover para ele:

  • mkdir hello-world
  • cd hello-world

Então, vamos criar o arquivo YAML:

  • nano docker-compose.yml

Coloque o seguinte conteúdo no arquivo, salve o arquivo e saia do editor de texto:

docker-compose.yml

my-test:  image: hello-world 

A primeira linha no arquivo YAML é usada como parte do nome do contêiner. A segunda linha especifica qual imagem usar para criar o contêiner. Quando executarmos o comando docker-compose up ele irá procurar uma imagem local pelo nome que especificamos, hello-world. Com isso funcionando, vamos salvar e sair do arquivo.

Podemos ver as imagens manualmente no nosso sistema com o comando docker images:

  • docker images

Quando não houverem imagens locais, apenas os títulos das colunas são exibidos:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 

Enquanto ainda estiver no diretório ~/hello-world , vamos executar o seguinte comando:

  • docker-compose up

A primeira vez que executarmos o comando, se não houver uma imagem local chamada hello-world, o Docker Compose irá puxá-la do repositório público do Docker Hub:

OutputPulling my-test (hello-world:latest)... latest: Pulling from library/hello-world c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Pull complete Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9 Status: Downloaded newer image for hello-world:latest . . . 

Após puxar a imagem, o docker-compose cria um contêiner, anexa e executa o programa hello, que por sua vez confirma que a instalação parece estar funcionando:

Output. . . Creating helloworld_my-test_1... Attaching to helloworld_my-test_1 my-test_1 | my-test_1 | Hello from Docker. my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 | . . . 

Em seguida ele mostra na tela uma explicação do que ele fez:

Output of docker-compose up1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. 

Os contêineres do Docker apenas funcionam enquanto o comando estiver ativo, então assim que o hello terminar de executar, o contêiner para. Consequentemente, quando olharmos os processos ativos, os cabeçalhos das colunas irão aparecer, mas o contêiner hello-world não estará listado porque ele não está funcionando.

  • docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES 

Podemos ver as informações do contêiner que vamos precisar no próximo passo, utilizando a flag -a, que mostra todos os contêineres, não apenas os ativos:

  • docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES 06069fd5ca23        hello-world         "/hello"            35 minutes ago      Exited (0) 35 minutes ago                       drunk_payne 

Isso mostra as informações que precisaremos remover do contêiner quando terminarmos com ele.

Passo 3 — Como remover a imagem (opcional)

Para evitar usar espaço de disco desnecessário, vamos remover a imagem local. Para fazer isso, precisaremos deletar todos os contêineres que referem a imagem utilizando o comando docker rm, seguido ou do ID do CONTÊINER ou do NOME. Abaixo, estamos usando a ID do CONTÊINER pelo comando docker ps -a que acabamos de executar. Certifique-se de substituir a ID do seu contêiner:

  • docker rm 06069fd5ca23

Assim que todos os contêineres que fizerem referência a imagem forem removidos, poderemos remover a imagem:

  • docker rmi hello-world

Conclusão

Agora, instalamos o Docker Compose, testamos nossa instalação executando um exemplo do Hello World e removemos a imagem e contêiner de teste.

Enquanto o exemplo do Hello World confirmou nossa instalação, a configuração simples não mostra um dos principais benefícios do Docker Compose — poder trazer um grupo de contêineres do Docker para cima e para baixo, todos ao mesmo tempo. Para ver o poder do Docker Compose em ação, será possível verificar este exemplo prático em Como configurar um meio de teste de integração contínuo com o Docker e o Docker Compose no Ubuntu 16.04 (nota: este artigo é para o Ubuntu 16.04)