У запуска базы несколько настроек: образ, пароль, каталог данных, сеть. Docker Compose хранит их в YAML-файле. Это позволяет повторить окружение одной командой и увидеть настройки целиком перед запуском.
Описываем сервис и том
Создайте compose.yaml в отдельной папке. В учебном терминале он уже подготовлен:
services:
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: study-only-password
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:services содержит программы окружения. Здесь одна программа с именем db. image выбирает её образ, environment передаёт пароль для создания пустой базы, volumes подключает именованный том. Нижний блок объявляет том проекта. Учебный пароль в примере нужен только для локального опыта; реальные доступы в репозиторий не помещают.
docker compose -p demo-store config
docker compose -p demo-store up -d
docker compose -p demo-store psconfig проверяет и показывает итоговое описание. up -d создаёт окружение и запускает службы в фоне. -p задаёт имя проекта, группы ресурсов Compose. Имя контейнера будет demo-store-db-1, тома — demo-store_dbdata, сети — demo-store_default. Команды docker compose exec db ... обращаются к сервису по имени из YAML.
Если файл называется иначе или находится в другой папке, его задают через -f /путь/compose.yaml. Настройки проектов с разными именами независимы. Так можно держать несколько учебных баз, не смешивая их тома.
Проверяем готовность и выполняем запрос
docker compose -p demo-store logs db
docker compose -p demo-store exec db pg_isready -U postgres
docker compose -p demo-store exec db psql -U postgres -c "SELECT 1;"PostgreSQL сначала инициализирует пустой каталог данных, затем начинает принимать подключения. Если pg_isready ещё сообщает о неготовности, подождите и повторите проверку. Запрос вернёт одну строку со значением 1.
В этом файле внешний порт не опубликован: запрос выполняется внутри сервиса. Для SQL-клиента на компьютере добавляют к db блок ports со строкой "127.0.0.1:15432:5432". Другим сервисам того же проекта нужен адрес db:5432.
Для приложения, зависящего от базы, можно определить healthcheck и depends_on с условием service_healthy. Это задаёт ожидание готовности при старте. Самому приложению всё равно нужна обработка потери подключения во время работы.
Три способа закончить опыт
docker compose -p demo-store stop остановит процессы и сохранит контейнеры. down удалит контейнеры и сеть проекта, оставив именованный том. Следующий up -d создаст новые экземпляры и подключит прежние данные.
docker compose -p demo-store down
docker volume ls
docker compose -p demo-store up -dВариант down -v удаляет и объявленные именованные тома проекта. Он подходит для намеренного сброса лаборатории. Перед этой командой проверьте имя проекта и убедитесь, что его данные больше не нужны.
Пароль POSTGRES_PASSWORD применяется при инициализации пустого каталога. Когда подключён прежний том, изменение этой строки YAML не меняет существующий пароль PostgreSQL: его меняют средствами самой базы.
Попробуйте в учебном терминале
Рабочая папка содержит compose.yaml. Проекты archive и scratch уже запущены; в томе archive_dbdata есть файл marker.txt. Запустите новый store, завершите archive с сохранением данных и отдельно сбросьте scratch.
Здесь команды Docker имитируются: терминал хранит учебное состояние образов, контейнеров и файлов. Реальные службы и внешнюю сеть он не запускает.
- 1. Проверьте compose.yaml и запустите проект store в фоне.
- 2. Остановите и удалите окружение archive, сохранив том archive_dbdata с marker.txt.
- 3. Полностью сбросьте только scratch: удалите контейнер и том scratch_dbdata.