Как контейнеризировать веб-приложение на Python
Контейнеры продолжают расти в популярности и использовании, и, честно говоря, они действительно решают большую проблему, поэтому все продолжают любить и принимать их.
Одна из самых больших проблем переноса приложений из одной среды в другую была решена с помощью контейнеров, которые, как видно из названия, представляют собой контейнер, в котором все, начиная от зависимостей приложения и заканчивая операционной системой, на которой будет работать наше приложение, собрано в единое целое.
В принципе, мы можем запустить этот контейнер в любой среде, и наше приложение будет работать, а что касается зависимостей наших приложений, то мы переносим их с собой, и даже если они будут обновлены, а те, что есть в нашем приложении, устареют, они все равно будут работать.
Прелесть контейнеров продолжает расти, поскольку тем, кто их внедрил, теперь меньше о чем беспокоиться – это не совсем так, но суть вы поняли.
Содержание
- Что такое Docker
- Получение Docker
- Создание нашего веб-приложения
- Что такое Dockerfile
- Конфигурация Dockerfile
- Сборка Docker
Docker
Docker – это платформа с открытым исходным кодом, позволяющая разработчикам создавать, развертывать, запускать, обновлять и управлять контейнерами – стандартизированными исполняемыми компонентами, объединяющими исходный код приложения с библиотеками операционной системы (ОС) и зависимостями, необходимыми для выполнения этого кода в любой среде.
Итак, для контейнеризации приложения нам нужен Docker – это и платформа, и инструмент, который мы будем использовать.
Установка docker
Конечно, чтобы использовать Docker, нам необходимо установить его на нашу машину, если у вас его еще нет 🙂 .
Щелкните по ссылке ниже, чтобы перейти на страницу установки docker.
Install Docker Desktop | Docker Documentation
Внимательно следуйте инструкциям, чтобы правильно настроить и подготовить к работе docker.
Докеризация нашего приложения Flask
Веб-приложение, которое мы будем создавать и контейнеризировать, будет построено с помощью Flask. Оно будет очень простым, это просто веб-приложение Hello World.
Или, если вас интересует что-то более сложное, вы можете последовать моему учебнику по restful API, который также построен на Flask, и попытаться контейнеризировать его. Думаю, это будет интересно.
Двигаясь дальше, мы создадим наше приложение Hello World и докеризуем его.
Hello World с помощью Flask
Структура нашего проекта будет выглядеть примерно так:
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World"
if __name__ == '__main__':
app.run()
Вот и все, по большей части, конечно. Я думаю, что код достаточно прост и не нуждается в пояснениях.
Если вы протестируете этот код, то в вашем браузере должен появиться мир hello.
Отлично, теперь, когда подтверждено, что наше приложение работает правильно, мы можем немного изменить код. Правда, совсем немного.
app.py
import os
------
......
------
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
Я изменил app.run так, чтобы он мог динамически запускаться в нашем контейнере.
Получая порт из переменной окружения, которая может быть динамической, наше приложение может иметь немного больше гибкости в отношении порта, на котором оно будет работать.
Для хоста установлено значение ‘0.0.0.0’, что означает, что приложение будет прослушивать все доступные сетевые интерфейсы. Это позволяет обращаться к приложению извне контейнера или сервера.
Если мы снова запустим наше приложение, то оно должно работать без проблем.
requirements.txt
Чтобы зависимости нашего приложения были упакованы вместе с docker, нам, конечно же, необходимо получить или установить их в процессе сборки контейнера.
Как и в каждом проекте на Python, мы запишем требования нашего приложения в файл requirements.txt.
requirements.txt
Flask
конечно, это единственное требование нашего приложения. Если их больше, то они выделяются в новую строку. Можно также добавить конкретные версии устанавливаемых пакетов.
example
Flask==2.0.0
Jinja
Tailwindpie==0.1.1
Все это может быть проще, если вы используете виртуальную среду. Достаточно активировать среду и запустить ее.
pip freeze > requirements.txt
Эта команда получит все установленные вами пакеты pip и сбросит их в файл.
Dockerfile
Dockerfiles – это текстовые файлы, содержащие инструкции, необходимые для сборки образа Docker. Они могут включать инструкции по установке определенных библиотек, копированию исходного кода и конфигурационных файлов в образ, настройке переменных окружения.
Вы создаете этот файл без какого-либо расширения, т.е. .txt или что-то в этом роде. Для нашего приложения мы будем иметь:
Dockerfile
# Base image
FROM python:alpine
# Creating work directory in docker
WORKDIR /usr/app
# Copying files to docker
ADD . '/usr/app'
#RUN pip install flask
RUN pip install -r requirements.txt
# Starting application
CMD ["python", "app.py"]
Давайте рассмотрим каждый шаг, чтобы понять, что происходит:
FROM python:alpine
: Эта строка извлекает официальный образ Python с версией “alpine”. Alpine – это уменьшенный, облегченный вариант базового образа Python, основанный на дистрибутиве Alpine Linux. Именно на этой операционной системе будет работать наше приложение.WORKDIR /usr/app
: Это устанавливает в качестве рабочего каталога в образе Docker значение “/usr/app”. Все последующие команды будут выполняться из этого каталога.ADD . '/usr/app'
: Эта строка копирует все файлы и каталоги из текущего каталога (в котором находится Dockerfile, т.е. каталог нашего проекта) в каталог “/usr/app” в образе Docker.RUN pip install -r requirements.txt
: Эта команда устанавливает пакеты Python, перечисленные в нашем файле “requirements.txt”. Обычно в файле “requirements.txt” хранятся зависимости проекта, и эта строка гарантирует, что наши зависимости будут найдены и установлены в образ Docker.CMD ["python", "app.py"]
: Это команда, выполняемая по умолчанию при запуске контейнера из этого образа. Она указывает, что должен быть выполнен Python-скрипт “app.py”. Это запустит наш скрипт и запустит наш сервер Flask.
Построение изображения
Наконец, мы находимся на этапе сборки, и все, что нам остается сделать, это:
- Перейдите в каталог проекта и откройте командную строку или терминал.
- Если вы работаете в vscode, то достаточно открыть встроенный терминал. Можно воспользоваться сочетанием клавиш Crtl + Shift + `.
- Запустите команду docker build.
docker build -t flask_hello_world .
Позвольте мне объяснить🫠.
- -t присваивает образу имя, в нашем случае flask_hello_world.
- . указывает docker на необходимость поиска Dockerfile в текущем каталоге.
Если вы находитесь не в каталоге/папке проекта, то вместо этого можно указать путь.
После завершения процесса сборки можно убедиться в том, что образ создан, выполнив команду:
docker images
Там мы видим только что созданный образ flask_hello_world.
Тестирование нашего образа Docker
Наконец, мы можем протестировать наш образ. Теперь, когда образ собран, он доступен глобально на вашей машине, т.е. для доступа к нему не обязательно находиться в каталоге проекта.
Чтобы протестировать наш образ, выполните команду:
docker run -p 5000:5000 flask_hello_world
Эта команда, конечно, запустит наш контейнер, но прежде чем мы двинемся дальше, позвольте мне кое-что объяснить.
- -p 5000:5000 Эта команда устанавливает для приложения в нашем контейнере прослушивание порта 5000
Заключение
Наконец, мы достигли того, что ставили перед собой, – создали и контейнеризировали веб-приложение на языке Python.
Инкапсулируя приложения и их зависимости, контейнеры, безусловно, устранили дилемму “это работает на моей машине” 😮💨, упростив процесс развертывания и обеспечив согласованность между средами разработки, тестирования и производства. Это, в свою очередь, привело к ускорению циклов разработки, сокращению времени простоя и улучшению взаимодействия между командами разработчиков и операторов.