Выделите гостевой книге постоянное хранилище

DockerBeginner
Практиковаться сейчас

Введение

Afterlight — небольшая общественная выставка. Посетители оставляют впечатления в гостевой книге; замена приложения не должна стирать их записи. Сначала вы попробуете одноразовую копию, затем подключите существующие данные настоящей книги и сохраните новые сообщения при замене приложения.

Достаточно базового знакомства с терминалом. Docker, Compose, пути данных, редактирование и HTTP объясняются по мере необходимости. Приложение и инструменты подготовлены; код базы данных писать не нужно. Все сведения о посетителях вымышлены.

Используйте Workstation для команд, Exhibition для настоящей книги и Practice Copy только для намеренного опыта потери данных. У сайтов разные контейнеры и порты. Каждый модуль начинается независимо; сайт, названия элементов и вывод остаются английскими.

Выделите данным посетителей собственное хранилище

На этом шаге вы попробуете выставку, увидите потерю одноразовых данных и подключите настоящую книгу к существующим записям. Начните с Practice Copy — отдельной, намеренно одноразовой выставки без настоящих посетителей.

Пройдите обычный путь посетителя

Откройте About the exhibition, прочитайте часы работы и выберите The wall. Выберите Leave a contribution, введите Visitor в Your name и A small practice note. в Your message, затем нажмите Add to the wall. Страница подробностей покажет запись. Выберите Back to the wall, чтобы увидеть карточку. Подробности и форма — нормальные функции, которые требуется сохранить.

Узнайте, чего контейнер не сохраняет

Переключитесь в Workstation. Начальный каталог — /home/labex/project/afterlight. Путь обозначает файл или каталог; этот абсолютный путь начинается от корня файловой системы /. pwd выводит текущий каталог:

pwd

Docker запускает приложение в контейнере — процессе с собственным представлением файловой системы. Образ — подготовленный пакет приложения. afterlight:1 содержит программу и оформление, но не более поздние записи посетителей. Данные, записанные только в изменяемый слой контейнера, исчезнут при его удалении.

Удалите только одноразовый учебный контейнер. docker rm удаляет его; при необходимости -f сначала останавливает:

docker rm -f afterlight-scratch

docker run создаёт новый контейнер из сохранённого образа. -d оставляет его в фоне, --name задаёт имя. Порт обозначает сетевой сервис: -p 8082:8081 перенаправляет порт 8082 лабораторной среды на порт приложения 8081 в контейнере.

docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1

Длинная строка — ID нового контейнера. В Practice Copy выберите The wall и обновите страницу. Учебная карточка исчезла. Не обновляйте бесконечно её прежний URL подробностей: этой записи больше нет. Потеря затронула только одноразовую копию.

Подключите существующие данные книги

Переключитесь в Exhibition. Пустая стена использует то же приложение, но сейчас не подключена к данным. Исходная запись Iris сохранена в подготовленном томе Docker afterlight_messages. Ваша основная задача — снова подключить эти данные и сохранять дальнейшие записи при замене приложения.

Именованный том — управляемое Docker хранилище вне отдельного контейнера. Монтирование подключает его к пути внутри приложения. Здесь SQLite сохраняет базу в /data/wall.sqlite3. SQLite хранит записи в файле; SQL и программирование приложения не требуются.

Переключитесь в Workstation. cat показывает файл:

cat compose.yaml

Compose читает эту конфигурацию YAML для создания сервиса. YAML выражает вложенность отступами из пробелов. services объединяет приложения, wall — этот сервис. image, container_name и ports описывают пакет, имя и соответствие сетевых портов. environment передаёт настройки приложения. RELEASE выбирает вариант представления; обе редакции используют одинаковый формат данных.

Вы добавите монтирование и объявление тома. messages:/data подключает логический том messages к каталогу контейнера /data; объявление верхнего уровня задаёт существующее имя Docker afterlight_messages. external: true требует от Compose повторно использовать подготовленный том, а не создавать новый. Неверное имя вызывает ошибку отсутствующего тома: исправьте имя, не удаляя исходный том и не создавая пустую замену. Объявление хранилища без подключения к сервису не защищает данные.

cat > compose.yaml заменяет конфигурацию. YAML в кавычках начинает here-document: вставьте весь блок, включая завершающий YAML на отдельной строке. Кавычки сохраняют буквальное содержимое; оставьте пробелы как в примере.

cat > compose.yaml <<'YAML'
name: afterlight
services:
  wall:
    image: afterlight:1
    container_name: afterlight-wall
    ports:
      - "8081:8081"
    environment:
      MODE: guestbook
      RELEASE: "1"
    volumes:
      - messages:/data
volumes:
  messages:
    name: afterlight_messages
    external: true
YAML

docker compose config -q проверяет конфигурацию без вывода при успехе. Отсутствие вывода означает успешный разбор; при ошибке исправьте отступы или написание и повторите проверку до применения.

docker compose config -q

docker compose up -d создаёт или заменяет сервис в фоне согласно файлу. Именованные тома сохраняются. Дождитесь завершения:

docker compose up -d

В Exhibition вернитесь к The wall и обновите страницу. Должна появиться запись Iris A beautiful place to pause.. Откройте карточку Iris и вернитесь. Это существующая запись из настоящей базы, а не пример, заново создаваемый при каждом запуске.

