Como usar o comando docker compose cp para copiar arquivos

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar o comando docker compose cp para copiar arquivos e diretórios entre um container de serviço e o sistema de arquivos local. Começaremos configurando um projeto Docker Compose simples, incluindo a instalação do Docker Compose e a criação de um arquivo docker-compose.yml básico com um serviço baseado na imagem Ubuntu.

Após a configuração do projeto, você praticará a cópia de um arquivo do container de serviço para sua máquina local e, em seguida, a cópia de um arquivo da sua máquina local para o container de serviço. Finalmente, você aprenderá como copiar um diretório inteiro do container de serviço para o seu sistema de arquivos local, demonstrando a flexibilidade do comando docker compose cp para gerenciar dados dentro de seus ambientes Docker Compose.

Prepare um projeto Docker Compose simples

Nesta etapa, prepararemos um projeto Docker Compose simples. Como o Docker Compose não está pré-instalado no ambiente LabEx, primeiro o instalaremos. Docker Compose é uma ferramenta para definir e executar aplicações Docker com múltiplos containers. Com o Compose, você usa um arquivo YAML para configurar os serviços da sua aplicação. Em seguida, com um único comando, você cria e inicia todos os serviços a partir da sua configuração.

Primeiro, vamos instalar o Docker Compose. Faremos o download do binário do Docker Compose e o tornaremos executável.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Agora, vamos verificar a instalação checando a versão do Docker Compose.

docker-compose --version

Você deve ver uma saída semelhante a Docker Compose version v2.20.2.

Em seguida, criaremos um projeto Docker Compose simples. Criaremos um diretório para nosso projeto e, em seguida, criaremos um arquivo docker-compose.yml dentro dele. Este arquivo definirá um serviço simples usando a imagem ubuntu.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app
nano docker-compose.yml

No editor nano, cole o seguinte conteúdo no arquivo docker-compose.yml:

version: "3.8"
services:
  my-service:
    image: ubuntu:latest
    command: tail -f /dev/null

Pressione Ctrl + X, depois Y e Enter para salvar e sair do editor.

Vamos detalhar o arquivo docker-compose.yml:

  • version: '3.8' especifica a versão do formato do arquivo Docker Compose.
  • services: define os serviços que compõem sua aplicação.
  • my-service: é o nome do nosso serviço.
  • image: ubuntu:latest especifica a imagem Docker a ser usada para este serviço. Estamos usando a versão mais recente da imagem Ubuntu.
  • command: tail -f /dev/null é o comando que será executado quando o container iniciar. Este comando mantém o container em execução indefinidamente sem consumir recursos significativos, o que é útil para testes e depuração.

Antes de iniciar o serviço, precisamos baixar a imagem ubuntu:latest.

docker pull ubuntu:latest

Agora, podemos iniciar o serviço usando o comando docker-compose up. A flag -d executa os containers em modo detached (destacado), o que significa que eles serão executados em segundo plano.

docker-compose up -d

Você deve ver uma saída indicando que o serviço está sendo criado e iniciado.

Finalmente, vamos verificar o status do serviço em execução usando o comando docker-compose ps.

docker-compose ps

Você deve ver uma saída mostrando que o container my-service está em execução.

Copiar um arquivo de um container de serviço para o sistema de arquivos local

Nesta etapa, aprenderemos como copiar um arquivo de um container Docker em execução para o seu sistema de arquivos local. Esta é uma tarefa comum quando você precisa recuperar logs, arquivos de configuração ou outros dados gerados dentro de um container.

Usaremos o comando docker cp para este fim. O comando docker cp copia arquivos/pastas entre um container e o sistema de arquivos local. A sintaxe é docker cp <container>:<src_path> <dest_path> para copiar de um container para o sistema de arquivos local, e docker cp <src_path> <container>:<dest_path> para copiar do sistema de arquivos local para um container.

Primeiro, vamos criar um arquivo simples dentro do nosso container my-service em execução. Usaremos o comando docker exec para executar um comando dentro do container. O comando docker exec executa um novo comando em um container em execução.

Certifique-se de estar no diretório ~/project/my-compose-app.

cd ~/project/my-compose-app
docker-compose exec my-service bash -c "echo 'This is a test file inside the container.' > /tmp/container_file.txt"

Este comando executa um shell bash dentro do container my-service e, em seguida, executa o comando echo para criar um arquivo chamado /tmp/container_file.txt com algum conteúdo.

Agora, vamos copiar este arquivo do container para o nosso sistema de arquivos local. Vamos copiá-lo para o diretório atual (~/project/my-compose-app).

docker-compose cp my-service:/tmp/container_file.txt .

