Основы Docker: Тома (Volumes)
Docker Volumes — это предпочтительный механизм для сохранения постоянных данных, генерируемых и используемых Docker-контейнерами. Использование томов имеет ряд преимуществ по сравнению с сохранением данных в слое записи контейнера:
- Данные сохраняются независимо от жизненного цикла контейнера: Даже после удаления контейнера данные в томе остаются доступными.
- Совместное использование данных между контейнерами: Несколько контейнеров могут монтировать один и тот же том и совместно использовать данные.
- Управление данными Docker: Docker управляет жизненным циклом томов, что облегчает резервное копирование, восстановление и миграцию данных.
- Производительность: Тома могут обеспечивать лучшую производительность ввода-вывода по сравнению с использованием слоев записи, особенно для больших объемов данных.
Типы томов Docker
Docker поддерживает несколько типов томов:
Именованные тома (Named Volumes): Это тома, которым Docker присваивает имя. Они управляются Docker и хранятся в определенной области хост-файловой системы (обычно
/var/lib/docker/volumes/). Именованные тома являются наиболее распространенным и рекомендуемым типом томов.Анонимные тома (Anonymous Volumes): Это тома, которые не имеют явного имени. Они создаются при монтировании директории внутри контейнера без указания имени тома. Анонимные тома также хранятся в области управления Docker, но их сложнее отслеживать и совместно использовать, так как они не имеют понятного имени.
Монтирование хост-директорий (Bind Mounts): Этот тип позволяет монтировать файл или директорию с хост-машины непосредственно внутрь контейнера. В отличие от томов, Docker не управляет жизненным циклом монтирований хост-директорий; ответственность за существование и управление данными лежит на пользователе. Монтирования хост-директорий полезны для разработки (например, для быстрого отображения изменений кода внутрь контейнера), но могут быть менее переносимыми и сложнее в управлении в production-средах.
Тома tmpfs (tmpfs Mounts): Эти тома хранятся в памяти хост-машины и не сохраняются на диск. Они полезны для временных данных, которые не требуют постоянного хранения, и могут обеспечить высокую производительность.
Управление томами Docker
Вы можете управлять томами Docker с помощью команды docker volume.
Создание именованного тома
docker volume create my-data-volumeПросмотр списка томов
docker volume lsЭта команда выведет список всех созданных томов, включая их имена и драйверы.
Просмотр информации о томе
Чтобы получить подробную информацию о конкретном томе, используйте команду docker volume inspect:
docker volume inspect my-data-volumeЭта команда выведет JSON-объект с информацией о томе, включая его имя, драйвер, путь на хост-машине и опции монтирования.
Удаление тома
Вы можете удалить том, если он не используется ни одним контейнером:
docker volume rm my-data-volumeЧтобы удалить все неиспользуемые тома:
docker volume pruneБудьте осторожны при использовании docker volume prune, так как это удалит все тома, которые в данный момент не примонтированы ни к одному контейнеру.
Использование томов с контейнерами
Вы можете монтировать тома в контейнеры при их создании с помощью флага -v команды docker run или с помощью секции volumes в файле docker-compose.yml.
Монтирование именованного тома (docker run)
docker run --name my-app -v my-data-volume:/app/data my-imageВ этом примере именованный том my-data-volume монтируется в директорию /app/data внутри контейнера my-app. Любые данные, записанные в эту директорию контейнером, будут сохранены в томе my-data-volume на хост-машине.
Монтирование анонимного тома (docker run)
docker run --name another-app -v /var/lib/mysql my-mysql-imageВ этом примере директория /var/lib/mysql внутри контейнера my-mysql-image монтируется как анонимный том. Docker создаст том без имени для этого монтирования.
Монтирование хост-директории (docker run)
docker run --name web-dev -p 80:80 -v /path/to/my/web:/usr/share/nginx/html:ro nginx:latestВ этом примере локальная директория /path/to/my/web на хост-машине монтируется в директорию /usr/share/nginx/html внутри контейнера nginx. Флаг :ro указывает, что том монтируется в режиме "только для чтения" (read-only) внутри контейнера.
Монтирование томов (docker-compose.yml)
В файле docker-compose.yml вы можете определить тома в секции volumes и затем монтировать их в службы в секции services.
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- web_data:/usr/share/nginx/html
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
MYSQL_DATABASE: mydatabase
volumes:
- db_data:/var/lib/mysql
volumes:
web_data:
db_data:В этом примере определены два именованных тома: web_data и db_data. Том web_data монтируется в службу web в директорию /usr/share/nginx/html, а том db_data монтируется в службу db в директорию /var/lib/mysql.
Вы также можете монтировать хост-директории и анонимные тома в docker-compose.yml:
version: "3.9"
services:
app:
image: my-app:latest
volumes:
- ./app:/app # Монтирование хост-директории
- /data # Анонимный том
volumes:
# Именованные тома определяются здесь (если необходимо)Использование драйверов томов
Docker поддерживает драйверы томов, которые позволяют хранить тома на удаленных хранилищах или использовать специализированные решения для хранения данных. По умолчанию используется локальный драйвер (local). Вы можете указать другой драйвер при создании тома с помощью флага --driver.
docker volume create --driver=rexray/ebs my-ebs-volume # Пример использования драйвера для AWS EBSДоступные драйверы томов могут зависеть от вашей установки Docker и установленных плагинов.
Рекомендации по использованию томов
- Используйте именованные тома для постоянного хранения данных: Они обеспечивают лучший контроль и управление данными.
- Избегайте сохранения важных данных в слое записи контейнера: Данные будут потеряны при удалении контейнера.
- Монтируйте хост-директории с осторожностью, особенно в production: Они могут создавать зависимости от файловой системы хост-машины.
- Используйте тома tmpfs для временных и чувствительных данных: Они обеспечивают высокую производительность и не сохраняются на диск.
- Управляйте жизненным циклом томов: Регулярно проверяйте неиспользуемые тома и удаляйте их при необходимости, чтобы освободить место на хост-машине.
Docker Volumes являются важным инструментом для управления данными в контейнеризированных приложениях. Правильное использование томов обеспечивает сохранность данных, возможность их совместного использования и лучшую производительность ввода-вывода.