Como usar o comando docker compose create para construir e criar contêineres

DockerBeginner
Pratique Agora

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:latest especifica 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 visitando http://localhost em 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.