O comando docker-compose cp é semelhante ao docker cp, mas funciona com os nomes dos serviços definidos no seu arquivo docker-compose.yml. my-service é o nome do nosso serviço, /tmp/container_file.txt é o caminho para o arquivo dentro do container, e . representa o diretório atual no nosso sistema de arquivos local.

Após executar o comando, você deve ver o arquivo container_file.txt no seu diretório ~/project/my-compose-app. Vamos verificar sua existência e conteúdo.

ls container_file.txt
cat container_file.txt

Você deve ver o nome do arquivo listado e o conteúdo "This is a test file inside the container." impresso no console.

Copiar um arquivo do sistema de arquivos local para um container de serviço

Nesta etapa, aprenderemos como copiar um arquivo do seu sistema de arquivos local para um container Docker em execução. Isso é útil quando você precisa adicionar arquivos de configuração, scripts ou outros dados a um container após ele ter sido iniciado.

Usaremos novamente o comando docker cp, mas desta vez na direção oposta: docker cp <src_path> <container>:<dest_path>.

Primeiro, vamos criar um arquivo simples no nosso sistema de arquivos local no diretório ~/project/my-compose-app.

cd ~/project/my-compose-app
echo "This file is from the local filesystem." > local_file.txt

Agora, vamos copiar este local_file.txt do nosso sistema de arquivos local para o diretório /tmp/ dentro do container my-service.

docker-compose cp local_file.txt my-service:/tmp/

O comando docker-compose cp é usado aqui. local_file.txt é o caminho para o arquivo no nosso sistema de arquivos local, my-service é o nome do nosso serviço, e /tmp/ é o diretório de destino dentro do container.

Para verificar se o arquivo foi copiado com sucesso, executaremos um comando dentro do container para verificar a existência do arquivo e exibir seu conteúdo.

docker-compose exec my-service cat /tmp/local_file.txt

Este comando executa o comando cat /tmp/local_file.txt dentro do container my-service. Você deve ver o conteúdo "This file is from the local filesystem." impresso no seu console, confirmando que o arquivo foi copiado corretamente.

Copiar um diretório de um container de serviço para o sistema de arquivos local

Nesta etapa, aprenderemos como copiar um diretório inteiro de um container Docker em execução para o seu sistema de arquivos local. Isso é útil para recuperar diretórios de saída de aplicativos, diretórios de logs ou qualquer outra estrutura de diretórios gerada dentro do container.

Usaremos o comando docker cp novamente, semelhante à cópia de um arquivo, mas especificando um caminho de diretório.

Primeiro, vamos criar um diretório e alguns arquivos dentro dele em nosso container my-service em execução. Usaremos docker-compose exec para executar comandos dentro do container.

Certifique-se de estar no diretório ~/project/my-compose-app.

cd ~/project/my-compose-app
docker-compose exec my-service bash -c "mkdir /tmp/container_dir && echo 'File 1' > /tmp/container_dir/file1.txt && echo 'File 2' > /tmp/container_dir/file2.txt"

Este comando cria um diretório chamado /tmp/container_dir dentro do container my-service e, em seguida, cria dois arquivos, file1.txt e file2.txt, dentro desse diretório.

Agora, vamos copiar este diretório inteiro do container para o nosso sistema de arquivos local. Vamos copiá-lo para o diretório atual (~/project/my-compose-app).

docker-compose cp my-service:/tmp/container_dir .

O comando docker-compose cp é usado aqui. my-service é o nome do nosso serviço, /tmp/container_dir é o caminho para o diretório dentro do container, e . representa o diretório atual no nosso sistema de arquivos local.

Após executar o comando, você deve ver um novo diretório chamado container_dir no seu diretório ~/project/my-compose-app. Vamos verificar sua existência e listar seu conteúdo.

ls container_dir
ls container_dir/file1.txt container_dir/file2.txt

Você deve ver o container_dir listado, e então os nomes dos dois arquivos dentro dele (file1.txt e file2.txt) devem ser listados.

Finalmente, vamos limpar os serviços do Docker Compose que iniciamos.

docker-compose down

Este comando para e remove os containers, redes e volumes criados por docker-compose up.

Resumo

Neste laboratório, aprendemos como usar o comando docker compose cp para copiar arquivos e diretórios entre um container de serviço e o sistema de arquivos local. Começamos preparando um projeto Docker Compose simples, que envolveu a instalação do Docker Compose e a criação de um arquivo docker-compose.yml definindo um serviço básico usando a imagem Ubuntu.

Após a configuração do projeto, praticamos a cópia de um arquivo do container de serviço para o sistema de arquivos local, a cópia de um arquivo do sistema de arquivos local para o container de serviço e, finalmente, a cópia de um diretório inteiro do container de serviço para o sistema de arquivos local. Essas etapas demonstraram a aplicação prática do comando docker compose cp para gerenciar a transferência de dados dentro de um ambiente Docker Compose.