Как контейнеризировать веб-приложение на Python

Контейнеры продолжают расти в популярности и использовании, и, честно говоря, они действительно решают большую проблему, поэтому все продолжают любить и принимать их.

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

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

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

Содержание

  1. Что такое Docker
  2. Получение Docker
  3. Создание нашего веб-приложения
  4. Что такое Dockerfile
  5. Конфигурация Dockerfile
  6. Сборка 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

Структура нашего проекта будет выглядеть примерно так:

Как контейнеризировать веб-приложение на Python

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World"

if __name__ == '__main__':
    app.run()

Вот и все, по большей части, конечно. Я думаю, что код достаточно прост и не нуждается в пояснениях.

Если вы протестируете этот код, то в вашем браузере должен появиться мир hello.

flask hello world app

Отлично, теперь, когда подтверждено, что наше приложение работает правильно, мы можем немного изменить код. Правда, совсем немного.

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"]

Давайте рассмотрим каждый шаг, чтобы понять, что происходит:

  1. FROM python:alpine: Эта строка извлекает официальный образ Python с версией “alpine”. Alpine – это уменьшенный, облегченный вариант базового образа Python, основанный на дистрибутиве Alpine Linux. Именно на этой операционной системе будет работать наше приложение.
  2. WORKDIR /usr/app: Это устанавливает в качестве рабочего каталога в образе Docker значение “/usr/app”. Все последующие команды будут выполняться из этого каталога.
  3. ADD . '/usr/app': Эта строка копирует все файлы и каталоги из текущего каталога (в котором находится Dockerfile, т.е. каталог нашего проекта) в каталог “/usr/app” в образе Docker.
  4. RUN pip install -r requirements.txt: Эта команда устанавливает пакеты Python, перечисленные в нашем файле “requirements.txt”. Обычно в файле “requirements.txt” хранятся зависимости проекта, и эта строка гарантирует, что наши зависимости будут найдены и установлены в образ Docker.
  5. CMD ["python", "app.py"]: Это команда, выполняемая по умолчанию при запуске контейнера из этого образа. Она указывает, что должен быть выполнен Python-скрипт “app.py”. Это запустит наш скрипт и запустит наш сервер Flask.

Построение изображения

Наконец, мы находимся на этапе сборки, и все, что нам остается сделать, это:

  1. Перейдите в каталог проекта и откройте командную строку или терминал.
  2. Если вы работаете в vscode, то достаточно открыть встроенный терминал. Можно воспользоваться сочетанием клавиш Crtl + Shift + `.
  3. Запустите команду docker build.
docker build -t flask_hello_world .

Позвольте мне объяснить🫠.

  • -t присваивает образу имя, в нашем случае flask_hello_world.
  • . указывает docker на необходимость поиска Dockerfile в текущем каталоге.

Если вы находитесь не в каталоге/папке проекта, то вместо этого можно указать путь.

Как контейнеризировать веб-приложение на Python

После завершения процесса сборки можно убедиться в том, что образ создан, выполнив команду:

docker images
Как контейнеризировать веб-приложение на Python

Там мы видим только что созданный образ flask_hello_world.

Тестирование нашего образа Docker

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

Чтобы протестировать наш образ, выполните команду:

docker run -p 5000:5000 flask_hello_world

Эта команда, конечно, запустит наш контейнер, но прежде чем мы двинемся дальше, позвольте мне кое-что объяснить.

  • -p 5000:5000 Эта команда устанавливает для приложения в нашем контейнере прослушивание порта 5000
Как контейнеризировать веб-приложение на Python

Заключение

Наконец, мы достигли того, что ставили перед собой, – создали и контейнеризировали веб-приложение на языке Python.

Инкапсулируя приложения и их зависимости, контейнеры, безусловно, устранили дилемму “это работает на моей машине” 😮‍💨, упростив процесс развертывания и обеспечив согласованность между средами разработки, тестирования и производства. Это, в свою очередь, привело к ускорению циклов разработки, сокращению времени простоя и улучшению взаимодействия между командами разработчиков и операторов.

+1
0
+1
0
+1
0
+1
1
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *