Найти в Дзене
Linux | Network | DevOps

Docker Volumes and Persistence подробное руководство

В Docker контейнеры по своей природе являются эфемерными. Это означает, что после остановки или удаления контейнера все данные, созданные в нём, будут потеряны. Однако многим реальным приложениям требуется сохранение данных, особенно приложениям с отслеживанием состояния, таким как базы данных, веб-приложения и системы обработки данных. Docker Volumes предлагают решение для управления постоянными данными, которые сохраняются при перезапуске контейнера и даже при его удалении. В этой статье мы рассмотрим, что такое тома Docker, как они работают и как их можно использовать для сохранения данных в контейнерах. Мытакже рассмотрим практические примеры и реальные сценарии, в которых тома Docker становятся незаменимыми. Docker Volumes — это механизмы хранения данных, которые позволяют контейнерам сохранять и совместно использовать данные. Volumes имеют ряд преимуществ перед другими методами хранения, такими как привязка или копирование файлов в образ контейнера: docker run -v <volume_name>:<
Оглавление

В Docker контейнеры по своей природе являются эфемерными. Это означает, что после остановки или удаления контейнера все данные, созданные в нём, будут потеряны. Однако многим реальным приложениям требуется сохранение данных, особенно приложениям с отслеживанием состояния, таким как базы данных, веб-приложения и системы обработки данных. Docker Volumes предлагают решение для управления постоянными данными, которые сохраняются при перезапуске контейнера и даже при его удалении.

В этой статье мы рассмотрим, что такое тома Docker, как они работают и как их можно использовать для сохранения данных в контейнерах. Мытакже рассмотрим практические примеры и реальные сценарии, в которых тома Docker становятся незаменимыми.

Что такое тома Docker?

Docker Volumes — это механизмы хранения данных, которые позволяют контейнерам сохранять и совместно использовать данные. Volumes имеют ряд преимуществ перед другими методами хранения, такими как привязка или копирование файлов в образ контейнера:

  • Они управляются Docker и не зависят от файловой системы хоста.
  • Их можно использовать совместно с несколькими контейнерами.
  • Они позволяют отделить жизненный цикл контейнера от жизненного цикла данных.

Типы томов Docker

  1. Именованные тома: это тома, которыми управляет Docker и которые хранятся в месте, указанном движком Docker. Docker управляет их жизненным циклом, и они не зависят от контейнера.
  2. Анонимные тома: похожи на именованные тома, но у них нет конкретного имени. Docker автоматически присваивает им случайное имя.
  3. Привязки: привязки сопоставляют определенный каталог или файл на хост-компьютере с контейнером. Это полезно в тех случаях, когда контейнеру требуется доступ к данным, специфичным для хоста.

Создание и использование томов Docker

Основной синтаксис для томов:

docker run -v <volume_name>:<container_path> <image_name>

Пример 1. Сохранение данных с помощью именованных томов

Давайте начнём с простого примера, в котором мы создаём контейнер Docker с использованием именованного тома для хранения постоянных данных:

  1. Создайте и запустите контейнер:

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: Образ, который мы используем для запуска контейнера.
  1. Проверка тома: Вы можете проверить том, чтобы убедиться, что он создан:

docker volume inspect my_data

  1. Доступ к данным: Даже если вы остановите или удалите контейнер, том сохранится:

docker rm -f my_container
docker run -d --name new_mysql_container -v my_data:/var/lib/mysql mysql:latest

Новый контейнер сможет получить доступ к данным в my_data.

Пример 2. Использование привязных монтирований

Привязные монтирования полезны в тех случаях, когда вам нужно напрямую получить доступ к файлам на хосте или изменить их.

  1. Запустите контейнер с привязкой к каталогу:

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

  1. Используйте именованные тома для сохранения данных: если вашему контейнеру требуются постоянные данные, всегда используйте именованные тома. Это гарантирует, что данные сохранятся после завершения работы контейнера.
  2. Избегайте привязных монтирований в рабочей среде: привязные монтирования обеспечивают прямой доступ к файловой системе хоста, что может быть рискованно в рабочей среде. Вместо этого используйте именованные тома.
  3. Резервное копирование томов: всегда создавайте резервные копии томов, особенно для приложений с отслеживанием состояния, таких как базы данных.
  4. Вопросы безопасности: будьте осторожны при совместном использовании томов между контейнерами, особенно если у контейнеров разные права доступа. Всегда проверяйте средства контроля доступа.

Заключение

Тома Docker — это важная часть управления сохранением данных в приложениях, работающих на Docker. Они позволяют отделить жизненный цикл контейнера от жизненного цикла данных, гарантируя, что важные данные сохранятся при перезапуске, обновлении и удалении контейнера. Независимо от того, используете ли вы базы данных, микросервисы или среды разработки, понимание того, как эффективно использовать тома Docker, является ключом к созданию надёжных, масштабируемых и отказоустойчивых приложений.

Правильное использование томов позволяет избежать распространённых ошибок, таких как потеря данных при обновлении контейнера, и повысить производительность и безопасность данных.

Linux | Network | DevOps

Чат

YouTube

VK

Rutube