Como Corrigir o Erro 'Unable to Locate Docker Compose Plugin'

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como resolver o erro comum "unable to locate package docker-compose-plugin" (não foi possível localizar o pacote docker-compose-plugin) ao trabalhar com Docker Compose. Docker Compose é uma ferramenta essencial para definir e executar aplicações Docker com múltiplos contêineres, mas os usuários frequentemente encontram problemas de instalação. Este laboratório irá guiá-lo através da compreensão do problema e da implementação de uma solução passo a passo para fazer o Docker Compose funcionar corretamente no seu sistema Ubuntu 22.04.

Compreendendo o Docker Compose e o Erro

Antes de corrigirmos o erro, vamos entender o que é Docker Compose e por que esse erro ocorre.

O que é Docker Compose?

Docker Compose é uma ferramenta para definir e executar aplicações Docker com múltiplos contêineres. Com o Compose, você usa um arquivo YAML para configurar os serviços, redes e volumes da sua aplicação. Então, com um único comando, você cria e inicia todos os serviços a partir da sua configuração.

Docker Compose é particularmente útil para:

  • Ambientes de desenvolvimento
  • Testes automatizados
  • Implantações em um único host

O Erro "Unable to Locate Package" (Não foi possível localizar o pacote)

Quando você tenta instalar o Docker Compose usando o comando:

sudo apt-get install docker-compose-plugin

Você pode encontrar este erro:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose-plugin

Este erro ocorre porque o nome do pacote mudou ou o repositório do pacote não está configurado corretamente no seu sistema.

Verificando sua Instalação Atual do Docker

Vamos primeiro verificar se o Docker está corretamente instalado. Execute:

docker --version

Você deve ver uma saída semelhante a:

Docker version 20.10.21, build baeda1f

Isso confirma que o Docker está instalado. Agora, vamos verificar se você já tem alguma versão do Docker Compose instalada:

docker compose version

Se você receber o erro "command not found" (comando não encontrado), isso confirma que o Docker Compose ainda não está instalado:

docker: 'compose' is not a docker command.

Agora que entendemos o problema, vamos prosseguir para corrigi-lo no próximo passo.

Instalando o Docker Compose

Agora que confirmamos que o Docker está instalado, mas o Docker Compose está ausente, vamos instalar o Docker Compose corretamente. Existem dois métodos principais para instalar o Docker Compose no Ubuntu 22.04:

  1. Usando o plugin Docker Compose para a Docker CLI
  2. Usando o binário Docker Compose standalone

Vamos com o primeiro método, que é a abordagem recomendada para a versão 20.10.21 do Docker Engine.

Atualizar Listas de Pacotes

Primeiro, certifique-se de que suas listas de pacotes estão atualizadas:

sudo apt-get update

Você deve ver a saída mostrando as listas de pacotes sendo atualizadas:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Reading package lists... Done

Instalar o Plugin Docker Compose

No Ubuntu 22.04, precisamos instalar o plugin Docker Compose do repositório oficial do Docker. Primeiro, vamos garantir que temos os pré-requisitos necessários:

sudo apt-get install -y ca-certificates curl gnupg

Agora, adicione a chave GPG oficial do Docker:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Adicione o repositório às fontes do Apt:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Atualize o banco de dados de pacotes com os pacotes Docker:

sudo apt-get update

Agora, instale o plugin Docker Compose:

sudo apt-get install -y docker-compose-plugin

Você deve ver a instalação prosseguir com sucesso:

Reading package lists... Done
Building dependency tree... Done
...
Setting up docker-compose-plugin (2.6.0~ubuntu-1~22.04.1) ...
Processing triggers for man-db (2.10.2-1) ...

Vamos verificar se o Docker Compose está agora instalado:

docker compose version

Você deve ver uma saída semelhante a:

Docker Compose version v2.6.0

Agora você instalou com sucesso o plugin Docker Compose para a Docker CLI.

Testando o Docker Compose

Agora que instalamos com sucesso o Docker Compose, vamos criar um projeto simples para testar se ele funciona corretamente.

