Skip to content

31. (П15) Розгортання Flask REST API у Docker: створення Dockerfile

Передумови

Персоналізація

Застосунок повинен містити ваше ім'я та прізвище у відповідях API. Тег Docker-образу повинен містити ваше прізвище (латиницею). На скріншотах у звіті повинно бути видно ваше ім'я у відповідях curl.

Завдання

Створити персоналізований Flask REST API, запакувати його в Docker-образ та продемонструвати роботу контейнера.

Частина 1: Створення Flask API

Створити директорію проєкту:

flask-api-docker/
├── app.py
├── requirements.txt
└── Dockerfile

Файл requirements.txt

flask==3.1.1

Файл app.py

Написати Flask-застосунок з такими ендпоінтами:

1. GET / — привітання з вашим ім'ям:

{
  "message": "API створено: Тарас Шевченко"
}

2. GET /health — перевірка стану:

{
  "status": "ok"
}

3. GET /api/student — інформація про студента:

Повертає JSON з вашими даними:

{
  "first_name": "Тарас",
  "last_name": "Шевченко",
  "group": "КІ-21"
}

4. GET /api/courses — список курсів:

Повертає масив з 3-5 курсами (назви довільні):

{
  "student": "Тарас Шевченко",
  "courses": [
    {"id": 1, "name": "Python програмування"},
    {"id": 2, "name": "Бази даних"},
    {"id": 3, "name": "Веб-розробка"}
  ]
}

5. GET /api/courses/<id> — окремий курс за ID:

{
  "id": 1,
  "name": "Python програмування"
}

Якщо курс не знайдено — повернути статус 404:

{
  "error": "Course not found"
}

Підказка

Курси можна зберігати у звичайному списку Python — база даних не потрібна.

Важливо: Flask повинен слухати 0.0.0.0 (пояснення чому — в лекції 30).

Частина 2: Dockerfile, збірка та запуск

Написати Dockerfile та зібрати Docker-образ для застосунку. Як саме написати Dockerfile — дивіться лекцію 30.

Збірка образу

Зібрати образ з тегом, що містить ваше прізвище:

# Замініть shevchenko на ваше прізвище
docker build -t shevchenko-flask-api:1.0 .

Перевірити створений образ:

docker images | grep shevchenko

Запуск контейнера

docker run -d --name my-api -p 5000:5000 shevchenko-flask-api:1.0

Тестування всіх ендпоінтів

Перевірити кожен ендпоінт через curl:

# Привітання
curl http://localhost:5000/

# Здоров'я
curl http://localhost:5000/health

# Інформація про студента
curl http://localhost:5000/api/student

# Список курсів
curl http://localhost:5000/api/courses

# Окремий курс
curl http://localhost:5000/api/courses/1

# Неіснуючий курс (має повернути 404)
curl http://localhost:5000/api/courses/999

Перегляд логів

# Переглянути логи контейнера
docker logs my-api

# Стежити за логами в реальному часі та надіслати кілька запитів
docker logs -f my-api

Частина 4: Перезбірка після змін

Продемонструвати, що зміни в коді вимагають перезбірки образу:

  1. Додати ще один курс у список курсів в app.py
  2. Перезібрати образ з тегом 2.0:
docker build -t shevchenko-flask-api:2.0 .
  1. Зупинити та видалити старий контейнер:
docker rm -f my-api
  1. Запустити новий контейнер з образу 2.0:
docker run -d --name my-api -p 5000:5000 shevchenko-flask-api:2.0
  1. Перевірити, що новий курс з'явився:
curl http://localhost:5000/api/courses

Частина 5: Запуск на іншому порті

Запустити другий контейнер на іншому порті та перевірити, що обидва працюють:

# Другий контейнер на порті 8080
docker run -d --name my-api-2 -p 8080:5000 shevchenko-flask-api:2.0

# Перевірити обидва
curl http://localhost:5000/api/student
curl http://localhost:8080/api/student

Завершення

Зупинити та видалити всі контейнери:

docker rm -f my-api my-api-2

Результат

Після виконання роботи студент здає звіт зі скріншотами:

  • Вміст файлів app.py та Dockerfile
  • Збірка образу (docker build)
  • Результати curl для кожного ендпоінту (у відповідях видно ваше ім'я)
  • Результат curl для неіснуючого курсу (статус 404)
  • Логи контейнера (docker logs)
  • Перезбірка образу з тегом 2.0 та перевірка змін
  • Два контейнери на різних портах (docker ps з обома контейнерами)

Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub