Введение
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. Один успешный статус не доказывает правильное содержимое и сохранность записей.
Том защищает от этой замены контейнера. Это не независимая резервная копия и не защита от удаления тома или потери хоста. Делайте файлы приложения воспроизводимыми, а данные посетителей храните отдельно.
Резюме
Вы отличили одноразовые файлы контейнера от постоянных данных посетителей, подключили существующий именованный том и сохранили исходные и новые сообщения при замене. Новая запись и страницы выставки продолжают работать. Далее примените тот же метод к подписям и отдельно хранящимся фотографиям.



