Рубрики
Без рубрики

Альтернатива Python Docker

Развертывание приложения Python на сервер удивительно сложно. Без мигая вы будете иметь дело с VI … Tagged с Python, Docker, Shiv.

Развертывание приложения Python на сервер удивительно сложно. Без мигания вы будете иметь дело с виртуальными средами и множеством других осложнений.

Ландшафт методов развертывания огромный. Что если я скажу вам, что есть способ построить ваше приложение в один файл, и оно не контейнер Docker ?

В этой статье мы рассмотрим общие способы развертывания приложений Python. Мы рассмотрим рекламные преимущества контейнеров Docker, чтобы понять, почему контейнеры так популярны для веб -приложений. Наконец, мы посмотрим на Альтернатива Для Docker, который может быть намного проще для вашего веб -приложения Python и сравнить и сопоставить эту альтернативу с Docker.

Приложение развертывание 101

Основная цель развертывания веб -приложения в Интернете может быть обобщена в нескольких словах:

Получите код приложения на сервер (машину), где он может работать и быть достигнутым людьми в Интернете.

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

  1. У вас должно быть приложение.
  2. У вас должна быть машина, которая может хранить приложение.
  3. У вас должен быть механизм, чтобы доставить приложение на машины.
  4. У вас должен быть веб -сервер, который может запустить приложение.
  5. Ваша машина должна быть доступна в домене в Интернете.
  6. Ваша машина должна быть безопасной (для некоторого разумного уровня «безопасного» в зависимости от потребностей вашего бизнеса).

В этой статье предполагается, что у вас уже есть приложение. Если вы этого не сделаете, у Python есть отличный набор веб -структур, которые помогут вам создать желаемое приложение. По моему совершенно предвзятому мнению, Django это отличное (если не лучшее) место для начала.

Платформа как боковая панель сервиса (PAAS)

На этом этапе я бы оказал вам огромную медвежью услугу, если бы я не выделил удивительную ценность платформы как услуги (PAAS).

Если вы начинаете новое веб-приложение, и для вас очень важно время на рынке, то ( пожалуйста! ) Рассмотрим обмену денег на время, используя PAAS. Меня не спонсируется каким -либо Паасом за то, что он сказал вам об этом, но паас (например, Хероку или Pythonanywhere ) сэкономит вам кучу времени на немного больше денег.

Серьезно, проверьте это.

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

Конец боковой панели.

Все еще здесь? Хорошо. Я думаю, что эта тема по -прежнему очень интересна, когда мы ныряем в кишки.

Из приложения на сервер

После того, как вы создали свое приложение минимального жизнеспособного продукта (MVP), вам необходимо иметь возможность показать его в мире. Мы можем сделать это, получая доступ к серверу через службу хостинга.

Услуги хостинга включают крупных игроков, таких как Amazon Web Services (AWS) , Google Cloud Platform (GCP) , или Microsoft Azure Анкет Эти крупные компании предлагают тонны продуктов, от управляемых баз данных до сетей доставки контента до контроля за спутниковой земли ( Я не шучу об этом последнем! ). Компромисс имеет все эти продукты, связанные с множеством вариантов конфигурации.

Другие услуги хостинга предлагают виртуальные частные серверы (VPS) с меньшим количеством дополнительных услуг. Услуги, как правило, имеют более простые предложения, направленные на небольшие предприятия. Некоторые популярные игроки в этом пространстве Digitalocean (do) или Linode Анкет

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

Инструменты обеспечения могут делать практически все на сервере. Вы можете использовать их для:

  • Установите пакеты из менеджера пакетов операционной системы.
  • Запустите процессы, такие как балансировщики нагрузки и программное обеспечение для мониторинга.
  • Добавьте задания Cron, чтобы выполнить задачи по расписанию.
  • Настройте приложения Python.

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

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

Лучшая стратегия повышения надежности ваших инструментов обеспечения (и, следовательно, вашего развертывания) – это делать меньше Анкет

