8.1 Знакомство с виртуальными дисками
Монтирование томов (Volumes) — это одна из самых полезных возможностей Docker. С её помощью контейнеры могут легко работать с данными хост-машины. Эта функция делает управление данными гибким и удобным: вы можете сохранять информацию надолго, делиться ею между контейнерами и без проблем делать резервное копирование или восстанавливать данные, если что-то пойдёт не так.
Тома (Volumes) в Docker — это способ сохранять данные так, чтобы они не зависели от контейнеров. Даже если контейнер будет удалён, информация, хранящаяся в томах, останется в безопасности. Тома можно подключать (монтировать) к контейнерам, что позволяет хранить данные отдельно и использовать их повторно, независимо от того, сколько раз вы создаёте или удаляете контейнеры.
Основные типы томов
- Анонимные тома (Anonymous Volumes)
- Автоматически создаются Docker, если для контейнера явно не указан том.
- Используются для временного хранения данных.
- Именованные тома (Named Volumes)
- Создаются и управляются Docker.
- Могут быть подключены к нескольким контейнерам и сохраняются даже после их удаления или остановки.
- Тома с привязкой (Bind Mounts)
- Связывают директорию на хостовой машине с директорией в контейнере.
- Идеальны для доступа к данным хостовой системы и удобны при разработке.
Основной синтаксис команды docker run для монтирования томов
-v <host_path>:<container_path>
Полный синтаксис:
docker run -v <host_path>:<container_path> [OPTIONS] IMAGE [COMMAND] [ARG...]
Основные параметры для монтирования томов
1. Параметр -v или --volume
Используется для создания именованного тома или тома с привязкой.
Пример:
docker run -d -v /host/data:/container/data nginx
2. Параметр --mount
Предоставляет более гибкий и детализированный способ монтирования томов, поддерживая дополнительные параметры.
Пример:
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
8.2 Создание и использование томов
1. Именованные тома
Именованные тома создаются и управляются Docker. Они предназначены для долговременного хранения данных, которые должны сохраняться между перезапусками или удалениями контейнеров.
Создание именованного тома:
docker volume create my_volume
Запуск контейнера с монтированием тома:
В этом примере том my_volume монтируется в директорию /data внутри контейнера my_container. Все данные, записанные в /data, сохранятся в томе и останутся доступными даже после удаления контейнера.
docker run -d -v my_volume:/data --name my_container nginx
2. Анонимные тома
Анонимные тома создаются Docker автоматически и связываются с конкретным контейнером. Они полезны для временных данных, которые не требуется сохранять после удаления контейнера.
Запуск контейнера с анонимным томом:
В этом примере Docker автоматически создаст анонимный том и смонтирует его в директорию /data внутри контейнера.
docker run -d -v /data --name my_container nginx
3. Привязанные директории
Привязанные директории позволяют монтировать директории хостовой системы в контейнеры. Это удобно для совместного использования данных между контейнерами и хост-системой. Также такой подход часто используется в процессе разработки, когда исходный код хранится на хостовой системе.
Запуск контейнера с привязанной директорией:
В этом примере директория /host/data на хостовой машине монтируется в директорию /container/data внутри контейнера my_container.
docker run -d -v /host/data:/container/data --name my_container nginx
8.3 Примеры использования томов
1. Сохранение данных базы данных
Использование томов для баз данных помогает сохранить данные даже при перезапусках и обновлениях контейнера. Это особенно важно для надежной работы в производственных средах.
Пример:
В этом примере данные PostgreSQL сохраняются в томе db_data, что гарантирует их сохранность при перезапуске или удалении контейнера.
docker volume create db_data
docker run -d -v db_data:/var/lib/postgresql/data --name postgres_container postgres
2. Совместное использование данных контейнерами
Иногда бывает необходимо шарить данные несколькими контейнерами. Тома позволяют легко это сделать.
Пример
Создадим том и запустим два контейнера, которые будут использовать этот том. Оба контейнера получат доступ к данным в томе shared_data, что позволяет им обмениваться данными.
docker volume create shared_data
docker run -d -v shared_data:/data --name container1 nginx
docker run -d -v shared_data:/data --name container2 nginx
3. Разработка и тестирование
При разработке приложений удобно использовать привязанные директории для совместного использования исходного кода между контейнером и хостовой машиной. Это позволяет разработчикам редактировать код на хосте, а контейнеру — сразу работать с обновлениями.
Пример
В этом примере директория /path/to/source на хостовой машине монтируется в директорию /app внутри контейнера dev_container. Таким образом, контейнер может использовать актуальный исходный код прямо с хостовой системы.
docker run -d -v /path/to/source:/app --name dev_container node
8.4 Управление томами
Docker предоставляет удобные команды для управления томами, благодаря которым можно легко создавать, удалять и просматривать информацию о томах.
1. Просмотр всех томов
Эта команда выводит список всех доступных томов на хостовой машине.
docker volume ls
2. Просмотр информации о томе
С помощью этой команды можно получить подробные сведения о томе my_volume: его местоположении на хостовой файловой системе, а также информации о контейнерах, которые используют этот том.
docker volume inspect my_volume
3. Удаление тома
Эта команда удаляет том my_volume. Перед удалением важно убедиться, что том не используется ни одним контейнером, иначе команда не выполнится.
docker volume rm my_volume
8.5 Резервное копирование томов
Для обеспечения безопасности данных важно иметь возможность создавать резервные копии томов и восстанавливать их при необходимости.
1. Резервное копирование тома
В этом примере содержимое тома my_volume архивируется в файл my_volume_backup.tar.gz, который сохраняется в директории /backup на хостовой машине.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar czf /backup/my_volume_backup.tar.gz /volume
2. Восстановление тома
Этот пример восстанавливает содержимое тома my_volume из резервной копии, которая хранится в файле my_volume_backup.tar.gz.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar xzf /backup/my_volume_backup.tar.gz -C /volume
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