Як працює зберігання даних у Docker: Volumes і Bind Mounts
Вступ
У цьому посібнику ви дізнаєтесь, як працює зберігання даних у Docker і як зберігати дані за допомогою Docker Volumes і Bind Mounts. Ви також зрозумієте ключові відмінності між цими підходами та коли використовувати кожен із них у production. Це допоможе уникнути втрати даних і побудувати надійні контейнеризовані системи.
Передумови
- Цільова аудиторія: початківці системні адміністратори
- Орієнтовний час: ~30 хвилин
- Операційна система: будь-яка ОС з підтримкою Docker, наприклад Ubuntu 22.04+, Debian 12+, CentOS Stream або macOS з Docker Desktop
- ПЗ: Docker 24.0.0 або новіше
- Права: користувач з доступом до Docker або sudo-привілеями
- Апаратні вимоги: мінімум 2 ГБ ОЗП і 10 ГБ вільного місця на диску
- Мережа: доступ до Інтернету для завантаження образів контейнерів
- Базові знання: основи роботи з командним рядком і розуміння контейнерів
Крок 1: Розуміння роботи зберігання даних у Docker
Контейнери Docker використовують шарову файлову систему. Кожен контейнер має записуваний шар поверх незмінних шарів образу.
Що відбувається при записі даних у контейнер
- Docker зберігає шари образу як read-only
- Під час запуску контейнера Docker додає записуваний шар
- Усі зміни файлів відбуваються тільки в цьому записуваному шарі
Результат
Після видалення контейнера всі дані в записуваному шарі втрачаються. Це означає, що зберігання даних у контейнері за замовчуванням є тимчасовим.
Така поведінка підходить для stateless-додатків, але не для баз даних або сервісів із постійним зберіганням.
Крок 2: Створення та використання Docker Volumes
Docker Volumes — це керовані Docker області зберігання даних.
Створення тому
Виконайте команду:
docker volume create my_volume
У відповідь ви побачите ім'я тому.
Використання тому в контейнері
Виконайте команду:
docker run -d -v my_volume:/app/data --name volume_test busybox
Docker монтує том у контейнер за шляхом /app/data.
Результат
Дані, записані в /app/data, зберігаються навіть після видалення контейнера.
Основні характеристики volumes
- Керуються Docker
- Зберігаються у внутрішніх директоріях Docker, наприклад
/var/lib/docker/volumes/ - Зручні для резервного копіювання та міграції
- Ізольовані від файлової системи хоста
Використовуйте volumes для баз даних і production-навантажень.
Крок 3: Створення та використання Bind Mounts
Bind mounts пов'язують конкретну директорію на хості з директорією всередині контейнера.
Використання bind mount
Виконайте команду:
docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox
Результат
Контейнер напряму працює з директорією на хості. Будь-які зміни на хості одразу видно в контейнері.
Основні характеристики bind mounts
- Залежать від шляхів файлової системи хоста
- Дозволяють безпосереднє редагування файлів з хоста
- Не мають ізоляції, керованої Docker
- Гнучкіші, але менш переносимі
Bind mounts миттєво синхронізують зміни між хостом і контейнером.
Крок 4: Порівняння Volumes і Bind Mounts
Розуміння відмінностей допомагає зробити правильний вибір.
Docker Volumes
- Керуються Docker
- Переносимі між середовищами
- Безпечніші для production
- Легші для резервного копіювання
- Абстраговані від файлової системи хоста
Bind Mounts
- Керуються хостом
- Прив'язані до конкретних шляхів
- Зручні для розробки
- Надають прямий доступ до файлів
- Менш безпечні при неправильній конфігурації
Крок 5: Вибір між Volumes і Bind Mounts у production
Використовуйте наступні рекомендації.
Коли використовувати Docker Volumes
- Запуск баз даних, наприклад MySQL або PostgreSQL
- Зберігання даних додатків, які мають бути постійними
- Розгортання production-сервісів
- Необхідність переносимості між серверами
Коли використовувати Bind Mounts
- Локальна розробка
- Пряме редагування коду або конфігурації
- Налагодження контейнерів
- Тимчасові або тестові середовища
Важливо: Bind mounts можуть надати контейнеру доступ до чутливих файлів хоста при неправильній конфігурації. Завжди перевіряйте шляхи та права доступу.
Перевірка та тестування
Створіть тестовий контейнер з volume:
docker run -it -v my_volume:/data --name playground busybox
У контейнері створіть файл:
echo test > /data/file.txt
Вийдіть з контейнера та видаліть його:
docker rm -f playground
Запустіть новий контейнер з тим самим volume:
docker run -it -v my_volume:/data --name playground busybox
Перевірте файл:
cat /data/file.txt
Очікуваний результат: файл існує, що підтверджує збереження даних.
Відкат змін
Для очищення ресурсів виконайте команди:
docker rm -f playground volume_test bind_test
docker volume rm my_volume
docker system prune -f
Важливо: Видалення volumes безповоротно видаляє всі дані.
Усунення проблем
- Проблема: дані зникають після перезапуску контейнера
Причина: не використовується volume або bind mount
Рішення: підключіть постійне сховище - Проблема: помилка permission denied
Причина: невідповідність прав доступу
Рішення: використовуйтеchmodабоchown - Проблема: volume не монтується
Причина: неправильний шлях або синтаксис
Рішення: перевірте формат і шляхи
Висновок і подальші кроки
Ви дізналися, як працює зберігання даних у Docker і як зберігати дані за допомогою volumes і bind mounts. Тепер ви розумієте, коли використовувати кожен підхід у production. Далі вивчіть Docker Compose для керування multi-container додатками та декларативного опису сховища.