Сколько находится в вашем приложении Python?

Для приложения Python ваш сервер нуждается:

  • Код приложения.
  • Зависимости приложения.
  • Веб -сервер для запуска приложения.

Кажется простым, верно? Держать на секунду.

Я намечу один способ сделать это, и вы сможете увидеть все, что связано.

  • Чтобы получить код приложения, клонируйте свой репозиторий GIT на сервер.
  • Чтобы клонировать репозиторий, добавьте ключ развертывания SSH, чтобы получить доступ к репо.
  • Чтобы добавить ключ развертывания SSH, контролируйте его в зашифрованном месте, к которому может получить ваш инструмент для обеспечения.
  • Чтобы добавить зависимости приложений, создайте Виртуальная среда Анкет
  • Используйте PIP, чтобы установить зависимости в виртуальную среду.
  • Если какие -либо пакеты требуют расширения C (например, LXML или PIL), используйте диспетчер пакетов для установки заголовков и библиотеков C -разработчиков C, таких как Libjpeg.
  • Убедитесь, что компилятор установлен, чтобы он мог собирать расширения.
  • Установите веб -сервер.
  • Настройте веб -сервер для использования кода приложения.
  • Если у вас есть статические активы, такие как CSS и JavaScript, установите все предварительные обработки и инструменты, необходимые для создания и министерства этих статических активов (это может быть огромной задачей!).

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

Вариант A: контейнер Docker

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

Используя специальный процесс строительства, Docker вставит в контейнер все выходные данные, такие как код Python, зависимости, скомпилированные расширения и статические активы.

Контейнер – интересная часть в этом уравнении. Что это такое?

Контейнер – это один файл с именем изображения, в котором используется специальная структура файловой системы для хранения всего вашего приложения. Это не Полная операционная система, такая как виртуальная машина. Вместо этого демон Docker (который является фоновой программой) взаимодействует с ядром операционной системы сервера для запуска изображения.

Само изображение не работает. Это действует как шаблон резака для печенья. Docker Daemon использует этот шаблон, чтобы запустить контейнер экземпляр Анкет Экземпляр – это фактический процесс запуска, который выполнит код вашего приложения.

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

Преимущество контейнера заключается в том, что это взаимозаменяемая часть с четким интерфейсом, который можно легко перемещать. Фактически, «контейнер» предназначен для создания изображения транспортного контейнера, который обладает сходными свойствами.

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

Контейнеры не всегда лучше всего подходят.

Контейнеры также приносят накладные расходы в процесс разработки программного обеспечения. Инструмент разработчика становится лучше, как недавнее объявление Microsoft о VS Кодовая поддержка контейнера , но не все редакторы поддерживают этот вид интерфейса. Это означает, что редактирование и отладка в контейнере могут быть сложнее, чем поток на вашей местной ОС.

Вариант B: Shiv, приложение Python в комплекте

Вместо того, чтобы помещать большие куски операционной системы в контейнер, что, если бы вы могли объединить свое приложение Python в один исполняемый файл? Это именно то, что Шив делает. Шив – это проект от LinkedIn Анкет

Шив использует один из самых неизвестных уголков языка питона, приложения Python Zip. Zipapps – это не новая функция в Python. Zipapp Pep, PEP 441 , получил одобрение в 2015 году. Но Что такое Zipapp ?

Zipapps-это способ выполнить код Python непосредственно из архивного файла, форматированного на молнии. Python выполнит этот файл, добавив в него какие -либо пакеты в путь Python, а затем запустив __main__.py Файл, который находится в корне архива. Преимущество этой схемы заключается в том, что это Один запускаемый файл. Быть единственным файлом делает его тривиальным для отслеживания как версию «Artifact».

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

С приложением SHIV все коды вашего приложения и зависимости объединены вместе. Это создает единый блок, который будет либо работать, либо потерпеть неудачу. Если это не удается, Не отправляйте! Наличие одного артефакта устраняет вероятность плохого взаимодействия в вашей производственной системе.

