Введение
В этой лабораторной работе вы научитесь использовать команду docker compose cp для копирования файлов и каталогов между контейнером сервиса и локальной файловой системой. Мы начнём с настройки простого проекта Docker Compose, включая установку Docker Compose и создание базового файла docker-compose.yml с сервисом на основе образа Ubuntu.
После настройки проекта вы попрактикуетесь в копировании файла из контейнера сервиса на локальный компьютер, а затем в копировании файла с локального компьютера в контейнер сервиса. В завершение вы узнаете, как скопировать целый каталог из контейнера сервиса в локальную файловую систему, демонстрируя гибкость команды docker compose cp для управления данными в средах Docker Compose.
Подготовка простого проекта 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.