Criar um Diretório de Projeto

Primeiro, vamos criar um diretório para o nosso projeto de teste:

mkdir -p ~/project/docker-compose-test
cd ~/project/docker-compose-test

Criar um Arquivo de Configuração do Docker Compose

Agora, vamos criar um arquivo docker-compose.yml simples usando o editor nano:

nano docker-compose.yml

Adicione o seguinte conteúdo ao arquivo:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

Esta configuração define um servidor web simples usando a imagem Nginx. Ele mapeia a porta 8080 no seu host para a porta 80 no contêiner e monta um diretório local para servir conteúdo HTML.

Salve o arquivo pressionando Ctrl+O, depois Enter e saia do nano com Ctrl+X.

Criar Conteúdo HTML

Vamos criar um diretório para o nosso conteúdo HTML e um arquivo HTML simples:

mkdir -p html
nano html/index.html

Adicione o seguinte conteúdo ao arquivo HTML:

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Hello from Docker Compose!</h1>
    <p>If you can see this, your Docker Compose setup is working correctly.</p>
  </body>
</html>

Salve o arquivo e saia do nano.

Iniciar a Aplicação Docker Compose

Agora, vamos iniciar nossa aplicação Docker Compose:

docker compose up -d

Você deve ver uma saída semelhante a:

[+] Running 2/2
 ⠿ Network docker-compose-test_default  Created
 ⠿ Container docker-compose-test-web-1  Started

Isso indica que o Docker Compose criou uma rede e iniciou o contêiner Nginx.

Verificar se a Aplicação está Rodando

Vamos verificar se nosso contêiner está rodando:

docker compose ps

Você deve ver uma saída semelhante a:

NAME                       COMMAND                  SERVICE             STATUS              PORTS
docker-compose-test-web-1  "/docker-entrypoint.…"   web                 running             0.0.0.0:8080->80/tcp

Agora, vamos enviar uma requisição para o servidor web para verificar se ele está servindo nosso conteúdo:

curl http://localhost:8080

Você deve ver o conteúdo HTML que criamos:

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Hello from Docker Compose!</h1>
    <p>If you can see this, your Docker Compose setup is working correctly.</p>
  </body>
</html>

Ótimo! Você criou e executou com sucesso uma aplicação Docker Compose.

Parar a Aplicação Docker Compose

Para parar e remover os contêineres, redes e volumes criados pelo Docker Compose, execute:

docker compose down

Você deve ver uma saída semelhante a:

[+] Running 2/2
 ⠿ Container docker-compose-test-web-1  Removed
 ⠿ Network docker-compose-test_default  Removed

Isso confirma que o Docker Compose limpou os recursos que ele criou.

Compreendendo os Comandos Comuns do Docker Compose

Agora que você tem o Docker Compose funcionando, vamos explorar alguns comandos e configurações comuns que você usará em seus projetos.

Comandos Essenciais do Docker Compose

Aqui estão os comandos do Docker Compose mais comumente usados:

  1. Iniciando serviços:

    docker compose up -d

    A flag -d executa os contêineres em segundo plano (modo detached).

  2. Parando serviços:

    docker compose stop

    Isso para os contêineres sem removê-los.

  3. Parando e removendo serviços:

    docker compose down

    Isso para os contêineres e remove contêineres, redes, volumes e imagens criadas por up.

  4. Visualizando logs:

    docker compose logs

    Para acompanhar os logs em tempo real, adicione a flag -f:

    docker compose logs -f
  5. Listando contêineres:

    docker compose ps

    Isso mostra o status dos seus serviços Docker Compose.

  6. Executando comandos dentro de contêineres:

    docker compose exec <nome-do-serviço> <comando>

    Por exemplo, para executar um shell no serviço web:

    docker compose exec web bash

Criando uma Configuração Docker Compose Mais Complexa

Vamos criar uma configuração Docker Compose mais complexa que inclui vários serviços. Crie um novo diretório para este exemplo:

mkdir -p ~/project/complex-compose
cd ~/project/complex-compose

Crie um arquivo docker-compose.yml:

nano docker-compose.yml

Adicione o seguinte conteúdo:

version: "3"

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx/html:/usr/share/nginx/html
    depends_on:
      - app
    networks:
      - frontend
      - backend

  app:
    image: node:14-alpine
    working_dir: /app
    volumes:
      - ./app:/app
    command: "node server.js"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      - db
    networks:
      - backend

  db:
    image: postgres:13-alpine
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  db-data:

Salve o arquivo e saia do nano.

Esta configuração define três serviços:

  1. Um servidor web (nginx)
  2. Uma aplicação de backend (Node.js)
  3. Um banco de dados (PostgreSQL)

Ele também define redes para isolar o tráfego e um volume para armazenamento persistente do banco de dados.

Criar Diretórios e Arquivos para a Configuração Complexa

Vamos criar os diretórios e arquivos necessários:

mkdir -p nginx/html app

Crie um arquivo HTML simples:

nano nginx/html/index.html

Adicione o seguinte conteúdo:

<!DOCTYPE html>
<html>
  <head>
    <title>Complex Docker Compose Example</title>
  </head>
  <body>
    <h1>Complex Docker Compose Example</h1>
    <p>
      This page is served by Nginx, and the application is powered by Node.js
      with PostgreSQL.
    </p>
  </body>
</html>

Salve o arquivo e saia do nano.

Crie um servidor Node.js simples:

nano app/server.js

Adicione o seguinte conteúdo:

const http = require("http");

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello from Node.js server!\n");
});

const port = 3000;
server.listen(port, () => {
  console.log(`Server running on port ${port}`);
  console.log(
    `Database connection info: ${process.env.DB_HOST}:${process.env.DB_PORT}`
  );
});

Salve o arquivo e saia do nano.

Esta configuração é mais complexa e representa uma arquitetura de aplicação do mundo real, mas não a iniciaremos neste laboratório, pois exigiria mais configuração.

Melhores Práticas do Docker Compose

Aqui estão algumas melhores práticas a serem seguidas ao usar o Docker Compose:

  1. Use variáveis de ambiente: Armazene informações confidenciais, como senhas, em variáveis de ambiente ou arquivos .env.

  2. Defina políticas de reinicialização: Para ambientes de produção, defina políticas de reinicialização:

    services:
      web:
        restart: always
  3. Use tags de imagem específicas: Evite usar latest em produção, pois pode levar a alterações inesperadas.

  4. Organize as configurações: Para configurações complexas, divida sua configuração em vários arquivos usando o padrão docker-compose.override.yml.

  5. Defina limites de recursos: Evite o esgotamento de recursos do contêiner:

    services:
      web:
        deploy:
          resources:
            limits:
              cpus: "0.5"
              memory: 512M

Ao seguir essas melhores práticas, você criará configurações Docker Compose mais sustentáveis e robustas.

Resumo

Neste laboratório, você aprendeu a resolver com sucesso o erro "unable to locate package docker-compose-plugin" ao:

  1. Compreender o que é o Docker Compose e diagnosticar o erro
  2. Instalar o Docker Compose corretamente adicionando o repositório oficial do Docker
  3. Criar e testar uma aplicação Docker Compose simples
  4. Explorar configurações Docker Compose mais complexas e melhores práticas

Agora você tem uma instalação do Docker Compose funcionando e o conhecimento para usá-la para gerenciar aplicações Docker com múltiplos contêineres. Essa base será valiosa à medida que você constrói soluções conteinerizadas mais complexas no futuro.

As habilidades que você adquiriu incluem:

  • Solução de problemas de instalação de pacotes no Ubuntu
  • Trabalhar com repositórios Docker
  • Criar e executar configurações Docker Compose
  • Gerenciar aplicações conteinerizadas com Docker Compose

Essas habilidades são essenciais para os fluxos de trabalho modernos de desenvolvimento e implantação de aplicações.