БэкендDevOpsPythonSQLДругой язык

Docker Compose для новичка: запускаем Python API и PostgreSQL одной командой

Запускаем Python API и PostgreSQL через Docker Compose одной командой: сервисы, environment, healthcheck, volume, миграция и проверка сохранения данных.

Кодик

Автор

6 мин чтения

Docker Compose можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Compose описывает API, базу, сеть и volume одним файлом, чтобы проект повторялся на другом компьютере без ручной установки PostgreSQL. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

depends_on не гарантирует готовность базы, localhost внутри контейнера указывает на сам контейнер, а без volume данные исчезают при пересоздании. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте два сервиса с healthcheck и постоянным volume, где FastAPI записывает заметку в PostgreSQL. Проверка: docker compose up запускает оба сервиса, healthcheck проходит, запись остаётся после перезапуска контейнеров.

1Соберите минимум

описать сборку API и образ postgres. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

API видит PostgreSQL по имени сервиса. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте миграцию и резервную копию одной командой compose. Так копирование станет практикой.

Как устроен учебный проект Docker Compose

Docker Compose разделяет подготовку, основное действие, проверку ответа и сохранение результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Образыописать сборку API и образ postgresоба контейнера создаются
Сетьиспользовать hostname db в DATABASE_URLAPI видит PostgreSQL по имени сервиса
Готовностьдобавить healthcheck и conditionAPI стартует после healthy
Данныеподключить named volumeстроки сохраняются после restart

Контрольные точки: образы, сеть, готовность и данные. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте Docker Compose
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Выполните docker compose config до запуска. Команда покажет итоговую конфигурацию и ошибки YAML. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Материал сверялся с официальной документацией сервиса 21 октября 2026 года. Создайте compose.yaml, Dockerfile и минимальный app.py. Пароли для локального примера вынесите в .env, а этот файл добавьте в .gitignore. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

services:
  api:
    build: .
    ports:
      - "8000:8000"
    environment:
      DATABASE_URL: postgresql://codik:codik@db:5432/codik
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:17-alpine
    environment:
      POSTGRES_USER: codik
      POSTGRES_PASSWORD: codik
      POSTGRES_DB: codik
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U codik -d codik"]
      interval: 5s
      timeout: 3s
      retries: 10
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:
Что должно произойти после запуска
  • docker compose ps показывает api Up и db Up (healthy).
  • После docker compose restart ранее добавленная запись остаётся в базе.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

Код держит подготовку отдельно от внешнего действия, поэтому ошибку можно найти на конкретном шаге. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант Docker Compose
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Compose создаёт общую сеть, где имя сервиса db работает как DNS. Healthcheck показывает готовность PostgreSQL, named volume хранит каталог данных вне жизненного цикла контейнера. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Секреты и персональные данные не должны попадать в репозиторий, журнал или публичный скриншот.

ЧастьЗа что отвечаетЧто проверить
api serviceсобирает Python-приложение и публикует портвнутри обращается к db
db serviceзапускает PostgreSQL и healthcheckстатус healthy
volumeсохраняет каталог данныхrestart не удаляет строки

Порт 5432 не нужно публиковать на хост, если к базе обращается только API. Меньше открытых портов означает меньше случайных подключений и конфликтов. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Остановите проект через docker compose down и снова up. Затем отдельно попробуйте down -v только в учебном окружении и увидьте разницу. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Добавьте endpoint /notes, миграцию таблицы и команду backup, которая пишет дамп в отдельный каталог. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: docker compose up запускает оба сервиса, healthcheck проходит, запись остаётся после перезапуска контейнеров.
  2. Измените правило: добавьте миграцию и резервную копию одной командой compose. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • оба контейнера создаются
  • API видит PostgreSQL по имени сервиса
  • API стартует после healthy
  • строки сохраняются после restart

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

Четыре контрольные точки Docker Compose
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Для production замените учебные пароли, задайте ограничения ресурсов, стратегию миграций и внешнее резервное копирование. Для закрепления откройте в API на FastAPI, в GitHub Actions для Python и в основах SQL ORDER BY.

Как изучить тему в Кодике

Сначала разберите входные данные и один успешный вызов, затем изучайте дополнительные параметры. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваHTTP API, строки подключения и SQLОбъясните вход и выход функции.
2. ИнструментImage, container, service, network и volumeПовторите команду по памяти.
3. ПроектHealthcheck и запуск двух сервисовПроверьте два сценария.
4. РефакторингМиграции, секреты, backup и production-ограниченияРазделите ввод, логику и вывод.

Перепишите ключевую функцию по памяти и проверьте её на корректном, пустом и ошибочном вводе. Базовый синтаксис закрепите через курс Python.

localhost для базы

В контейнере это сам API. Используйте имя сервиса db.

Только depends_on

Контейнер запущен, но PostgreSQL ещё не готов. Добавьте healthcheck.

Нет volume

Пересоздание контейнера удаляет данные.

down -v без понимания

Флаг удаляет named volume. Используйте только для осознанного сброса.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальному источнику 1. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Docker Compose для новичка: запускаем Python API и PostgreSQL одной командой
Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.

Короткие ответы
Почему API подключается к host db?

Compose DNS связывает имя сервиса с контейнером базы в общей сети.

Что сохраняет named volume?

Данные PostgreSQL независимо от пересоздания контейнера.

Что проверять первым, если Docker Compose не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект Docker Compose работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.