Введение
В этой лабораторной работе вы научитесь эффективно использовать команду docker container cp для копирования файлов между локальной файловой системой и контейнерами Docker. Этот практический опыт охватывает ключевые сценарии, включая копирование файлов с локального компьютера в работающий контейнер, извлечение файлов из контейнера на локальную систему, а также использование возможностей потоковой передачи данных через STDOUT и STDIN.
На практических примерах вы приобретете навыки управления потоком данных для ваших контейнеризированных приложений. Вы узнаете, как копировать отдельные файлы, каталоги и даже передавать данные в потоковом режиме, что обеспечит гибкость, необходимую для различных задач разработки и развертывания.
Копирование локального файла в контейнер
На этом шаге вы научитесь копировать файл из локальной файловой системы в работающий Docker-контейнер. Это распространённая задача, когда требуется добавить конфигурационные файлы, скрипты или другие данные в уже запущенный контейнер.
Сначала создадим простой текстовый файл на локальной машине в директории ~/project.
echo "This is a test file." > ~/project/test_file.txt
Эта команда создаёт файл test_file.txt в директории ~/project с текстом "This is a test file.".
Далее нам понадобится работающий контейнер для копирования файла. Мы будем использовать образ ubuntu. Поскольку образ может отсутствовать локально, сначала загрузим его.
docker pull ubuntu:latest
Эта команда загружает последнюю версию образа ubuntu из Docker Hub.
Теперь запустим контейнер на основе образа ubuntu. Запустим его в фоновом режиме (-d) и присвоим имя (my_ubuntu_container) для удобства идентификации.
docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity
Эта команда создаёт новый контейнер с именем my_ubuntu_container на основе образа ubuntu:latest. Команда sleep infinity поддерживает работу контейнера бесконечно, что полезно для демонстрации.
Проверить, что контейнер работает, можно командой docker ps.
docker ps
В выводе должен отображаться my_ubuntu_container.
Теперь скопируем файл test_file.txt с локальной машины в контейнер с помощью команды docker cp. Синтаксис: docker cp <локальный_путь> <имя_контейнера>:<путь_в_контейнере>.
docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/
Эта команда копирует файл ~/project/test_file.txt в директорию /tmp/ внутри контейнера my_ubuntu_container.
Чтобы убедиться в успешном копировании, выполним команду внутри контейнера с помощью docker exec. Используем ls для вывода списка файлов в директории /tmp/ контейнера.
docker exec my_ubuntu_container ls /tmp/
В выводе должен отображаться test_file.txt, что подтверждает успешное копирование.
Наконец, удалим созданный контейнер.
docker stop my_ubuntu_container
docker rm my_ubuntu_container
Эти команды останавливают и удаляют контейнер соответственно.
Копирование файлов из контейнера в локальную файловую систему
На этом шаге вы научитесь копировать файлы из работающего Docker-контейнера в локальную файловую систему. Это полезно для извлечения логов, конфигурационных файлов или других данных, сгенерированных или изменённых внутри контейнера.
Сначала убедимся, что у нас есть работающий контейнер. Мы будем использовать контейнер my_ubuntu_container из предыдущего шага. Если он не запущен, запустим его.
docker start my_ubuntu_container
Эта команда запускает контейнер с именем my_ubuntu_container.
Теперь создадим файл внутри контейнера, который мы скопируем на локальную машину. Используем docker exec для выполнения команды внутри контейнера, чтобы создать файл container_file.txt в директории /root/.
docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'
Эта команда выполняет shell-команду внутри my_ubuntu_container для создания файла /root/container_file.txt с указанным содержимым.
Чтобы убедиться, что файл создан внутри контейнера, можно использовать docker exec для вывода списка файлов в директории /root/ контейнера.
docker exec my_ubuntu_container ls /root/
В выводе должен отображаться файл container_file.txt.
Теперь скопируем container_file.txt из контейнера на локальную машину с помощью команды docker cp. Синтаксис для копирования из контейнера: docker cp <имя_контейнера>:<путь_в_контейнере> <локальный_путь>. Скопируем файл в директорию ~/project/.
docker cp my_ubuntu_container:/root/container_file.txt ~/project/
Эта команда копирует файл /root/container_file.txt из контейнера my_ubuntu_container в локальную директорию ~/project/.
Чтобы проверить успешное копирование на локальную машину, выведем список файлов в директории ~/project/.
ls ~/project/
В выводе должен отображаться файл container_file.txt вместе с test_file.txt из предыдущего шага.
Также можно просмотреть содержимое скопированного файла с помощью команды cat.
cat ~/project/container_file.txt
Вывод должен содержать текст "This file is from the container.", что подтверждает корректное копирование содержимого.
Наконец, удалим контейнер.
docker stop my_ubuntu_container
docker rm my_ubuntu_container
Вывод содержимого файла из контейнера в STDOUT
На этом шаге вы научитесь выводить содержимое файла из работающего Docker-контейнера напрямую в стандартный вывод (STDOUT) вашей локальной машины. Это полезно для быстрого просмотра содержимого файла в контейнере без его явного копирования.
Сначала убедитесь, что контейнер my_ubuntu_container запущен. Если нет, запустите его.
docker start my_ubuntu_container
Теперь создадим ещё один файл внутри контейнера, содержимое которого мы будем выводить в STDOUT. Создадим файл stream_test.log в директории /var/log/ контейнера.
docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'
Эта команда выполняет shell-команду внутри my_ubuntu_container для создания файла /var/log/stream_test.log с указанным содержимым.
Для вывода содержимого этого файла в локальный STDOUT можно использовать команду docker exec с командой cat внутри контейнера.
docker exec my_ubuntu_container cat /var/log/stream_test.log
Эта команда выполняет cat /var/log/stream_test.log внутри контейнера my_ubuntu_container. Вывод этой команды из контейнера передаётся в STDOUT вашего локального терминала.
Вы должны увидеть содержимое "This is a log entry.", выведенное напрямую в ваш терминал. Это демонстрирует, как можно быстро просмотреть содержимое файла внутри контейнера без необходимости копировать весь файл.
Наконец, удалим контейнер.
docker stop my_ubuntu_container
docker rm my_ubuntu_container
Передача локального tar-архива в контейнер через STDIN
На этом шаге вы научитесь передавать локальный tar-архив напрямую в работающий Docker-контейнер с использованием стандартного ввода (STDIN). Это эффективный способ передачи нескольких файлов или директорий в контейнер без создания промежуточных файлов на локальной машине.
Сначала создадим директорию и несколько файлов в локальной директории ~/project, которые мы заархивируем и передадим.
mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt
Эта команда создаёт директорию my_files и два текстовых файла внутри неё.
Убедитесь, что контейнер my_ubuntu_container запущен. Если нет, запустите его.
docker start my_ubuntu_container
Для передачи tar-архива в контейнер мы используем команду tar для создания архива директории my_files и перенаправим его вывод (с помощью |) в команду docker exec. Внутри контейнера мы снова используем tar для распаковки архива.
Мы передадим архив в директорию /opt/ внутри контейнера.
tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/
Разберём эту команду:
tar -cvf - ~/project/my_files: создаёт tar-архив (-c) с подробным выводом (-v) директории~/project/my_files. Опция-f -указываетtarзаписать архив в стандартный вывод.|: перенаправляет стандартный вывод командыtar(архив) на стандартный ввод следующей команды.docker exec -i my_ubuntu_container tar -xvf - -C /opt/: выполняет командуtarвнутри контейнераmy_ubuntu_container. Флаг-iважен, так как он оставляет STDIN открытым для командыexec, позволяя получать передаваемые данные. Командаtar -xvf -распаковывает (-x) с подробным выводом (-v) из стандартного ввода (-f -). Опция-C /opt/меняет директорию на/opt/перед распаковкой, поэтому содержимое архива будет извлечено в/opt/my_filesвнутри контейнера.
Чтобы убедиться, что файлы успешно переданы и распакованы внутри контейнера, выведем содержимое директории /opt/my_files/ с помощью docker exec.
docker exec my_ubuntu_container ls /opt/my_files/
В выводе должны отображаться файлы file1.txt и file2.txt, что подтверждает успешную передачу и распаковку архива.
Наконец, очистим контейнер и локальные файлы.
docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files
Резюме
В этой лабораторной работе вы научились использовать команду docker container cp для копирования файлов между локальной файловой системой и работающим Docker-контейнером. Вы попрактиковались в копировании локального файла в контейнер, демонстрируя, как добавлять необходимые данные или конфигурации после запуска контейнера. Это включало создание локального файла, запуск простого контейнера Ubuntu и использование docker cp для переноса файла в директорию /tmp контейнера.



