Docker: как пробросить папку с хоста внутрь контейнера (Volumes и Bind Mount)
При перезапуске или обновлении контейнера Docker все созданные файлы, картинки сайта или базы данных стираются, либо разработчику неудобно редактировать код сайта, так как файлы заперты внутри контейнера.
Зачем монтировать папки в Docker?
По умолчанию контейнеры не сохраняют данные после удаления (они одноразовые). Чтобы данные сохранялись на вашем реальном сервере навсегда, используется механизм Bind Mount (привязка папки).
Синтаксис флага `-v` (Volume / Mount)
Формула проста: -v /ПАПКА_НА_ВАШЕМ_СЕРВЕРЕ:/ПУТЬ_ВНУТРИ_КОНТЕЙНЕРА
Практический пример: Запуск Nginx со своими HTML-файлами
Шаг 1. Создаем папку с сайтом на хосте (сервере)
mkdir -p /home/ubuntu/my_site
echo "<h1>Привет из проброшенной папки!</h1>" > /home/ubuntu/my_site/index.htmlШаг 2. Запускаем контейнер с флагом `-v`
sudo docker run -d \
--name web_with_files \
-p 80:80 \
-v /home/ubuntu/my_site:/usr/share/nginx/html \
nginxЧто произошло: Мы связали локальную папку /home/ubuntu/my_site со стандартной веб-папкой Nginx внутри контейнера /usr/share/nginx/html.
Шаг 3. В чем супер-сила этого метода?
Теперь вы можете редактировать файл /home/ubuntu/my_site/index.html любым редактором (nano, VS Code) прямо на сервере или через WinSCP — изменения на сайте появятся **мгновенно без перезапуска контейнера**!
Частые вопросы (FAQ)
В чем разница между Bind Mount (-v /path:/path) и Named Docker Volumes (-v volume_name:/path)?
Bind Mount монтирует конкретную существующую папку с вашего диска (удобно для исходного кода и конфигов). Named Volumes управляются самим Докером и хранятся в специальной системной директории /var/lib/docker/volumes/ (идеально для баз данных MySQL/PostgreSQL).
Почему при монтировании пустой папки с хоста все файлы внутри контейнера исчезли?
Bind Mount работает как вставка флешки: если вы монтируете пустую локальную папку в системную директорию контейнера, она перекроет собой существующее содержимое контейнера.
Как смонтировать папку только в режиме 'только чтение' (Read-Only)?
Добавьте суффикс ':ro' в конец флага: -v /home/ubuntu/config:/etc/nginx:ro. Контейнер не сможет случайно удалить или изменить файлы на вашем сервере.
Как пробросить папку в Docker на Windows (Docker Desktop)?
Укажите путь Windows через прямые слэши: -v C:/Users/Name/Projects/site:/usr/share/nginx/html.