Ответ
Docker Volume — это основной механизм для сохранения данных, генерируемых и используемых Docker-контейнерами. Volume управляется самим Docker, хранится на хост-системе в специальной директории (/var/lib/docker/volumes/ на Linux) и существует независимо от жизненного цикла контейнера.
Основное назначение — обеспечить сохранность данных (например, баз данных, логов, загруженных файлов) даже после остановки, удаления или пересоздания контейнера.
Ключевые типы хранения данных в Docker:
-
Volumes (Именованные тома):
- Предпочтительный способ.
- Создаются и управляются командами
docker volume .... - Легко бэкапить, переносить и использовать совместно несколькими контейнерами.
-
Bind Mounts (Привязка директории хоста):
- Прямое монтирование файла или папки с хост-системы в контейнер.
- Полезно для разработки, когда нужно «пробросить» исходный код в контейнер для live-reloading.
- Производительность может быть ниже, чем у volumes.
Пример использования именованного Volume:
# 1. Создать именованный том
docker volume create postgres_data
# 2. Запустить контейнер PostgreSQL и подключить к нему том
# Данные будут сохраняться в 'postgres_data' на хосте
docker run -d
--name my-postgres
-e POSTGRES_PASSWORD=mysecretpassword
-v postgres_data:/var/lib/postgresql/data
postgres:13
# 3. Даже если удалить контейнер, данные останутся в томе
docker rm -f my-postgres
# 4. Можно запустить новый контейнер, подключив тот же том,
# и все данные будут на месте
docker run -d --name new-postgres ... -v postgres_data:/var/lib/postgresql/data postgres:13
Использование Volumes — это best practice для управления состоянием (stateful) приложений в Docker.
Ответ 18+ 🔞
Давай разберёмся с этими вашими Docker Volumes, а то я вижу, тут народ путается, как в тёмном лесу, блядь.
Представь, что контейнер — это твой одноразовый стаканчик. Выпил кофе — выкинул. А данные внутри — это как раз тот самый кофе, ёпта. Так вот, Docker Volume — это, сука, термос! Ты можешь стаканчик выкинуть, но кофе останется в термосе. И когда возьмёшь новый стаканчик — нальёшь из того же термоса. Вот и вся магия, в рот меня чих-пых!
Этот «термос» живёт на твоей основной системе (хосте), в каком-то своём углу, и Docker сам за ним следит. Контейнеры приходят и уходят, а данные — остаются. Идеально для баз данных, логов и прочей важной хуйни, которую терять не хочется.
А какие вообще есть способы сохранить эту самую «жижу»?
-
Volumes (Именованные тома, они же «термосы»).
- Это наш красавец, лучший способ. Создаётся командами
docker volume create. Легко переносить, делиться между контейнерами, делать бэкапы. Docker его хранит в своей служебной папке, типа/var/lib/docker/volumes/. Просто, надёжно, элегантно. Как хороший дорогой термос.
- Это наш красавец, лучший способ. Создаётся командами
-
Bind Mounts (Привязка папки хоста).
- А это уже, блядь, не термос, а просто шланг, воткнутый прямо из твоего домашнего чайника в стаканчик. Ты монтируешь конкретную папку с твоего компа прямо в контейнер. Удобно для разработки: пишешь код на своей машине, а он сразу в контейнере обновляется. Но производительность иногда хромает, да и с безопасностью надо аккуратнее. Не для продакшена, а для быстрых экспериментов.
Ну и как этим пользоваться-то, на практике?
Смотри, вот живой пример, чтобы не быть просто пиздаболом теоретиком:
# 1. Создаём наш «термос» для данных
docker volume create postgres_data
# 2. Запускаем контейнер с PostgreSQL и цепляем к нему этот термос
# Всё, что база наработает в /var/lib/postgresql/data, утечёт в том 'postgres_data'
docker run -d
--name my-postgres
-e POSTGRES_PASSWORD=mysecretpassword
-v postgres_data:/var/lib/postgresql/data
postgres:13
# 3. Допустим, контейнер сдох, или ты его в сердцах удалил
docker rm -f my-postgres
# 4. И что? А ничего! Запускаешь нового постгреса, цепляешь ТОТ ЖЕ САМЫЙ том,
# и он, сука, как ни в чём не бывало, поднимет все твои старые таблицы и данные!
docker run -d --name new-postgres ... -v postgres_data:/var/lib/postgresql/data postgres:13
Вот и весь фокус. Если у тебя приложение с состоянием (stateful) — база, файловое хранилище — то Volumes это твой must have, ебать его в сраку. Не изобретай велосипед, используй то, что уже придумали и отладили умные люди.