Именованные тома

Сохраняем данные между перезапусками контейнера с помощью именованных томов.

Именованный том (named volume) — управляемое Docker хранилище данных с собственным именем, живущее независимо от контейнеров.

Что такое том

Том — это место для данных, которым управляет сам Docker. Он лежит в служебной области Docker, не привязан к конкретному контейнеру и не исчезает при docker rm. Тома — рекомендованный способ хранить данные баз и других stateful-сервисов.

Управление томами

Создать том можно явно или дать Docker создать его автоматически при первом использовании:

# Создать том
docker volume create pgdata

# Список томов
docker volume ls

# Подробности о томе
docker volume inspect pgdata

Подключение тома: флаг -v

Том подключают к контейнеру флагом -v ИМЯ_ТОМА:ПУТЬ_В_КОНТЕЙНЕРЕ. PostgreSQL хранит данные в /var/lib/postgresql/data — туда и смонтируем том:

docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

Теперь все данные базы пишутся в том pgdata, а не в эфемерный слой контейнера.

Проверка: данные переживают пересоздание

# Удаляем контейнер — том остаётся
docker rm -f db

# Запускаем новый контейнер с тем же томом
docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

Новый контейнер увидит все прежние таблицы и записи — данные жили в томе и пережили пересоздание контейнера. Это и есть правильный способ запускать базы в Docker.

Удаление томов

Том нужно удалять осознанно — данные в нём не исчезают сами:

# Удалить конкретный том
docker volume rm pgdata

# Удалить все неиспользуемые тома
docker volume prune

Итог

  • Именованный том — управляемое Docker хранилище, не зависящее от жизни контейнера.
  • Подключается флагом -v ИМЯ:ПУТЬ; данные переживают пересоздание контейнера.
  • Тома — рекомендованный способ хранить данные баз вроде PostgreSQL.
Проверьте себя
1. Как подключить именованный том pgdata к папке /var/lib/postgresql/data?
A-p pgdata:/var/lib/postgresql/data
B-v pgdata:/var/lib/postgresql/data
C-e pgdata=/var/lib/postgresql/data
D--volume-from pgdata
2. Что произойдёт с данными в томе после удаления контейнера?
AОни удалятся вместе с контейнером
BОни сохранятся, том живёт независимо от контейнера
CОни станут доступны только для чтения
DОни переедут в образ
3. Почему тома — рекомендованный способ хранения данных баз?
AОни работают быстрее оперативной памяти
BОни управляются Docker, переживают пересоздание контейнера и не теряют данные
CОни автоматически шифруют данные
DОни бесплатны, в отличие от bind mounts
Поддержать проект