Что такое Docker Volume и для чего он используется

Ответ

Docker Volume — это основной механизм для сохранения данных, генерируемых и используемых Docker-контейнерами. Volume управляется самим Docker, хранится на хост-системе в специальной директории (/var/lib/docker/volumes/ на Linux) и существует независимо от жизненного цикла контейнера.

Основное назначение — обеспечить сохранность данных (например, баз данных, логов, загруженных файлов) даже после остановки, удаления или пересоздания контейнера.

Ключевые типы хранения данных в Docker:

  1. Volumes (Именованные тома):

    • Предпочтительный способ.
    • Создаются и управляются командами docker volume ....
    • Легко бэкапить, переносить и использовать совместно несколькими контейнерами.
  2. 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 сам за ним следит. Контейнеры приходят и уходят, а данные — остаются. Идеально для баз данных, логов и прочей важной хуйни, которую терять не хочется.

А какие вообще есть способы сохранить эту самую «жижу»?

  1. Volumes (Именованные тома, они же «термосы»).

    • Это наш красавец, лучший способ. Создаётся командами docker volume create. Легко переносить, делиться между контейнерами, делать бэкапы. Docker его хранит в своей служебной папке, типа /var/lib/docker/volumes/. Просто, надёжно, элегантно. Как хороший дорогой термос.
  2. 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, ебать его в сраку. Не изобретай велосипед, используй то, что уже придумали и отладили умные люди.