Например, давайте рассмотрим более традиционное приложение Python. Предположим, что ваше приложение тестируется в непрерывной интеграции (CI) с пакетом A в версии 2. Если этот код приложения развернут на сервере, возможно, что пакет A не обновляется, а сервер имеет версию 1. Ваше приложение может начать терпеть неудачу, потому что две разные части не были проверены вместе.

Теперь рассмотрим версию приложения SHIV этого сценария. Приложение SHIV построено в CI и объединяет код вашего приложения с Пакет A в версии 2. Когда проходят тесты, весь этот блок развернут и должен работать, потому что для вашего кода приложения нет возможности взаимодействовать с пакетом A в версии 1.

Я думаю, что это большая победа!

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

Давайте посмотрим, как начать с Шива, чтобы вы могли получить эти преимущества.

Шив на практике

Первый шаг – установить Shiv.

$ pip install shiv

Мне нравится сохранять все мои инструменты для набора инструментов разработки, такие как Shiv в Требования-dev.txt Файл, но делайте то, что работает для вас, означает ли это использование Pipenv или какой -то файл требований.

После того, как вы установите Shiv, вы получите доступ к Шив инструмент командной строки.

Прежде чем мы сможем использовать Shiv, мы должны сделать некоторую подготовительную работу с нашим приложением. Шив хочет работать с Python Packages, поэтому нам нужно упаковать наше приложение.

Учебное пособие по упаковке Whirlwind

Упаковка – большая тема, но я постараюсь привести разумный пример. Если вы хотите глубоко погрузиться в упаковку, проверьте Руководство пользователя упаковки Python Анкет

Чтобы сделать пакет для стандартного приложения Django, нам минимально нужно:

  1. A setup.py Файл, чтобы сообщить метаданным Python Core и где находится код.
  2. A Manifest.in Чтобы сказать Python, где находятся ваши файлы данных (например, шаблоны).

Отказ от ответственности: есть множество методов для работы с упаковкой. Если вы эксперт по упаковке и не любите метод, который я перечислил, извините.

setup.py Файл выглядит так:

from setuptools import find_packages, setup

setup(
    name="myapp",
    version="1.0.0"
    packages=find_packages(),
    include_package_data=True,
)

Две вещи, которые стоит позвонить:

  1. find_packages Все ли тяжелое подъем поиска вашего кода Python для вашего приложения.
  2. include_package_data = true рассказывает Setuptools использовать Manifest.in Файл, чтобы получить данные пакета.

Manifest.in Файл будет выглядеть как -то вроде:

recursive-include myapp/templates *

Это предполагает, что у вас есть пакет Python под названием myApp который содержит шаблоны каталог, в котором есть шаблонные файлы в нем. Потому что он использует рекурсивное разрешение , система упаковки будет включать в себя все Файлы в каталоге шаблонов, даже если они вложены в другие каталоги.

Этого достаточно, чтобы сделать пакет, работая python setup.py sdist !

Использование Shiv и ваш блестящий новый пакет

Мы хотим поместить весь упакованный код для приложения и зависимостей в одно место. Это даст Шиву четкое место, чтобы объединить весь код вместе. Теперь, когда у вас есть пакет, этот процесс выполняется в одной команде.

Если у вас есть все ваши зависимости в Требования.txt Файл, вы можете запустить:

$ pip install . -r requirements.txt --target dist/

