Docker Compose на домашнем сервере: первый сервис
Опишите сервис и его данные в compose.yaml. Проверьте, что файл переживает пересоздание контейнера, а его копия открывается в отдельном проекте.
Обновлено Редакция GAW
Compose описывает контейнер, порт и том в одном файле. Ниже минимальный HTTP-сервис для тестовой Linux VM с Docker Engine 28 или новее, плагином docker compose, Bash и curl. Пример проверен на уровне конфигурации в Compose v5.6.1. Команды выполняются в каталоге с compose.yaml.
Коротко
- Порт 8080 опубликован на loopback хоста.
- Имя проекта отделяет рабочий том от тестового.
- Копия тома хранится отдельно от конфигурации контейнера.
- Образ и данные при откате проверяют вместе.
Первый запуск
services:
web:
image: ${BUSYBOX_IMAGE:-busybox:1.37.0}
command: ["httpd", "-f", "-p", "8080", "-h", "/site"]
ports:
- "127.0.0.1:${WEB_PORT:-8080}:8080"
volumes:
- site:/site
volumes:
site:
docker compose version
docker compose -p compose-lab config --quiet
docker compose -p compose-lab run --rm --no-deps web \
sh -c 'printf "%s\n" "compose lab" > /site/index.html'
docker compose -p compose-lab up -d
docker compose -p compose-lab ps
curl -fsS http://127.0.0.1:8080/
Ожидаемый ответ — compose lab. Если первый запрос пришёл до готовности сервиса, повторите его после проверки docker compose -p compose-lab logs web. Если порт занят, задайте свободный WEB_PORT и меняйте адрес curl соответственно. Используйте команду записи только в пустом учебном проекте, поскольку она заменяет index.html.
| Что сохранять | Зачем |
|---|---|
compose.yaml и настройки окружения | Воссоздать порты, образ и точки монтирования |
| Имя проекта и использованный образ | Подключить ожидаемый том и воспроизвести версию |
Данные тома site | Вернуть пользовательское содержимое |
Копия и проверка в новом томе
В учебном сервисе файл статический. Перед копированием прекратите запись в том. Для базы данных используйте согласованную выгрузку средствами базы или остановку приложения по процедуре производителя.
mkdir -p ../compose-lab-backup
archive=../compose-lab-backup/site.tar.gz
(set -C; docker compose -p compose-lab run --rm --no-deps -T web \
tar -czf - -C /site . > "$archive")
tar -tzf "$archive"
Продолжайте после успешного создания архива и проверки, что в списке есть ./index.html. Скопируйте архив и конфигурацию на независимое хранилище. Для репетиции возьмите копию архива и выберите новое имя проекта, если compose-restore уже используется. В свежем проекте Compose создаст отдельный том.
docker compose -p compose-restore run --rm --no-deps -T web \
tar -xzf - -C /site < "$archive"
WEB_PORT=18080 docker compose -p compose-restore up -d
curl -fsS http://127.0.0.1:18080/
Ожидается тот же ответ. На 8080 остаётся исходный сервис, на 18080 работает восстановленный экземпляр. После проверки остановите тестовый проект командой WEB_PORT=18080 docker compose -p compose-restore down. Флаг -v удаляет именованные тома проекта и здесь не требуется.
Обновление и откат
Сохраните конфигурацию, прежнюю ссылку на образ и проверенную копию данных. Для воспроизводимого отката запишите digest образа, поскольку владелец реестра может переназначить тег. Задайте новую проверенную ссылку в BUSYBOX_IMAGE, затем выполните docker compose -p compose-lab pull web и docker compose -p compose-lab up -d web в том же окружении. Проверьте HTTP-ответ и логи. Для отката верните прежнюю конфигурацию и ссылку на образ, повторите запуск и проверку. Если приложение уже мигрировало данные, сначала проверьте совместимость или восстановите копию в отдельный том.
Частые вопросы
Где остаются файлы после пересоздания контейнера?
В именованном томе проекта. При том же имени проекта и объявлении тома новый контейнер монтирует его снова.
Почему порт 8080 недоступен с другого компьютера?
Проброс привязан к 127.0.0.1. В этом примере сервис проверяют с самого хоста.
Достаточно ли вернуть старый образ для отката?
Для статического файла обычно достаточно старого образа и конфигурации. После миграции базы может понадобиться согласованная копия данных от старой версии.
Источники
- Docker. Use Compose in production
- Docker. Volumes — Жизненный цикл, копирование и восстановление тома
- Docker. compose config
- Docker. compose run
- Docker. Port publishing
- BusyBox Official Image — Тестовый образ busybox:1.37.0
Нашли ошибку? ·