Как использовать команду docker compose cp для копирования файлов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker compose cp для копирования файлов и каталогов между контейнером сервиса и локальной файловой системой. Мы начнём с настройки простого проекта Docker Compose, включая установку Docker Compose и создание базового файла docker-compose.yml с сервисом на основе образа Ubuntu.

После настройки проекта вы попрактикуетесь в копировании файла из контейнера сервиса на локальный компьютер, а затем в копировании файла с локального компьютера в контейнер сервиса. В завершение вы узнаете, как скопировать целый каталог из контейнера сервиса в локальную файловую систему, демонстрируя гибкость команды docker compose cp для управления данными в средах Docker Compose.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/run -.-> lab-555075{{"Как использовать команду docker compose cp для копирования файлов"}} docker/ps -.-> lab-555075{{"Как использовать команду docker compose cp для копирования файлов"}} docker/exec -.-> lab-555075{{"Как использовать команду docker compose cp для копирования файлов"}} docker/pull -.-> lab-555075{{"Как использовать команду docker compose cp для копирования файлов"}} docker/cp -.-> lab-555075{{"Как использовать команду docker compose cp для копирования файлов"}} end

Подготовка простого проекта Docker Compose

На этом шаге мы подготовим простой проект Docker Compose. Поскольку Docker Compose не предустановлен в среде LabEx, сначала мы его установим. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения, а затем одной командой создаёте и запускаете все сервисы из конфигурации.

Сначала установим Docker Compose. Мы скачаем бинарный файл Docker Compose и сделаем его исполняемым.

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

Теперь проверим установку, посмотрев версию Docker Compose.

docker-compose --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2.

Далее создадим простой проект Docker Compose. Создадим директорию для проекта и файл docker-compose.yml внутри неё. Этот файл определит простой сервис с использованием образа ubuntu.

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

В редакторе nano вставьте следующее содержимое в файл docker-compose.yml:

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

Нажмите Ctrl + X, затем Y и Enter, чтобы сохранить и выйти.

Разберём файл docker-compose.yml:

  • version: '3.8' — указывает версию формата файла Docker Compose.
  • services: — определяет сервисы, из которых состоит ваше приложение.
  • my-service: — имя нашего сервиса.
  • image: ubuntu:latest — указывает Docker-образ для этого сервиса (используем последнюю версию Ubuntu).
  • command: tail -f /dev/null — команда, выполняемая при запуске контейнера. Она удерживает контейнер в рабочем состоянии без значительного потребления ресурсов, что полезно для тестирования и отладки.

Перед запуском сервиса загрузим образ ubuntu:latest.

docker pull ubuntu:latest

Теперь запустим сервис командой docker-compose up. Флаг -d запускает контейнеры в фоновом режиме.

docker-compose up -d

Вы увидите вывод, подтверждающий создание и запуск сервиса.

Наконец, проверим статус запущенного сервиса командой docker-compose ps.

docker-compose ps

Вы должны увидеть информацию о том, что контейнер my-service работает.

Копирование файла из контейнера сервиса в локальную файловую систему

На этом шаге мы научимся копировать файл из работающего Docker-контейнера в локальную файловую систему. Это распространённая задача, когда необходимо извлечь логи, конфигурационные файлы или другие данные, сгенерированные внутри контейнера.

Для этого мы будем использовать команду docker cp. Эта команда копирует файлы и папки между контейнером и локальной файловой системой. Синтаксис: docker cp <контейнер>:<исходный_путь> <целевой_путь> для копирования из контейнера и docker cp <исходный_путь> <контейнер>:<целевой_путь> для копирования в контейнер.

Сначала создадим простой файл внутри нашего работающего контейнера my-service. Используем команду docker exec, которая выполняет команду внутри работающего контейнера.

Убедитесь, что находитесь в директории ~/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"

Эта команда запускает оболочку bash внутри контейнера my-service и выполняет команду echo, создавая файл /tmp/container_file.txt с указанным содержимым.

Теперь скопируем этот файл из контейнера в локальную файловую систему (в текущую директорию ~/project/my-compose-app).

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

