Создание Web-приложения Flask и деплой с помощью Docker Compose & Dockerfile

Краткое введение в Flask

Flask — это удобный для начинающих веб-фреймворк с открытым исходным кодом, построенный на языке программирования Python. Flask подходит, если вы хотите быстро разработать приложение с легкой кодовой базой.

Flask разрабатывает Армин Ронахер, возглавляющий международную группу энтузиастов Python под названием Pocco. Flask основан на наборе инструментов Werkzeug WSGI и механизме шаблонов Jinja2. Оба являются проектами Pocco.

Интерфейс шлюза веб-сервера (WSGI) был принят в качестве стандарта для разработки веб-приложений Python. WSGI — это спецификация универсального интерфейса между веб-сервером и веб-приложениями.

Jinja2 — популярный движок шаблонов для Python. Система веб-шаблонов объединяет шаблон с определенным источником данных для отображения динамических веб-страниц.

Что будет рассмотрено в статье «Python Flask App — Docker — Tutorial»

В этой статье будет рассмотрено создание простого web-приложения Flask, build образа с помощью Dockerfile & Docker, а также развертывание образа в контейнере с помощью Docker-Compose.

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

Создание приложения Flask

Давайте приступим к созданию простого приложения Flask, которое будет отображать сообщение в браузере.

Создадим папку с именем flask_docker для нашего приложения:

mkdir flask_docker

Переходим внутрь папки:

cd flask_docker

Если у Вас не установлена виртуальная среда venv, то необходимо ее исталлировать командой:

sudo apt install python3.8-venv

Далее создаем виртуальную среду myenv

python3 -m venv myenv

Должна появиться директория myenv. Запускаем команду активации виртуальной среды:

source myenv/bin/activate

Внутри активированной виртуальной среды запускаем установку библиотеки Flask:

pip install Flask

После успешной установки Flask следующим шагом будет создание файла Python app.py, который будет получать запросы и отправлять ответы для нашего web-приложения. Для этого создадим директорию webapp:

mkdir webapp

cd webapp

Далее нам нужно в директории webapp создать файл файл app.py со следущим кодом внутри:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return '<h1>Hello, World!</h1>'

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)

В приведенном выше фрагменте кода аннотация служит для направления запроса на URL-адрес. В указанном примере URL-адрес представляет собой домашнюю страницу @app.route/

Эта аннотация также имеет method параметр, который принимает список методов HTTP, чтобы указать разрешенный метод для заданного URL-адреса. По умолчанию (как показано) это GET метод, он является единственным разрешенным методом HTTP.

Вот пример того, как вы можете указать, что ваш маршрут должен разрешать оба метода GET и POST для запроса HTTP:

@app.route('/', methods=['POST', 'GET'])

Функция home(), связанная с URL-адресом, указанным в аннотации, будет выполняться при отправке запроса на этот маршрут. Функция возвращает строку текста '<h1>Hello, World!</h1>'.

Как создать Python requirement.txt файл для Docker

Файл requirement.txt содержит список пакетов и зависимостей, необходимых для запуска вашего проекта, а также их соответствующие версии, требуемые для корректной работы приложения.

Внутри активированной venv выполните следующую команду в терминале:

pip freeze > requirements.txt

Эта команда сгенерирует имена пакетов и их соответствующих версий, которые вы установили, а также некоторые другие встроенные зависимости, которые запускают ваше приложение Flask. Затем он сохраняет их в файле с именем requirements.txt

click==8.1.2
Flask==2.1.1
importlib-metadata==4.11.3
itsdangerous==2.1.2
Jinja2==3.1.1
MarkupSafe==2.1.1
Werkzeug==2.1.1
zipp==3.8.0

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

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

Вы можете проверить, работает ли приложение, прежде чем приступить к его контейнеризации. Запустите эту команду на своем терминале в корневом каталоге:

python app.py

Настройка Dockerfile для создания образа приложения Flask

Создайте файл Dockerfile внутри webapp. Добавьте в файл следующий фрагмент кода:

# start by pulling the python image
FROM python:3.8-alpine

# copy the requirements file into the image
COPY ./requirements.txt /app/requirements.txt

# switch working directory
WORKDIR /app

