Перейти к содержанию

Docker Compose на домашнем сервере: первый сервис

Опишите сервис и его данные в compose.yaml. Проверьте, что файл переживает пересоздание контейнера, а его копия открывается в отдельном проекте.

Обновлено Редакция GAW

Compose описывает контейнер, порт и том в одном файле. Ниже минимальный HTTP-сервис для тестовой Linux VM с Docker Engine 28 или новее, плагином docker compose, Bash и curl. Пример проверен на уровне конфигурации в Compose v5.6.1. Команды выполняются в каталоге с compose.yaml.

Коротко

  • Порт 8080 опубликован на loopback хоста.
  • Имя проекта отделяет рабочий том от тестового.
  • Копия тома хранится отдельно от конфигурации контейнера.
  • Образ и данные при откате проверяют вместе.
Путь запроса и данных в примере ComposeКлиент на хосте → Порт 8080 → Контейнер web → Том siteКлиент на хостеПорт 8080Контейнер webТом site
HTTP-сервис читает файл из именованного тома site.

Первый запуск

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. В этом примере сервис проверяют с самого хоста.

Достаточно ли вернуть старый образ для отката?

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

Источники

  1. Docker. Use Compose in production
  2. Docker. Volumes — Жизненный цикл, копирование и восстановление тома
  3. Docker. compose config
  4. Docker. compose run
  5. Docker. Port publishing
  6. BusyBox Official Image — Тестовый образ busybox:1.37.0
Страница помогла?

Нашли ошибку? ·