Docker Volumes и монтирование папок: почему пропадают данные и как их сохранить
Почему после пересоздания контейнера база данных становится пустой?
По умолчанию файловая система внутри контейнера является эфемерной (временной). Когда контейнер удаляется командой docker rm или обновляется через docker-compose down, все новые файлы, таблицы MySQL или загруженные пользователями картинки безвозвратно удаляются вместе с изолированным слоем контейнера.
| Тип хранилища | Где физически хранятся данные | Для чего лучше подходит |
|---|---|---|
| Стандартный контейнер (без томов) | Во временном слое (удаляется с контейнером) | Тестирование, stateless микросервисы |
| Docker Named Volume | В системной папке Docker (/var/lib/docker/volumes/) | Базы данных (PostgreSQL, MySQL, Redis) |
| Bind Mount (Монтирование папки) | В любой указанной вами папке сервера (например, /home/user/app) | Исходный код сайта, файлы конфигураций (nginx.conf) |
Как правильно настроить постоянное хранение данных
- Вариант 1. Использование именованных томов Docker Volumes (Лучше для баз данных):
Создадим постоянный том и подключим его к контейнеру MySQL:
# Создаем том с именем mysql_data: docker volume create mysql_data # Запускаем контейнер с примонтированным томом: docker run -d --name db_server -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8.0Даже если вы удалите контейнер
docker rm -f db_server, томmysql_dataостанется нетронутым со всеми таблицами. - Вариант 2. Использование Bind Mount (Монтирование конкретной папки сервера):
Удобно для веб-сайтов, так как файлы можно редактировать прямо с хоста:
docker run -d -p 80:80 --name my_web -v /var/www/my_site:/usr/share/nginx/html:ro nginx(Параметр
:roмонтирует папку в режиме «только для чтения», защищая ее от изменений изнутри контейнера). - Вариант 3. Настройка постоянных томов в docker-compose.yml:
Пример правильного описания БД с сохранением данных в файле Compose:
services: db: image: postgres:15 environment: POSTGRES_PASSWORD: mysecretpassword volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:
Частые вопросы (FAQ)
Где физически лежат файлы тома на сервере?
В Linux тома Docker по умолчанию хранятся в защищенной системной директории /var/lib/docker/volumes/<имя_тома>/_data/.
Как удалить ненужный том, если он больше не используется?
Выполните команду docker volume rm <имя_тома>. Чтобы удалить сразу все неиспользуемые тома, используйте команду docker volume prune.
Удалит ли команда 'docker compose down -v' мои данные?
Да! Флаг -v принудительно удаляет описанные в compose-файле именованные тома. Для обычного перезапуска контейнеров всегда используйте 'docker compose down' без флага -v.
Как сделать резервную копию файлов из Docker Volume?
Самый простой способ — скопировать данные через временный контейнер или утилиту tar: docker run --rm -v mysql_data:/data -v $(pwd):/backup ubuntu tar -czvf /backup/mysql_backup.tar.gz /data.