docker-compose: поднимаем backend + db + frontend
docker-compose: поднимаем backend + db + frontend
docker-compose - это дирижёр. Он поднимает несколько сервисов одним файлом.
Пример compose
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- dbdata:/var/lib/postgresql/data
backend:
build: ./backend
depends_on:
- db
environment:
DATABASE_URL: postgres://postgres:postgres@db:5432/myapp?sslmode=disable
ports:
- "8080:8080"
frontend:
build: ./frontend
ports:
- "8081:80"
volumes:
dbdata: {}
Запуск:
docker compose up -d --build
docker compose ps
docker compose logs -f backend
depends_on и healthcheck
depends_on гарантирует порядок запуска, но не то, что сервис готов. PostgreSQL может стартовать, но ещё не принимать соединения.
services:
db:
image: postgres:16-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
backend:
build: ./backend
depends_on:
db:
condition: service_healthy
Полезные команды compose
docker compose up -d --build # поднять с пересборкой
docker compose down # остановить и удалить контейнеры
docker compose down -v # + удалить volumes (осторожно!)
docker compose ps # статус сервисов
docker compose logs -f backend # логи конкретного сервиса
docker compose exec db psql -U postgres # зайти в БД
docker compose restart backend # перезапустить один сервис
Мини-задание
- Создай
docker-compose.ymlсdb(postgres) иbackend(любой HTTP-сервер) - Добавь healthcheck для postgres (
pg_isready) - Убедись, что backend стартует только после готовности БД
- Проверь через
docker compose ps- оба сервисаhealthy/running
Итог
- Compose поднимает несколько сервисов одним файлом. Сервисы видят друг друга по имени.
depends_on+condition: service_healthy- правильный способ управлять порядком запуска.docker compose down -vудаляет данные - используй осознанно.
Типичная ошибка
Забывать depends_on с healthcheck и получать «connection refused» при старте backend. Или использовать docker compose down -v и удалять данные БД, которые нужны.
Мини-практика (10-15 минут)
Создай compose-файл с тремя сервисами: db (postgres), adminer (веб-интерфейс для БД, образ adminer, порт 8081:8080) и backend (nginx:alpine на порту 8080:80). Подними всё через docker compose up -d. Открой localhost:8081 - увидишь Adminer. Подключись к базе (хост: db, порт 5432). Посмотри логи каждого сервиса. Потом docker compose down.