В Docker контейнеры по своей природе являются эфемерными. Это означает, что после остановки или удаления контейнера все данные, созданные в нём, будут потеряны. Однако многим реальным приложениям требуется сохранение данных, особенно приложениям с отслеживанием состояния, таким как базы данных, веб-приложения и системы обработки данных. Docker Volumes предлагают решение для управления постоянными данными, которые сохраняются при перезапуске контейнера и даже при его удалении.
В этой статье мы рассмотрим, что такое тома Docker, как они работают и как их можно использовать для сохранения данных в контейнерах. Мытакже рассмотрим практические примеры и реальные сценарии, в которых тома Docker становятся незаменимыми.
Что такое тома Docker?
Docker Volumes — это механизмы хранения данных, которые позволяют контейнерам сохранять и совместно использовать данные. Volumes имеют ряд преимуществ перед другими методами хранения, такими как привязка или копирование файлов в образ контейнера:
- Они управляются Docker и не зависят от файловой системы хоста.
- Их можно использовать совместно с несколькими контейнерами.
- Они позволяют отделить жизненный цикл контейнера от жизненного цикла данных.
Типы томов Docker
- Именованные тома: это тома, которыми управляет Docker и которые хранятся в месте, указанном движком Docker. Docker управляет их жизненным циклом, и они не зависят от контейнера.
- Анонимные тома: похожи на именованные тома, но у них нет конкретного имени. Docker автоматически присваивает им случайное имя.
- Привязки: привязки сопоставляют определенный каталог или файл на хост-компьютере с контейнером. Это полезно в тех случаях, когда контейнеру требуется доступ к данным, специфичным для хоста.
Создание и использование томов Docker
Основной синтаксис для томов:
docker run -v <volume_name>:<container_path> <image_name>
Пример 1. Сохранение данных с помощью именованных томов
Давайте начнём с простого примера, в котором мы создаём контейнер Docker с использованием именованного тома для хранения постоянных данных:
- Создайте и запустите контейнер:
docker run -d --name my_container -v my_data:/var/lib/mysql mysql:latest
- -d: Запускает контейнер в автономном режиме (в фоновом режиме).
- --name my_container: Присваивает контейнеру имя.
- -v my_data:/var/lib/mysql: Создаёт именованный том my_data и подключает его к каталогу /var/lib/mysql внутри контейнера. Здесь MySQL хранит файлы данных.
- mysql:latest: Образ, который мы используем для запуска контейнера.
- Проверка тома: Вы можете проверить том, чтобы убедиться, что он создан:
docker volume inspect my_data
- Доступ к данным: Даже если вы остановите или удалите контейнер, том сохранится:
docker rm -f my_container
docker run -d --name new_mysql_container -v my_data:/var/lib/mysql mysql:latest
Новый контейнер сможет получить доступ к данным в my_data.
Пример 2. Использование привязных монтирований
Привязные монтирования полезны в тех случаях, когда вам нужно напрямую получить доступ к файлам на хосте или изменить их.
- Запустите контейнер с привязкой к каталогу:
docker run -d --name web_container -v /path/to/local/folder:/usr/share/nginx/html nginx
- /path/to/local/folder: Это каталог на вашем хост-компьютере.
- /usr/share/nginx/html: Это путь внутри контейнера, по которому обслуживаются файлы веб-сайта.
При такой настройке любые изменения, внесённые в файлы на хосте в /path/to/local/folder, будут немедленно отражены в контейнере. Обычно это используется при локальной разработке, когда нужно изменить код или файлы конфигурации и сразу же получить доступ к этим изменениям в работающем контейнере.
Сценарии использования томов Docker
1. Базы данных (сервисы с отслеживанием состояния)
Такие базы данных, как MySQL, PostgreSQL или MongoDB, хранят свои данные в томах. Благодаря использованию томов данные сохраняются при перезапуске или обновлении контейнера. Это гарантирует, что критически важные данные не будут потеряны.
Пример:
docker run -d -v pgdata:/var/lib/postgresql/data postgres
- Том pgdata гарантирует, что файлы базы данных будут храниться вне контейнера и сохранятся после завершения жизненного цикла контейнера.
2. Общие тома для нескольких контейнеров
В архитектуре микросервисов может возникнуть необходимость в том, чтобы несколько контейнеров использовали одни и те же данные. Этого можно добиться, подключив один и тот же том к нескольким контейнерам.
Пример:
docker run -d --name app -v shared_volume:/app/data my_app
docker run -d --name worker -v shared_volume:/app/data my_worker
Здесь контейнеры my_app и my_worker могут считывать данные из одного и того же каталога и записывать их в него, что упрощает обмен данными.
3. Резервное копирование и восстановление данных
Тома также можно использовать для простого резервного копирования и восстановления данных. С помощью docker run можно копировать файлы на том или с него.
Пример резервного копирования:
docker run --rm -v my_data:/data -v $(pwd):/backup busybox tar czf /backup/backup.tar.gz /data
Эта команда создаёт резервную копию тома my_data и сохраняет её в виде сжатого файла на хосте.
Пример восстановления:
docker run --rm -v my_data:/data -v $(pwd):/backup busybox tar xzf /backup/backup.tar.gz -C /data
Это восстановит данные из архива резервных копий в томе.
4. Среда разработки
При настройке среды разработки можно использовать привязку для сопоставления локального исходного кода с контейнерным приложением.
Пример для приложения Node.js:
docker run -d -v $(pwd)/src:/usr/src/app -w /usr/src/app node npm start
Таким образом, вы можете редактировать исходный код на локальном компьютере и сразу видеть, как изменения отражаются в работающем контейнере.
Управление томами Docker
- Список томов: Чтобы просмотреть все тома, которыми управляет Docker:
docker volume ls
- Проверка тома: Чтобы просмотреть сведения о томе (например, о точке подключения):
docker volume inspect my_volume
- Удалить неиспользуемые тома: Неиспользуемые (висячие) тома могут занимать место, поэтому рекомендуется их удалить:
docker volume prune
Лучшие практики Docker Volumes
- Используйте именованные тома для сохранения данных: если вашему контейнеру требуются постоянные данные, всегда используйте именованные тома. Это гарантирует, что данные сохранятся после завершения работы контейнера.
- Избегайте привязных монтирований в рабочей среде: привязные монтирования обеспечивают прямой доступ к файловой системе хоста, что может быть рискованно в рабочей среде. Вместо этого используйте именованные тома.
- Резервное копирование томов: всегда создавайте резервные копии томов, особенно для приложений с отслеживанием состояния, таких как базы данных.
- Вопросы безопасности: будьте осторожны при совместном использовании томов между контейнерами, особенно если у контейнеров разные права доступа. Всегда проверяйте средства контроля доступа.
Заключение
Тома Docker — это важная часть управления сохранением данных в приложениях, работающих на Docker. Они позволяют отделить жизненный цикл контейнера от жизненного цикла данных, гарантируя, что важные данные сохранятся при перезапуске, обновлении и удалении контейнера. Независимо от того, используете ли вы базы данных, микросервисы или среды разработки, понимание того, как эффективно использовать тома Docker, является ключом к созданию надёжных, масштабируемых и отказоустойчивых приложений.
Правильное использование томов позволяет избежать распространённых ошибок, таких как потеря данных при обновлении контейнера, и повысить производительность и безопасность данных.