Команда docker-compose cp аналогична docker cp, но работает с именами сервисов из вашего файла docker-compose.yml. Здесь:

  • my-service — имя нашего сервиса
  • /tmp/container_file.txt — путь к файлу внутри контейнера
  • . — текущая директория в локальной файловой системе

После выполнения команды файл container_file.txt должен появиться в вашей директории ~/project/my-compose-app. Проверим его наличие и содержимое.

ls container_file.txt
cat container_file.txt

Вы должны увидеть имя файла в списке и содержимое "This is a test file inside the container.", выведенное в консоль.

Копирование файла из локальной файловой системы в контейнер сервиса

На этом шаге мы научимся копировать файл из локальной файловой системы в работающий Docker-контейнер. Это полезно, когда вам нужно добавить конфигурационные файлы, скрипты или другие данные в уже запущенный контейнер.

Мы снова будем использовать команду docker cp, но на этот раз в обратном направлении: docker cp <исходный_путь> <контейнер>:<целевой_путь>.

Сначала создадим простой файл в локальной файловой системе в директории ~/project/my-compose-app.

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

Теперь скопируем этот файл local_file.txt из локальной файловой системы в директорию /tmp/ внутри контейнера my-service.

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

Здесь используется команда docker-compose cp, где:

  • local_file.txt — путь к файлу в локальной файловой системе
  • my-service — имя нашего сервиса
  • /tmp/ — целевая директория внутри контейнера

Чтобы убедиться, что файл был успешно скопирован, выполним команду внутри контейнера для проверки наличия файла и вывода его содержимого.

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

Эта команда выполняет cat /tmp/local_file.txt внутри контейнера my-service. Вы должны увидеть содержимое "This file is from the local filesystem.", выведенное в консоль, что подтвердит успешное копирование файла.

Копирование директории из контейнера сервиса в локальную файловую систему

На этом шаге мы научимся копировать целую директорию из работающего Docker-контейнера в локальную файловую систему. Это полезно для извлечения каталогов с выходными данными приложений, логами или любой другой структуры каталогов, сгенерированной внутри контейнера.

Мы снова будем использовать команду docker cp, аналогично копированию файла, но указывая путь к директории.

Сначала создадим директорию и несколько файлов внутри неё в нашем работающем контейнере my-service. Используем docker-compose exec для выполнения команд внутри контейнера.

Убедитесь, что находитесь в директории ~/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"

Эта команда создаёт директорию /tmp/container_dir внутри контейнера my-service, а затем создаёт два файла file1.txt и file2.txt внутри этой директории.

Теперь скопируем всю эту директорию из контейнера в локальную файловую систему (в текущую директорию ~/project/my-compose-app).

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

Здесь используется команда docker-compose cp, где:

  • my-service — имя нашего сервиса
  • /tmp/container_dir — путь к директории внутри контейнера
  • . — текущая директория в локальной файловой системе

После выполнения команды в вашей директории ~/project/my-compose-app должна появиться новая директория container_dir. Проверим её наличие и содержимое.

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

Вы должны увидеть список директории container_dir, а затем имена двух файлов внутри неё (file1.txt и file2.txt).

Наконец, очистим сервисы Docker Compose, которые мы запустили.

docker-compose down

Эта команда останавливает и удаляет контейнеры, сети и тома, созданные командой docker-compose up.

Итоги

В этой лабораторной работе мы изучили, как использовать команду docker compose cp для копирования файлов и директорий между контейнером сервиса и локальной файловой системой. Мы начали с подготовки простого проекта Docker Compose, включающего установку Docker Compose и создание файла docker-compose.yml, определяющего базовый сервис на основе образа Ubuntu.

После настройки проекта мы отработали:

  • Копирование файла из контейнера сервиса в локальную файловую систему
  • Копирование файла из локальной файловой системы в контейнер сервиса
  • Копирование целой директории из контейнера сервиса в локальную файловую систему

Эти шаги продемонстрировали практическое применение команды docker compose cp для управления передачей данных в среде Docker Compose.