Добавьте запись и определите её хранилище

На этом шаге вы добавите настоящую запись и сопоставите результат на странице с реальным монтированием. Начните в Exhibition. Сохраните исходную карточку Iris.

Выберите Leave a contribution. Введите Mira в Your name и точно The light stays with us. в Your message, затем Add to the wall. Подробности должны показывать оба значения. Выберите Back to the wall: Iris и Mira должны присутствовать.

Переключитесь в Workstation. docker inspect читает действительную конфигурацию контейнера. --format выбирает поле; одинарные кавычки передают фигурные скобки буквально. Этот шаблон выводит список монтирований как JSON:

docker inspect afterlight-wall --format '{{json .Mounts}}'

Найдите "Type":"volume", "Name":"afterlight_messages", "Destination":"/data" и "RW":true. RW означает разрешение чтения и записи. Имя в конфигурационном файле — лишь намерение; здесь видно реальное подключение работающего контейнера.

docker volume ls перечисляет доступные тома:

docker volume ls

Могут присутствовать другие тома платформы; не трогайте их. При опечатке в имени внешнего тома Compose останавливается с ошибкой отсутствующего тома. Исправьте имя в файле и примените снова; не создавайте пустую замену. Если случайно подключён новый пустой том, пустая стена ещё не доказывает удаление исходных записей. Сохраните исходный том, восстановите имя afterlight_messages в compose.yaml, проверьте и примените снова. Не удаляйте тома ради быстрого исправления. docker compose down -v удаляет управляемые Compose тома вместе с данными, но сохраняет объявленные external: true. Это не делает ручное удаление внешнего тома безопасным.

Учитывайте все типы данных

Одна запись может зависеть от нескольких каталогов. Эта книга сохраняет текст в /data. Фотостена также хранит байты загруженных изображений в /photos; база содержит подпись и имя связанного файла. Если сохранить только подпись, изображение может оказаться недоступным.

Путь контейнера Содержимое Сохранять при замене?
/data Записи посетителей и связи фотографий с подписями Да
/photos у фотостены Загруженные фотографии Да, отдельно от базы
/app Подготовленные программа, оформление и учебные изображения в образе Воссоздаются из предоставленного образа

Для нескольких каталогов применяется тот же синтаксис: по одному элементу списка монтирований сервиса и объявлению тома на каталог. Не монтируйте пустой том поверх /app: он скроет программу. Файлы кэша или самого образа не становятся автоматически данными посетителей.

Самостоятельная задача использует форму загрузки фотографий. Ссылки River и Garden скачивают подготовленные учебные PNG на ваш компьютер. Сохраните нужное изображение, выберите его в Photograph (PNG), заполните имя и подпись и нажмите Add to the wall. Браузер отправит выбранные байты; инструмент загрузки из командной строки не нужен.

Замените приложение, сохранив работу выставки

На этом шаге вы замените приложение редакцией 2, сохраните обе записи и примете новую. Начните в Workstation.

nano — текстовый редактор в терминале. Откройте конфигурацию:

nano compose.yaml

Клавишами со стрелками измените только RELEASE: "1" на RELEASE: "2". Сохраните монтирования, образ и порты. Сохраните файл через Ctrl+O, Enter, выйдите через Ctrl+X. Прочитайте и проверьте сохранённую конфигурацию:

cat compose.yaml
docker compose config -q

docker compose ps -q wall показывает текущий ID контейнера. Запомните его или сохраните вывод для сравнения; отчёт не требуется:

docker compose ps -q wall

Примените смену редакции. --force-recreate запрашивает новый контейнер, даже если остальная конфигурация не изменилась:

docker compose up -d --force-recreate
docker compose ps -q wall

ID должен отличаться. Это замена, а не обычный перезапуск. При ошибке запуска docker compose logs wall покажет сообщения приложения. Исправьте конфигурацию, проверьте и повторите up -d. Сохраните исходные тома и не удаляйте другие контейнеры.

В Exhibition выберите The wall и обновите страницу. Внизу должно быть Edition 2. Iris и Mira должны остаться. Откройте каждую карточку и вернитесь. Введите Leon и точно Back for another look. в форму и отправьте. Вернувшись к стене, вы увидите три работающие записи в новом приложении.

Проверяйте не только данные, но и сервис

Переключитесь в Workstation. HTTP — протокол запросов и ответов браузера. Статус 200 означает успешный ответ; 404 — отсутствие запрошенного ресурса. Ошибка соединения означает, что ответ сервера не был получен.

curl отправляет запрос. -sS скрывает прогресс, но показывает ошибки соединения; -o /dev/null отбрасывает тело ответа. -w выводит формат в кавычках: %{http_code} — статус, \n завершает строку. В Workstation адрес 127.0.0.1 означает эту среду, порт 8081 — Exhibition. Выполните:

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about

Ожидается 200. В Exhibition откройте About the exhibition, убедитесь, что часы работы отображаются, и выберите The wall. Один успешный статус не доказывает правильное содержимое и сохранность записей.

Том защищает от этой замены контейнера. Это не независимая резервная копия и не защита от удаления тома или потери хоста. Делайте файлы приложения воспроизводимыми, а данные посетителей храните отдельно.

Резюме

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