Монтирование папки в Docker: руководство по Volumes и Bind Mount (-v)
Почему данные внутри контейнера исчезают (Stateless)
По умолчанию все файлы, которые создаются внутри работающего контейнера Docker, живут только пока жив сам контейнер. Если вы обновите версию образа, перезапустите контейнер или выполните docker rm — все созданные базы данных, загруженные пользователями картинки и конфиги будут безвозвратно удалены. Для сохранения данных и удобной правки файлов сайта прямо с локального компьютера используются механизмы проброса папок: Bind Mount и Named Volumes.
Сравнение методов монтирования
| Метод | Синтаксис флага | Где лежат файлы | Для чего используется |
|---|---|---|---|
| Bind Mount | -v /директория/хоста:/путь/в/контейнере | В любой указанной вами папке на жестком диске. | Для разработки: Правка кода сайта на Windows/Linux в реальном времени. |
| Docker Volume | -v my_volume_data:/путь/в/контейнере | В специальной системной папке Docker (/var/lib/docker/volumes/). | Для баз данных: Максимальная скорость работы и изоляция (MySQL/PostgreSQL). |
Пошаговые примеры проброса папок в контейнер
Сценарий 1: Проброс папки с исходным кодом сайта (Bind Mount)
Создадим на локальном компьютере папку с файлом сайта:
mkdir -p ~/my_site && echo "Сайт из локальной папки!
" > ~/my_site/index.htmlЗапустим веб-сервер Nginx, подменив его стандартную папку нашей локальной:
docker run -d --name nginx-custom -p 8080:80 -v ~/my_site:/usr/share/nginx/html nginxТеперь любой файл, который вы измените в папке ~/my_site на своем компьютере, мгновенно изменится на работающем сайте без перезапуска контейнера!
Сценарий 2: Создание именованного тома для базы данных (Named Volume)
Создадим независимый постоянный том Docker для надежного хранения базы MySQL:
docker volume create mysql_database_dataЗапустим контейнер базы данных с привязкой к созданному тому:
docker run -d --name mysql-server -e MYSQL_ROOT_PASSWORD=my_secret_pass -v mysql_database_data:/var/lib/mysql mysql:8.0Даже если контейнер mysql-server будет полностью удален, все таблицы базы сохранятся в томе mysql_database_data. При создании нового контейнера с этим же томом все данные восстановятся за секунду.
Сценарий 3: Монтирование в режиме «Только для чтения» (:ro)
Если вы хотите, чтобы контейнер не мог случайно удалить или изменить файлы на вашем диске, добавьте суффикс :ro (Read-Only):
docker run -d -v /etc/ssl/certs:/etc/ssl/certs:ro nginxТиповые ошибки администраторов
- Монтирование пустой папки поверх непустой: Если примонтировать пустую локальную директорию в системную папку контейнера (например, в
/etc/nginx/), пустая папка хоста «перекроет» оригинальные файлы контейнера, и сервис упадет из-за отсутствия конфигурационных файлов. - Проблемы с правами пользователей (Permission Denied): Процесс внутри контейнера часто работает под пользователем с UID 1000 или 33 (www-data). Если локальная папка на хосте принадлежит root (права 700), контейнер не сможет записать туда логи или сессии. Решение: настройте права командой
chmod -R 777 /папкаилиchown -R 1000:1000 /папка.
Инженеры ITSTM спроектируют распределенные сетевые хранилища (Ceph / NFS / GlusterFS) для общего доступа к томам Docker между несколькими серверами.
Частые вопросы (FAQ)
Как посмотреть список всех созданных томов Docker?
Выполните команду: docker volume ls. Посмотреть подробную информацию о томе и путь на диске: docker volume inspect имя_тома.
Как удалить неиспользуемые старые тома Docker и освободить место?
Используйте команду безопасной очистки: docker volume prune (удаляет только те тома, которые не подключены ни к одному контейнеру).
В чем разница между флагом -v (--volume) и новым --mount?
Флаг --mount имеет более строгий и понятный синтаксис (например: --mount type=bind,source=/src,target=/app). Если исходная папка не существует, --mount выдаст ошибку, тогда как -v молча создаст пустую папку от пользователя root.
Работает ли проброс папок в Docker Desktop на Windows?
Да, но пути пишутся через слеши: -v C:/Users/Alex/my_project:/var/www/html. Убедитесь, что в настройках Docker Desktop включен доступ к диску (File Sharing).