Точка ( Это означает, что он найдет ваш setup.py файл и установите ваше приложение.

-r Требования.txt это метод PIP для установки списка пакетов одним махом. Вот как установлены все ваши зависимости.

Но где мы устанавливаемся? Вот что это за -Таргет флаг делает. Целевой флаг заставляет PIP помещать весь код в место по вашему выбору вместо стандартного Сайт-Пэкиги Справочник, где обычно едут установленные пакеты.

Как только весь код будет в Dist Справочник, мы готовы построить приложение SHIV. Давайте посмотрим на команду, чтобы сделать это.

shiv --site-packages dist --compressed \
    -p '/usr/bin/env python3' \
    -o myapp.pyz \
    -e myapp.main:main

-Сайт-Пакэги Флаг рассказывает Шиву местоположение кода. -Снятый Попросите Шива использовать сжатый формат при построении архива ZIP.

-p Флаг описывает, где Шив должен искать Python, когда он работает. С помощью /usr/bin/env , мы можем сказать Шиву искать любую версию Python, которую он может найти на пути. Это полезный трюк, потому что он может решить на разные пути, такие как /usr/bin/python3 или /usr/local/bin/python3 В зависимости от того, как ваша ОС устанавливает Python. Этот метод может избежать тонкой поломки, которая произойдет, если вы указате путь к Python, который не существует в целевой среде.

-o Флаг – это имя выходного файла. Когда я использую это в непрерывной интеграции, я предоставляю имя как myApp-$ {circleci_sha1} .pyz Так что я могу однозначно определить версию, которую генерирует CI.

Наконец, -e Флагские руководства Шив, где найти точку входа вашего применения. В примере часть перед толстой кишкой является модульной дорожкой, а часть после толстой кишки является именем функции. Это означает, что Шив попытается выполнить Главный функция, которая находится в myapp/main.py Файл в проекте.

Что в основном?

К этому моменту я исключил то, что вы положили в своем Главный функция? Если вы запускаете веб -приложение, Главный должен запустить веб -сервер.

Для моего бокового проекта, построенного на Джанго, Главный Функция выглядит немного похоже на:

import sys
from gunicorn.app import wsgiapp

def main():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.development")
    django.setup()

    sys.argv.append("conductor.wsgi:application")
    wsgiapp.run()

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

$ ./conductor.pyz
[2019-09-17 02:50:06 +0000] [INFO] Starting gunicorn 19.9.0
[2019-09-17 02:50:06 +0000] [INFO] Listening at: http://127.0.0.1:8000 (85833)
[2019-09-17 02:50:06 +0000] [INFO] Using worker: sync
[2019-09-17 02:50:06 +0000] [INFO] Booting worker with pid: 85844

Есть некоторые действительно хорошие свойства такого подхода, которые, я надеюсь, вы заметили:

  1. Код не должен работать в виртуальной среде.
  2. Ни один внешний инструмент (а именно, веб -сервер) не должен быть вызван.

Зацепление в развертывание

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

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

  • Место для создания вашего последнего приложения SHIV. Непрерывная интеграция – ваш лучший выбор здесь.
  • Хранение для сгенерированных файлов приложений PYZ. Я использовал AWS S3 для этого. Возможное количество альтернатив почти бесконечно, поэтому выберите то, что вам удобно.
  • Задачи развертывания, чтобы вытащить новейшее приложение SHIV из вашего места хранения.
  • Конфигурация для запуска приложения SHIV из диспетчера процессов вашей службы (например, SystemD или Superisorsor).

Это развертывание приложения Shiv в двух словах. Я не нарисовал полную картину, но я надеюсь, что у вас будет достаточно представления о том, как запустить приложение SHIV с одним файлом в качестве альтернативы более традиционному развертыванию приложения Python.

Далее, давайте сравним Docker и Shiv.

Докер против Шив

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

Давайте проясним с самого начала: Docker и Shiv – это солидные инструменты, которые могут работать для вашего проекта. Поскольку мы сравниваем их, я не стремлюсь разворачивать одно или другое. Если вы можете увидеть сходства и различия, вы можете судить, что лучше подходит для вашего проекта.

Во -первых, Docker:

  • Докер имеет огромную экосистему. Инструмент не специфичен для языка, поэтому широкое сообщество вкладывается в него много энергии.
  • Docker завершает множество функций и инструментов ОС. Если вы выберете достаточно большой контейнер, вы можете запустить другие команды за пределами вашего веб -сервера.
  • Если ваш проект не для Python, то Docker будет намного лучше, чем Shiv. Шив очень узко сосредоточен на обслуживании приложений Python.
  • Если вы не очень осторожны, изображения Docker могут стать огромными (нетрудно иметь изображение, которое достигает 2 ГБ). Размер становится обременительным, особенно если у вас нет отличного подключения к Интернету.
  • Контейнеры Docker подключаются к большим системам оркестровки, таким как Kubernetes. Если вашей организации нужен такой уровень координации, вы узнаете.

А как насчет Шива?

  • Шив создан специально для Python. Этот узкий фокус означает, что вы получите инструмент, посвященный конкретным потребностям Python, как объединение ваших пакетов.
  • Приложения SHIV просты, чтобы сохранить маленькие. Поскольку приложение – это комплексный код Python с точкой входа, оно не привлечет дополнительные вещи, такие как компиляторы или заголовки разработки. Например, мой боковой проект составляет всего 23 МБ.
  • Шив ведет себя точно так же, как исполняемый файл. Не существует дополнительного процесса демона, который необходим для управления выполнением (в отличие от изображения Docker и отношения контейнеров).
  • В некотором смысле, Шив – гораздо меньшая экосистема, чем экосистема Docker. Нет инструментов, которые сосредоточены исключительно на приложениях SHIV. С другой стороны, приложения Shiv – это питон Zipapps, поэтому экосистема Shiv это Экосистема Python.

Когда добраться до докера

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

Например, Docker является чрезвычайно распространенным выбором при работе в среде Kubernetes. Интерфейс контейнера хорошо установлен. Этот общий интерфейс означает, что процессы управления в Kubernetes могут динамически масштабировать и запускают новые экземпляры контейнеров, чтобы реагировать на увеличение и уменьшение веб -трафика.

Важно , Docker работает хорошо, когда есть:

  • Выделенная команда DevOps/SRE для поддержки инфраструктуры ИЛИ
  • Управляемый сервис, который работает с такими контейнерами, как AWS Fargate или с использованием Docker на Heroku.

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

Когда добраться до Шив

Я бы добрался до Шива, когда я управляю более ограниченной инфраструктурой и развертываю приложение Python. Шив избегает накладных расходов инфраструктуры контейнеров за счет гибкости.

Шив работает хорошо, когда:

  • У команды есть приложение Python, выполняющее определенную задачу, такую как приложение Django, работающее на стрельбе.
  • Команда хочет развернуться на виртуальных машинах и хочет обновить эти машины на месте как можно меньше (то есть, неразрушающие развертывания).

Чтобы быть ясным, я уверен, что Шив может работать в крупных организациях. Помните: Shiv происходит от LinkedIn, а LinkedIn – не небольшая организация. Мой главный момент в том, что Шив – это Отлично Подходит для небольших организаций, которые пытаются работать с минимальными накладными расходами.

Что вам подходит?

Для меня, как кто -то с побочным проектом и опытом, чтобы управлять моей собственной инфраструктурой, Шив великолепен. Этот инструмент помог мне очистить развертывание, чтобы они были быстрыми и безболезненными.

Для вас, может быть, Docker по -прежнему лучше всего подходит. Или, возможно, простота Шива вызвала ваш интерес, и вы готовы попробовать.

Я надеюсь, что эта статья была изложена достаточно для вас, чтобы вы могли сделать этот звонок и попробовать создать свое собственное исполняемое приложение Python, если хотите.

Если у вас есть вопросы или понравились этой статье, пожалуйста, не стесняйтесь написать мне в Twitter в @mblayman или поделиться, если другие тоже могут быть заинтересованы.

Эта статья впервые появилась на mattlayman.com Анкет

Оригинал: “https://dev.to/mblayman/python-alternative-to-docker-343e”