Если вам нужно скопировать файлы с хоста Docker в свой контейнер Docker, этот учебник для вас.
В этом учебнике вы узнаете, как скопировать файлы с хоста Docker в контейнер Docker, используя различные подходы.
Приступим!
Предварительные требования
Если вы хотите следовать шаг за шагом, убедитесь, что у вас есть следующее:
- A Linux host. This tutorial uses Ubuntu 18.04.5 LTS.
- Docker установлен на хосте Linux. В этом учебнике используется Docker v19.03.11. Вы можете подтвердить версию Docker, запустив
docker version
.
- Любое загруженное и доступное Docker-изображение. В этом учебнике используется последнее изображение Docker NGINX, доступное на Docker Hub.
Копирование файлов с помощью команды docker cp
Для начала этого учебника вы узнаете, как скопировать файлы с хоста Docker в контейнеры, используя docker cp
команда. Команда docker cp
копирует файлы или папки между контейнером и локальной файловой системой вашего хоста Docker, и наоборот.
Давайте научимся использовать команду Docker cp на примере.
1. Откройте терминал на вашем локальном компьютере.
2. Создайте файл с именем myfile.txt с использованием команды touch
. Файл myfile.txt будет скопирован с хоста docker в контейнер.
3. Выполните команду docker run
. Ниже указанная команда docker run создаст новый контейнер в фоновом режиме. Ниже команда содержит три параметра, описанных ниже:
d
flag that runs the container in the background and keeps it alive until deleted.p
flag publishes a container’s port80
to the host on port80
.nginx
будет образом, который будет использоваться для запуска контейнера.

4. Проверьте, успешно ли создан контейнер Docker, используя команду docker ps
. После выполнения команды docker ps
, вы должны увидеть новое значение, сгенерированное под атрибутом CONTAINER ID (в данном случае ccae4670f030
), используя образ NGINX, что подтверждает, что контейнер успешно создан.

Прежде чем выполнять команду Docker cp, синтаксис команды Docker cp таков:
CONTAINER: SRC_PATH
указывает исходный путь контейнера.DEST_PATH
является путем назначения на хосте.CONTAINER: DEST_PATH
является путем назначения в контейнере.
Кроме того, вы также можете добавить options
с нижеперечисленными параметрами в команду следующим образом:
- Использование параметра архивации или а – Копирует все разрешения пользователя и основной группы файлов и папок.
- Использование параметра L – Указание опции L позволит скопировать любую символическую ссылку в исходном пути в пункт назначения.
5. Затем выполните команду docker cp
. Команда docker cp
скопирует myfile.txt, который вы создали ранее, в каталог /usr/share контейнера. ccae4670f030
– идентификатор контейнера, в который будет скопирован myfile.txt.
6. Наконец, выполните вход по SSH в работающий контейнер, запустив команду docker exec
с использованием /bin/bash
, который используется в качестве оболочки по умолчанию для входа пользователя в систему Linux.
- Флаг
i
указывает, что вы хотите открыть интерактивную сессию SSH в контейнере. Флагi
не закрывает сеанс SSH, даже если контейнер не присоединен. - Флаг
t
выделяет псевдо-TTY, который необходимо использовать для интерактивного выполнения команд.sudo docker exec -it ccae4670f030 /bin/bash
Вы увидите ниже, что теперь подключены к оболочке контейнера, когда выполняете docker exec
.

7. После входа в контейнер убедитесь, что файл myfile.txt был скопирован в контейнер с использованием команды ls.
ls
– это команда для отображения файлов на компьютере в операционных системах Unix и подобных им.grep
будет искать все файлы или папки, начинающиеся со строкиmy
внутри директории usr/share.