# install the dependencies and packages in the requirements file
RUN pip install -r requirements.txt

# copy every content from the local file to the image
COPY . /app

# configure the container to run in an executed manner
ENTRYPOINT ["python"]

CMD ["app.py"]

Давайте рассмотрим инструкции в этом Dockerfile:

  • FROM python:3.8-alpine — Поскольку Docker позволяет нам наследовать существующие образы, мы устанавливаем образ Python и устанавливаем его в наш образ Docker. Alpine — это легкий дистрибутив Linux, который будет служить ОС, на которую мы устанавливаем наш образ
  • COPY ./requirements.txt /app/requirements.txt — Здесь мы копируем requirements файл и его содержимое (сгенерированные пакеты и зависимости) в app папку образа.
  • WORKDIR /app — мы приступаем к установке рабочего каталога как app, который будет корневым каталогом нашего приложения в контейнере.
  • RUN pip install -r requirements.txt — эта команда устанавливает все зависимости, определенные в файле requirements.txt в наше приложение внутри контейнера.
  • COPY . /app — это копирует все остальные файлы и их соответствующее содержимое в app папку, которая является корневым каталогом нашего приложения в контейнере.
  • ENTRYPOINT ["python"] — это команда, которая запускает приложение в контейнере.
  • CMD ["app.py"] — Наконец, это добавляет список параметров к EntryPoint параметру для выполнения команды, запускающей приложение. Это похоже на то, как вы запускаете приложение Python на своем терминале с помощью команды python app.py

Создадим образ (image) Docker

Выйдем из активированной среды venv:

deactivate

Для этого необходимо в командном окне (не в активированной среде), запустить команду:

sudo docker image build -t flask_docker .

Точка в конце обязательна, не пропустите её.

Запуск контейнера из образа в Docker

После успешного билда образа необходимо запустить экземляр образа в Docker. Сделать это можно следующей командой:

sudo docker run -p 5000:5000 -d flask_docker

Эта команда запускает контейнер и его встроенное приложение, каждое из которых использует подход с привязкой к порту. Первая часть 5000 — это порт, который мы выделяем контейнеру на нашей машине. Второй 5000 — это порт, на котором приложение будет работать в контейнере.

Вот вывод нашего приложения, когда мы отправляем запрос в нашем браузере:

localhost:5000

Предупреждение

WARNING: Running pip as the ‘root’ user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

туду

Развертывание Flask App, PostgreSQL, PGAdmin с помощью Docker-Compose

Для создания приложения необходимо добавить базу данных postgresql, панель управления pgadmin, а также пропишем процесс сборки образа на основе нашего Dockerfile.

Файл docker-compose.yml:

version: '3.9'

services:  
  flask_web:
    container_name: flask_web_container
    build: .
    ports:
      - 5000:5000
    restart: unless-stopped

  postgres:
    env_file: ./docker/.env-postgresql
    container_name: postgres_flask_container
    image: postgres:14
    volumes:
       - flaskdb:/var/lib/postgresql/data
    ports:
      - 5432:5432
    restart: unless-stopped
    networks:
      - backend
  
  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-qlik@ivan-shamaev.ru}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-A->V9>pS6HJ~xY8d}
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - pgadmin:/var/lib/pgadmin
    ports:
      - "${PGADMIN_PORT:-5050}:80"
    restart: unless-stopped
    networks:
      - backend

volumes:
    flaskdb:
      driver: local
    pgadmin:
      driver: local

networks:
  backend:
    driver: bridge

Файл docker/.env-postgresql:

# database engine specific environment variables
DATABASE_PORT=5432
DATABASE_DIALECT=postgresql
POSTGRES_DB=flaskdb
POSTGRES_USER=flaskuser
POSTGRES_PASSWORD=flaskpassword

Доступ в pgadmin http://localhost:5050/browser/

Скачать код первого этапа для развертывания flask приложения в docker

Получить код пройденного этапа можно в github deploy-python-flask-app-tutorial/Example 1/.

5 3 голоса
Рейтинг статьи
Шамаев Иван
Разработчик аналитических решений QlikView/Qlik Sense/Power BI; Python Data Scientist; Разработчик интеграционных решений на PHP, Python, JavaScript.
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x