O Docker simplifica o fluxo de gerenciamento de processos de aplicações em contêineres. Embora os contêineres sejam semelhantes às máquinas virtuais em certos aspectos, eles são mais leves e fáceis de usar. Isso permite que os desenvolvedores dividam um ambiente de aplicação em vários serviços isolados.
Para aplicações que dependem de vários serviços, orquestrar todos os contêineres para iniciar, comunicar e fechar juntos pode tornar-se algo rapidamente incontrolável. O Docker Compose é uma ferramenta que lhe permite executar ambientes de aplicações com vários contêineres com base nas definições contidas em um arquivo YAML. Ele usa as definições de serviço para compilar ambientes totalmente personalizados com contêineres múltiplos que podem compartilhar redes e volumes de dados.
Neste guia, vamos demonstrar como instalar o Docker Compose em um servidor Ubuntu 20.04 e como começar a usar esta ferramenta.
Para seguir este artigo, você irá precisar do seguinte:
Para garantir que vamos obter a versão estável mais atualizada do Docker Compose, faremos o download deste software a partir do seu repositório oficial do Github.
Primeiro, confirme a versão mais recente disponível em sua página de releases. No momento da redação deste artigo, a versão estável mais atual é a 1.26.0
.
O comando a seguir irá baixar a release 1.26.0
e salvar o arquivo executável em /usr/local/bin/docker-compose
, que tornará este software globalmente acessível como docker-compose
:
- sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Em seguida, defina as permissões corretas para que o comando docker-compose
seja executável:
- sudo chmod +x /usr/local/bin/docker-compose
Para verificar se a instalação foi bem-sucedida, execute:
- docker-compose --version
Você verá um resultado parecido com este:
Outputdocker-compose version 1.26.0, build 8a1c60f6
O Docker Compose agora está instalado com sucesso em seu sistema. Na próxima seção, vamos ver como configurar um arquivo docker-compose.yml
e obter um ambiente conteinerizado funcionando com esta ferramenta.
docker-compose.yml
Para demonstrar como configurar um arquivo docker-compose.yml
e trabalhar com o Docker Compose, vamos criar um ambiente de servidor Web usando a imagem Nginx oficial do Docker Hub, o registro público do Docker. Este ambiente conteinerizado fornecerá um único arquivo HTML estático.
Comece criando um novo diretório em sua pasta home e então movendo-se para ele:
- mkdir ~/compose-demo
- cd ~/compose-demo
Neste diretório, configure uma pasta da aplicação para funcionar como a raiz de documentos para seu ambiente Nginx:
- mkdir app
Usando seu editor de texto preferido, crie um novo arquivo index.html
dentro da pasta app
:
- nano app/index.html
Coloque o seguinte conteúdo neste arquivo:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Docker Compose Demo</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>
<h1>This is a Docker Compose Demo Page.</h1>
<p>This content is being served by an Nginx container.</p>
</body>
</html>
Salve e feche o arquivo quando terminar. Caso esteja usando o nano
, faça isso digitando CTRL+X
e, depois, Y
e ENTER
para confirmar.
Em seguida, crie o arquivo docker-compose.yml
:
- nano docker-compose.yml
Insira o seguinte conteúdo em seu arquivo docker-compose.yml
:
version: '3.7'
services:
web:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app:/usr/share/nginx/html
O arquivo docker-compose.yml
normalmente começa com a definição de version
. Isso dirá ao Docker Compose qual versão de configuração estamos usando.
Então temos o bloco services
, onde configuramos os serviços que fazem parte deste ambiente. No nosso caso, temos um único serviço chamado web
. Este serviço usa a imagem nginx:alpine
e configura um redirecionamento de porta com a diretiva ports
. Todas as requisições na porta 8000
da máquina host (o sistema a partir do qual você está executando o Docker Compose) serão redirecionadas para o contêiner web
na porta 80
, onde o Nginx estará em execução.
A diretiva volumes
irá criar um volume compartilhado entre a máquina host e o contêiner. Isso irá compartilhar a pasta local app
com o contêiner, e o volume estará localizado em /usr/share/nginx/html
dentro do contêiner. Assim, ele substituirá a raiz dos documentos padrão para o Nginx.
Salve e feche o arquivo.
Criamos uma página demo e um arquivo docker-compose.yml
para criar um ambiente conteinerizado de servidor Web que irá apresentá-la. No próximo passo, vamos ativar este ambiente com o Docker Compose.
Com o arquivo docker-compose.yml
no lugar, agora podemos executar o Docker Compose para ativar o nosso ambiente. O comando a seguir irá baixar as imagens Docker necessárias, criar um contêiner para o serviço web
, e executar o ambiente conteinerizado em segundo plano.
- docker-compose up -d
O Docker Compose procurará primeiro pela imagem definida no sistema local, e se ele não puder localizar a imagem ele irá baixar a imagem do Docker Hub. Você verá um resultado como esse:
OutputCreating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done
Seu ambiente agora está executando em segundo plano. Para verificar se o contêiner está ativo, você pode executar:
- docker-compose ps
Este comando irá lhe mostrar informações sobre os contêineres em execução e seus estados, bem como quaisquer redirecionamentos de porta atualmente em vigor:
Output Name Command State Ports
----------------------------------------------------------------------------------
compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
Agora você pode acessar a aplicação de demonstração apontando seu navegador para localhost:8000
se você a estiver executando em sua máquina local, ou your_server_domain_or_IP:8000
no caso de um servidor remoto.
Você verá uma página como esta:
Porque o volume compartilhado que você configurou dentro do arquivo docker-compose.yml
mantém seus arquivos da pasta app
em sincronização com a raiz de documentos do contêiner. Se você fizer quaisquer alterações no arquivo index.html
, elas serão selecionadas automaticamente pelo contêiner e refletidas no navegador quando você recarregar a página.
No próximo passo, você verá como gerenciar seu ambiente conteinerizado com comandos Docker Compose .
Você viu como configurar um arquivo docker-compose.yml
e ativar seu ambiente com docker-compose up
. Agora você verá como usar comandos Docker Compose para gerenciar e interagir com seu ambiente conteinerizado.
Para verificar os logs produzidos pelo seu contêiner Nginx, você pode usar o comando logs
:
- docker-compose logs
Você verá um resultado parecido com este:
OutputAttaching to compose-demo_web_1
web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
Se você quiser pausar a execução do ambiente sem alterar o estado atual dos seus contêineres, você pode usar:
- docker-compose pause
OutputPausing compose-demo_web_1 ... done
Para retomar a execução após emitir uma pausa:
- docker-compose unpause
OutputUnpausing compose-demo_web_1 ... done
O comando stop
terminará a execução do contêiner mas ele não irá destruir quaisquer dados associados aos seus contêineres:
- docker-compose stop
OutputStopping compose-demo_web_1 ... done
Se você quiser remover os contêineres, redes e volumes associados a este ambiente conteinerizado, use o comando down
:
- docker-compose down
OutputRemoving compose-demo_web_1 ... done
Removing network compose-demo_default
Observe que isso não removerá a imagem base usada pelo Docker Compose para lançar seu ambiente (no nosso caso, nginx:alpine
). Desta forma, sempre que você ativar seu ambiente novamente com um docker-compose up
, o processo será muito mais rápido, uma vez que a imagem já está em seu sistema.
Caso você queira também remover a imagem base do seu sistema, use:
- docker image rm nginx:alpine
OutputUntagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
Nota: por favor, consulte nosso guia How to Install and Use Docker para uma referência mais detalhada sobre os comandos Docker.
Neste guia, vimos como instalar o Docker Compose e configurar um ambiente conteinerizado baseado em uma imagem de servidor Web Nginx. Também vimos como gerenciar este ambiente usando comandos Compose.
Para uma referência completa de todos os comandos docker-compose
disponíveis, verifique a documentação oficial.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!