Теперь, когда вы знаете о том, для чего мы собираемся использовать Docker Compose, пришло время создать ваше первое клиент-серверное приложение с использованием этого инструмента.
В этом разделе разберемся с тем, что такое Docker Compose и как он работает на реальном небольшом проекте — положим Django и PostgreSQL в контейнеры, так чтобы они работали как одно целое. Для сборки кластера контейнеров используется docker-compose.yml.
Docker-compose.yml — конфигурационный файл в YAML-формате, описывающий логику запуска и взаимодействия контейнеров между собой и внешним миром. В сущности инструкции заложенные в docker-compose.yml по логике работы идентичны ключам команды docker run.
Для запуска контейнеров через docker-compose используются следующие команды:
docker-compose build: собрать проект
docker-compose up -d: запустить проект
docker-compose down: остановить проект
docker-compose logs -f [service name]: посмотреть логи сервиса
docker-compose ps: вывести список контейнеров
docker-compose exec [service name] [command]: выполнить команду в контейнере
docker-compose images: вывести список образов
Подготовка проекта к Docker Compose
За основу возьмем проект интернет магазина из 5 модуля данного курса. На данный момент, его файловая структура выглядит следующим образом:
Выполним команду:
pip freeze -> requirements.txt
Чтобы создать файл, содержащий все зависимости нашего проекта.
И теперь создадим Dockerfile в папке app нашего приложения.
FROM python:3.12.0
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app/
Я думаю вы заметили, что теперь нам не нужно добавлять в него команды, которые открывают доступ к порту и выполняют команды запуска.
Затем добавьте файл docker-compose.yml в корень проекта:
services:
web:
# Берем Dockerfile из каталога app
build: app
# Запускаем тестовый сервер
command: uvicorn app.main:app --host 0.0.0.0
# куда будут помещены данные из каталога app
volumes:
- .:/app
# Открываем порт 8000 внутри и снаружи
ports:
- 8000:8000
Обратите внимание на значение version. Если вы используете старую версию Docker - вам может потребоваться ее изменить.
В итоге мы получаем следующую файловую структуру:
Внутри папки app находится наш FastAPI проект, его Dockerfile и requirements.txt.
Перед выполнением следующих шагов проверьте в Docker Desktop запущенные контейнеры, их необходимо остановить. Теперь попробуем создать наш образ Docker Compose:
docker-compose build
После создания образа запустите контейнер:
docker-compose up -d
Опция -d или --detach используется для создания и запуска контейнеров в фоновом режиме.
Перейдите на http://127.0.0.1:8000, чтобы убедиться что наш FastApi проект работает:
Теперь мы можем открыть Docker Desktop и посмотреть на наши контейнеры:
В следующем шаге мы добавим сервис PostgreSQL к нашему проекту.