Introdução
Neste laboratório, você aprenderá como usar efetivamente o comando docker compose create para construir e criar contêineres com base em um arquivo docker-compose.yml. Começaremos preparando um arquivo docker-compose.yml simples, incluindo as etapas necessárias para instalar o Docker Compose no ambiente LabEx.
Após a configuração, você explorará o uso básico de docker compose create e, em seguida, se aprofundará em suas várias opções. Isso inclui forçar a recriação de contêineres com --force-recreate, criar contêineres sem reconstruir imagens usando --no-build e garantir que as imagens mais recentes sejam puxadas com --pull always. Ao final deste laboratório, você terá uma sólida compreensão de como aproveitar o docker compose create para gerenciar suas aplicações multi-contêiner.
Prepare um arquivo docker-compose.yml simples
Nesta etapa, prepararemos um arquivo docker-compose.yml simples. Antes de começarmos, vamos instalar o Docker Compose. Como o ambiente da VM LabEx não possui o Docker Compose pré-instalado, precisamos instalá-lo manualmente. Faremos o download do binário do Docker Compose e o tornaremos executável.
Primeiro, faça o download do binário do Docker Compose usando curl. Faremos o download da versão 1.29.2, que é compatível com a versão do Docker instalada.
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Este comando baixa o binário do Docker Compose da página oficial de lançamentos do GitHub e o salva em /usr/local/bin/docker-compose. As partes $(uname -s) e $(uname -m) detectam automaticamente seu sistema operacional e arquitetura, garantindo que você baixe o binário correto.
Em seguida, precisamos tornar o binário baixado executável.
sudo chmod +x /usr/local/bin/docker-compose
Este comando adiciona permissões de execução ao arquivo docker-compose, permitindo que você o execute como um comando.
Agora, vamos verificar se o Docker Compose está instalado corretamente, verificando sua versão.
docker-compose --version
Você deve ver uma saída semelhante a docker-compose version 1.29.2, build 5becea4c. Isso confirma que o Docker Compose está instalado e pronto para uso.
Agora, vamos criar um arquivo docker-compose.yml simples em seu diretório ~/project. Este arquivo definirá um único serviço usando a imagem nginx.
nano ~/project/docker-compose.yml
Este comando abre o editor de texto nano para criar e editar o arquivo docker-compose.yml. Cole o seguinte conteúdo no editor:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
Vamos detalhar este arquivo docker-compose.yml:
version: '3.8'especifica a versão do formato do arquivo Docker Compose.services:define os serviços (contêineres) que você deseja executar.web:é o nome do nosso serviço. Você pode escolher qualquer nome que desejar.image: nginx:latestespecifica a imagem Docker a ser usada para este serviço. Neste caso, estamos usando a versão mais recente da imagem oficial do Nginx.ports:mapeia as portas entre a máquina host e o contêiner."80:80"mapeia a porta 80 no host para a porta 80 no contêiner. Isso significa que você pode acessar o servidor web Nginx em execução dentro do contêiner visitandohttp://localhostem seu navegador web (ou o endereço IP da VM).
Salve o arquivo pressionando Ctrl + O, depois pressione Enter e saia do editor pressionando Ctrl + X.
Você criou com sucesso um arquivo docker-compose.yml simples que define um serviço web usando a imagem Nginx. Nas próximas etapas, usaremos este arquivo para criar e gerenciar contêineres.
Criar contêineres usando docker compose create
Nesta etapa, usaremos o comando docker-compose create para criar contêineres com base no arquivo docker-compose.yml que preparamos na etapa anterior. O comando docker-compose create cria os contêineres, mas não os inicia. Isso é útil se você deseja configurar o ambiente do contêiner sem executar os serviços imediatamente.
Antes de criar o contêiner, vamos garantir que a imagem nginx esteja disponível localmente. Se não estiver, o Docker Compose fará o pull automaticamente durante o processo de criação. No entanto, é uma boa prática estar ciente das imagens que você está usando. Você pode fazer o pull da imagem manualmente usando o comando docker pull:
docker pull nginx:latest
Este comando baixa a imagem nginx:latest do Docker Hub para sua máquina local. Você deve ver uma saída indicando o progresso e a conclusão do download.
Agora, navegue até o diretório que contém seu arquivo docker-compose.yml. Em nosso caso, é o diretório ~/project.
cd ~/project
Agora, execute o comando docker-compose create:
docker-compose create
Este comando lê o arquivo docker-compose.yml no diretório atual e cria os contêineres definidos nele. Você deve ver uma saída indicando que o contêiner para o serviço web está sendo criado.
Após a conclusão do comando, você pode verificar o status dos contêineres criados usando o comando docker ps -a.
docker ps -a
A saída de docker ps -a mostrará todos os contêineres, incluindo aqueles que não estão em execução. Você deve ver um contêiner chamado project_web_1 (o nome é gerado com base no nome do diretório e no nome do serviço) com o status Created. Isso confirma que o contêiner foi criado com sucesso, mas ainda não foi iniciado.
O comando docker-compose create é útil para pré-provisionar seus contêineres. Nas próximas etapas, exploraremos como iniciar e gerenciar esses contêineres.
Forçar a recriação de contêineres com --force-recreate
Nesta etapa, aprenderemos como forçar a recriação de contêineres usando o comando docker-compose create --force-recreate. A flag --force-recreate é usada para recriar contêineres mesmo que sua configuração não tenha sido alterada. Isso é útil em cenários em que você pode precisar atualizar a instância do contêiner, por exemplo, após fazer alterações na imagem subjacente que o Docker Compose pode não detectar automaticamente.
Primeiro, certifique-se de estar no diretório ~/project onde seu arquivo docker-compose.yml está localizado.
cd ~/project
Agora, execute o comando docker-compose create com a flag --force-recreate:
docker-compose create --force-recreate
Como já criamos o contêiner na etapa anterior, o Docker Compose detectará o contêiner existente. Devido à flag --force-recreate, ele removerá o contêiner existente e criará um novo com a mesma configuração. Você deve ver uma saída indicando que o contêiner existente está sendo removido e um novo está sendo criado.
Vamos verificar o status dos contêineres novamente usando docker ps -a.
docker ps -a
Você ainda deve ver um contêiner chamado project_web_1 com o status Created. Embora o nome e a configuração sejam os mesmos, esta é uma nova instância de contêiner que foi criada por causa da flag --force-recreate.
A flag --force-recreate é uma opção poderosa quando você precisa garantir uma instância nova do seu contêiner, independentemente de a configuração no arquivo docker-compose.yml ter sido alterada.
Criar contêineres sem build usando --no-build
Nesta etapa, exploraremos a opção docker-compose create --no-build. Essa flag é útil quando seu arquivo docker-compose.yml inclui serviços que são construídos a partir de um Dockerfile (usando a instrução build), mas você só deseja criar os contêineres sem reconstruir as imagens. Como nosso arquivo docker-compose.yml atual usa apenas uma imagem pré-construída (nginx:latest), a flag --no-build não terá um efeito visível no processo de construção da imagem neste caso específico. No entanto, é importante entender seu propósito para uso futuro com serviços que exigem construção.
Primeiro, certifique-se de estar no diretório ~/project.
cd ~/project
Agora, vamos executar o comando docker-compose create com a flag --no-build. Como o contêiner project_web_1 já existe das etapas anteriores, também usaremos a flag --force-recreate para garantir que um novo contêiner seja criado.
docker-compose create --no-build --force-recreate
Em um cenário em que seu docker-compose.yml tivesse um serviço definido com uma instrução build, a execução deste comando criaria o contêiner usando uma imagem existente (se disponível) ou faria o pull da imagem, mas pularia o processo de construção da imagem definido no Dockerfile. Em nosso caso atual, como estamos usando uma imagem pré-construída, a saída será semelhante à etapa anterior, indicando a remoção do contêiner antigo e a criação de um novo.
Vamos verificar o status do contêiner novamente.
docker ps -a
Você ainda deve ver o contêiner project_web_1 no estado Created. A flag --no-build afeta principalmente os serviços que são construídos a partir de um Dockerfile, impedindo o processo de construção durante a criação do contêiner.
Criar contêineres e baixar imagens com --pull always
Nesta etapa, usaremos o comando docker-compose create --pull always. A flag --pull always instrui o Docker Compose a sempre fazer o pull da versão mais recente da imagem antes de criar o contêiner, mesmo que uma cópia local da imagem exista. Isso é útil para garantir que você esteja sempre usando a imagem mais atualizada para seus serviços.
Primeiro, certifique-se de estar no diretório ~/project.
cd ~/project
Agora, execute o comando docker-compose create com a flag --pull always. Como o contêiner project_web_1 já existe, também usaremos a flag --force-recreate para criar um novo contêiner com base na imagem potencialmente atualizada.
docker-compose create --pull always --force-recreate
Ao executar este comando, o Docker Compose primeiro verificará se há atualizações para a imagem nginx:latest no Docker Hub. Se uma versão mais recente estiver disponível, ele fará o pull. Em seguida, ele removerá o contêiner project_web_1 existente e criará um novo usando a imagem baixada. Você deve ver a saída indicando o processo de pull (se uma nova imagem estiver disponível), seguido pela remoção e criação do contêiner.
Vamos verificar o status do contêiner mais uma vez.
docker ps -a
Você ainda verá o contêiner project_web_1 no estado Created. A principal diferença aqui é que o Docker Compose verificou ativamente e, possivelmente, fez o pull de uma imagem mais recente antes de criar esta instância do contêiner.
A flag --pull always é importante para manter suas implantações de serviço atualizadas com as versões mais recentes da imagem, garantindo que você se beneficie dos recursos mais recentes, correções de bugs e atualizações de segurança.
Resumo
Neste laboratório, aprendemos como usar o comando docker compose create para construir e criar contêineres com base em um arquivo docker-compose.yml. Começamos preparando um arquivo docker-compose.yml simples que define um serviço Nginx, o que envolveu a instalação manual do Docker Compose no ambiente LabEx, baixando e tornando o binário executável. Em seguida, verificamos a instalação.
Após a preparação, exploramos várias opções do comando docker compose create. Aprendemos como criar contêineres usando o comando básico, como forçar a recriação de contêineres existentes com a flag --force-recreate, como criar contêineres sem reconstruir imagens usando a flag --no-build e como garantir que as imagens mais recentes sejam baixadas antes da criação com a flag --pull always. Essas etapas demonstraram a flexibilidade e o controle oferecidos pelo docker compose create no gerenciamento do ciclo de vida dos contêineres.



