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