Содержание страницы
Краткое введение в 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/.
Leave a Reply