Отредактировано 2 несколько месяцев назад от ExtremeHow Редакционная команда
Docker DesktopПапкиОбмен файламиХостКонтейнерыКонфигурацияДевОпсРазработка программного обеспеченияОблачные вычисленияВиртуализация
Перевод обновлен 2 несколько месяцев назад
Docker — это мощный инструмент, используемый для разработки и развертывания приложений внутри контейнеров. Контейнеры — это изолированная среда, в которой приложения могут работать без помех со стороны других процессов на той же машине. При использовании Docker вы можете столкнуться с ситуациями, когда нужно обмениваться файлами или папками между хост-машиной и контейнерами Docker. Это руководство проведет вас через процесс обмена папками между хост-машиной и контейнерами Docker в подробной и исчерпывающей форме. Мы рассмотрим основные концепции, приведем примеры и рассмотрим потенциальные трудности.
Прежде чем переходить к шагам для обмена папками, важно понять, как Docker обрабатывает постоянство данных. Контейнеры Docker являются эфемерными; после завершения работы любые данные, сохраненные в них, могут быть потеряны. Docker предоставляет различные механизмы для управления и постоянства данных, и один из основных способов — это тома. Том Docker — это постоянное хранилище данных, к которому может получить доступ контейнер, и которое существует за пределами жизненного цикла контейнера.
Docker управляет томами независимо, что означает, что они изолированы от какого-либо конкретного контейнера. Это значительно способствует долговечности данных, поскольку даже если вы удалите контейнер, данные в его томе останутся нетронутыми и могут быть присоединены к другому контейнеру. Тома идеальны для обмена папками между хостами и контейнерами Docker из-за их независимости от контейнера и их возможности явного управления.
Docker поддерживает различные типы томов для различных случаев использования:
Самый простой способ обмена папкой между хостом и контейнером Docker — через прямое монтирование. Давайте рассмотрим шаги, которые нужно выполнить, и приведем пример:
Создайте директорию на вашей хост-системе, которую вы хотите поделиться с Docker. Например, вы могли бы создать директорию под названием /Users/username/shared
.
Затем обновите команду запуска Docker, чтобы включить прямое монтирование. Используйте флаг -v
или --volume
после отображения путей. Например, чтобы смонтировать /Users/username/shared
в /shared
в вашем контейнере, команда будет:
docker run -v /Users/username/shared:/shared my-image
В этом примере my-image
относится к образу Docker, который вы запускаете. Монтирование позволяет любым изменениям, внесенным в /shared
внутри контейнера, быть отраженными в папке /Users/username/shared
на хосте.
После того, как контейнер запущен с прямым монтированием, любые файлы, измененные внутри /shared
в контейнере, напрямую влияют на файлы в директории /Users/username/shared
на хосте и наоборот.
Вот практический пример обмена файлами между хостом и контейнером Docker с использованием веб-сервера Nginx. Допустим, вы хотите раздавать HTML-файлы, расположенные в директории на вашем хосте:
website
на своем хосте.website
добавьте файл index.html
с некоторым содержимым.Используйте следующую команду, чтобы смонтировать директорию website
из директории /usr/share/nginx/html
в контейнере:
docker run --name my-nginx -v "$PWD"/website:/usr/share/nginx/html:ro -d nginx
Опция :ro
делает монтирование доступным только для чтения внутри контейнера.
Посетите http://localhost
в веб-браузере, чтобы увидеть файл index.html
, раздаваемый Nginx из общей директории на вашем хосте.
В то время как прямые монтирования напрямую связаны с путями на файловой системе хоста, тома Docker более абстрактны и управляются Docker. Давайте узнаем, как создавать и использовать тома Docker:
Используйте команду docker volume create
, чтобы создать новый том, как показано ниже:
docker volume create my-volume
Эта команда создает том под названием my-volume
, который будет управляться Docker.
Чтобы прикрепить созданный том к контейнеру, используйте следующую команду:
docker run -v my-volume:/app/data my-image
Этот пример монтирует my-volume
в контейнере по адресу /app/data
. Любые данные, записанные в /app/data
, остаются в my-volume
, даже если контейнер будет остановлен или удален.
Рассмотрим сценарий, когда вы хотите сохранить базу данных между перезапусками контейнера. Вы можете использовать том, чтобы смонтировать директорию данных контейнера базы данных:
docker volume create db-data
docker run -d --name my-database -v db-data:/var/lib/mysql mysql:5.7
В этом случае любые изменения данных в директории /var/lib/mysql
сохраняются в томе db-data
.
Даже если вы остановите и удалите контейнер my-database
, том db-data
сохранит данные, готовые для подключения к другому экземпляру.
Настройка прямого монтирования может быть простой, но это может вызвать проблемы. Вот некоторые распространенные проблемы и решения:
Важно убедиться, что у контейнера есть необходимые разрешения для доступа к директории, подключенной через прямое монтирование. В противном случае вы можете получить ошибки Permission Denied
.
Дважды проверьте путь хоста и путь контейнера, указанные в параметре -v
, чтобы убедиться, что они правильные.
Демон Docker может работать от имени другого пользователя, чем пользователь хоста, что может повлиять на разрешения доступа. Вы можете попробовать запустить Docker с повышенными привилегиями или настроить пользовательские разрешения по мере необходимости.
Обмен папками между хостом и контейнером Docker — это важная функция, которая облегчает разработку, постоянство данных и сотрудничество. Важно решить, какой тип монтирования (прямоконтактирующее монтирование или том) подходит для вашего случая использования. Прямоконтактирующее монтирование дает вам прямой контроль над путями, в то время как тома Docker более портативны и легче управляемы для долговременного сохранения данных.
Вот некоторые лучшие практики, которые следует учитывать:
С этими знаниями, методами и примерами вы должны быть хорошо оснащены для эффективного решения задач обмена папками между вашим хостом и контейнерами Docker. Не стесняйтесь исследовать дальше и адаптировать методики в соответствии с потребностями вашего проекта.
Если вы найдете что-то неправильное в содержании статьи, вы можете