Копирование файлов с использованием Dockerfile
В предыдущем разделе вы узнали, как скопировать файлы в контейнер, выполнив команду Docker cp. А если вам нужно скопировать несколько файлов за один раз? Конечно, выполнение нескольких команд становится избыточным! Чтобы решить проблему выполнения нескольких команд cp, почему бы не попробовать копировать файлы или папки в контейнеры с использованием Dockerfile с помощью команд COPY
?
Развертывание контейнера и копирование файлов/папок с использованием Dockerfile позволяет избежать ручных шагов копирования, выполненных в предыдущем разделе. Dockerfile – это текстовый документ, который содержит все команды, которые пользователь мог бы вызвать в командной строке для создания образа.
Давайте создадим Dockerfile, запустим контейнер из него и, наконец, скопируем файлы.
1. Создайте папку с именем ~/host-to-container-copy-demo, затем измените (cd
) рабочий каталог на этот каталог. В этом каталоге будут содержаться все файлы, которые вы создадите в этом демонстрационном примере.
2. Теперь создайте два текстовых файла с именами myfile1.txt и myfile2.txt, скопируйте и вставьте их в файлы, и сохраните их в директории ~/host-to-container-copy-demo.
3. Создайте еще один файл, скопируйте/вставьте нижеуказанную конфигурацию и сохраните файл как Dockerfile в каталоге ~/host-to-container-copy-demo. После завершения Docker будет использовать этот Dockerfile для выполнения всех необходимых команд построения нового образа Docker поверх базового образа.
Ниже приведен Dockerfile с различными шагами/инструкциями для создания нового контейнера:
FROM
– Инструкция FROM инициализирует новый этап сборки и устанавливает базовый образ для последующих инструкций.COPY
– Команда COPY копирует файл с хост-машины (хост Docker) в контейнер.
4. Проверьте все необходимые файлы для создания нового образа, выполнив команду tree
. Вы должны увидеть Dockerfile, myfile1.txt и myfile2.txt в директории ~/host-to-container-copy-demo.

5. Затем создайте образ, выполнив команду docker build
. Флаг t
используется для пометки образа updated_ubuntu_image
тегом latest
, и .
позволяет Docker использовать все необходимые файлы из текущей рабочей директории.

docker build
command 6. Теперь проверьте вновь созданный образ updated_ubuntu_image
, выполнив команду docker images
. Обратите внимание на атрибут REPOSITORY. Этот атрибут – тег, созданный с флагом -t
на предыдущем этапе.

7. Наконец, запустите контейнер Docker, используя вновь созданный образ, выполнив команду docker run
. Флаг -it
указывает Docker выделить псевдотерминал, подключенный к стандартному вводу контейнера. bash
предоставляет стандартную оболочку для входа пользователя в систему Linux.
Теперь вы видите, что находитесь в оболочке Bash контейнера Docker.

8. Затем проверьте, были ли файлы успешно скопированы в контейнер в директориях /tmp и /usr/share, выполнив команду ls
.

Монтирование тома хранения и доступ к файлам с помощью команды Docker Volume
До сих пор вы узнали, как копировать файлы с хоста в контейнер, используя два различных подхода: с помощью команды docker cp
и файла Docker (DockerFile). На этот раз давайте узнаем, как легко обмениваться файловыми системами между хостом и контейнерами, используя команду docker volume
.
Предполагая, что вы все еще вошли в терминал:
1. Создайте том на хосте Docker, выполнив команду docker volume create
. Нижеприведенная команда создаст том с именем my-vol
. sudo docker volume create my-vol
2. Проверьте, что том успешно создан, выполнив команду docker volume ls
. Команда docker volume ls выводит том. После выполнения команды docker volume ls
, вы увидите my-vol
в атрибуте VOLUME NAME, что подтверждает успешное создание тома.

3. Затем запустите контейнер с помощью команды docker run
.
- Контейнер с именем
volume_testing
использует образnginx:latest
. d
flag runs the container in the background and keeps it alive until deleted.v
flag mounts the volumemy-vol
created on Docker host to the container’s destination/app
directory.

4. Проверьте, правильно ли примонтирован объем my-vol, который вы ранее создали, с контейнером, используя команду docker inspect
. Команда Docker inspect предоставляет информацию о контейнере. После выполнения команды docker inspect
будут отображены все подробности указанного контейнера (детали volume_testing
), включая детали монтирования, как показано ниже.
Ниже представлен снимок экрана изображения, который подтверждает, что объем (my-vol
), созданный на хосте, успешно примонтирован с каталогом /app
контейнера.

Вывод
В этом учебном пособии вы узнали различные способы копирования файлов или папок с хоста Docker в контейнеры, такие как использование команды Docker cp, команды Docker volume и Dockerfile.
Таким образом, какой подход вы собираетесь использовать далее при копировании данных с хоста в контейнеры Docker?