Зачем это
Одна команда запуска хороша для одного контейнера. Но настоящий проект — это минимум приложение и база, а часто ещё хранилище для кэша и вспомогательные службы.
Запускать их по одной, помня все флаги и порядок, неудобно. Файл описания решает это: все службы перечислены в одном месте, запуск одной командой.
Побочная польза: этот файл — готовая инструкция по запуску проекта. Человек, открывший ваш репозиторий, видит устройство сразу.
Минимальный файл
Файл описания служб в корне проекта:
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: notes
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
app:
build: .
depends_on:
- db
environment:
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/notes
ports:
- "8000:8000"
volumes:
pgdata:
Что здесь важно
Обращение по имени службы. Приложение подключается к базе по адресу «db», а не по числовому адресу. Внутри общей сети контейнеры находят друг друга по именам — это самое неочевидное для новичков.
Постоянное хранилище. Раздел с томами нужен, чтобы данные базы пережили пересоздание контейнера. Без него всё исчезает при остановке — классическая потеря учебных данных.
Пароли из окружения. Значения берутся из файла с переменными, который не попадает в репозиторий. В самом описании паролей быть не должно.
Зависимость запуска. Указание, что приложение стартует после базы. Оговорка: это гарантирует порядок запуска, но не готовность базы принимать подключения. Для учебного проекта достаточно, для боевого нужна проверка готовности.
Команды
Запустить всё:
docker compose up
В фоне:
docker compose up -d
Пересобрать образ приложения:
docker compose up --build
Посмотреть журналы:
docker compose logs -f app
Остановить:
docker compose down
Остановить и удалить данные:
docker compose down -v
Последняя команда стирает хранилище. Удобно, когда хотите начать с чистой базы, и опасно, когда не хотите.
Частые ошибки
Пароль прямо в файле описания. Файл лежит в репозитории — значит, пароль раскрыт.
Забыли постоянное хранилище. Перезапустили — данные пропали.
Порт занят. Если на машине уже стоит база, стандартный порт занят. Пробросьте другой снаружи.
Приложение не видит базу. Почти всегда причина в том, что в строке подключения указан локальный адрес вместо имени службы.
Что это даёт в портфолио
Проект, который запускается одной командой, приятно открывать. Это показывает, что вы думали не только о коде, но и о том, как этим пользоваться.
Плюс в командной работе такой файл экономит часы: новый участник не тратит день на настройку окружения, а запускает всё одной командой и начинает работать.
Хватит читать — пора делать
На CohortX можно найти команду под пет-проект и получить тот самый опыт, о котором спрашивают на собеседовании.
Похожие статьи
- Running an app and a database together: meeting ComposeHow to describe several services in one file, start everything with one command, and keep passwords out of the code.
- Docker for beginners: what it's forWhat a container is in plain terms, which problem it solves, the first commands, and a minimal build file.
- Docker для начинающих: зачем он нуженЧто такое контейнер простыми словами, какую проблему решает, первые команды и минимальный файл описания.