ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Volumes: данные переживают удаление контейнера

Автор: · Обновлено

Контейнер можно пересоздать из образа, но пользовательские данные нельзя получить повторной сборкой. В этом уроке вы сохраните маленький файл вне записываемого слоя контейнера,…

Контейнер можно пересоздать из образа, но пользовательские данные нельзя получить повторной сборкой. В этом уроке вы сохраните маленький файл вне записываемого слоя контейнера, удалите контейнер и прочитаете файл из нового. Так становится видна разница между временем жизни процесса и временем жизни хранилища.

Три разных объекта

Образ задаёт исходное содержимое файловой системы. У каждого созданного контейнера появляется свой записываемый слой. Named volume — отдельный объект Docker с именем; mount подключает его к абсолютному пути внутри контейнера. Поэтому одинаковый путь /data у двух контейнеров не означает общие данные: важен подключённый источник. Жизненный цикл volume.

Запись --volume имя:/data, сокращённо -v имя:/data, выбирает именованный том. Запись -v /data создаёт анонимный том. Параметр относится к docker run, а не к глобальным настройкам команды docker. В поисковом запросе «docker --volume» обычно имеется в виду именно подключение при запуске.

Эксперимент с двумя контейнерами

Выполняйте в Bash с доступным Docker Engine. Имена yk-volume-demo и yk-volume-writer зарезервируйте только для этого опыта. Если такие объекты уже существуют, выберите другие имена, чтобы не принять старый файл за результат нового запуска.

docker volume create --label lesson=yk-volume-demo yk-volume-demo
docker run --name yk-volume-writer --mount type=volume,src=yk-volume-demo,dst=/data alpine:3.22 sh -c 'printf "first record\n" > /data/record.txt'
docker rm yk-volume-writer
docker run --rm --mount type=volume,src=yk-volume-demo,dst=/data,readonly alpine:3.22 cat /data/record.txt

Последняя команда печатает first record. Первого контейнера больше нет, однако файл доступен второму. Попробуйте вместо /data/record.txt записать /tmp/record.txt: без отдельного mount этот файл исчезнет вместе с первым контейнером. Именно эту разницу стоит проверить до переноса базы данных в контейнер.

Посмотреть существующие тома

Правильная команда списка — docker volume ls; у неё есть алиас docker volume list. Формулировка «docker volumes list» не соответствует группе команд CLI. Фильтр по метке делает учебный объект заметным среди чужих томов.

docker volume ls --filter label=lesson=yk-volume-demo
docker volume inspect yk-volume-demo
docker ps -a --filter volume=yk-volume-demo

inspect показывает драйвер и mountpoint на стороне Docker daemon. В Docker Desktop это путь внутри управляемой Linux VM, а не обещание существования такой папки в файловой системе Windows. Не редактируйте содержимое внутреннего каталога Docker вручную: для чтения подключите том к диагностическому контейнеру. Справка списка и фильтров.

Что такое volumes в Compose

Сохраните следующий пример отдельно от рабочего проекта. Верхний volumes объявляет ресурс, а services.writer.volumes подключает его к конкретному контейнеру. Один и тот же YAML-ключ имеет разные роли на разных уровнях.

name: yk-volume-compose
services:
  writer:
    image: alpine:3.22
    command: ["sh", "-c", "date -u >> /data/visits.txt; cat /data/visits.txt"]
    volumes:
      - records:/data
volumes:
  records:

Запустите docker compose run --rm writer два раза: во второй раз файл содержит две записи. Обычно Compose включает имя проекта в имя реального тома, поэтому его переименование может создать другое пустое хранилище. Если приложение внезапно «потеряло» записи, сначала сравните имя проекта и Mounts, а не создавайте новую базу поверх старой.

Явное name у тома или external: true полезно для заранее созданного ресурса. Но фиксированное имя снимает изоляцию по проекту: два стенда могут случайно открыть одни данные. Разобраться с этим до запуска помогают правила Compose volumes.

Закрепление

Подключите yk-volume-demo к читателю с readonly и попытайтесь добавить строку: запись должна завершиться ошибкой, чтение — работать. Затем объясните, какой объект надо сохранить для следующего запуска приложения. После опыта удалите только учебный том командой docker volume rm yk-volume-demo; для Compose сначала выполните docker compose down, а его том удаляйте отдельно после проверки имени. Удаление данных — самостоятельное действие, не обязательная часть остановки приложения.

Источники