Приложение python в контейнере docker

Docker: размещение и запуск Python сценария

В этой статье мы подробно рассмотрим процесс размещения скрипта Python в контейнере Docker.

Что такое контейнер?

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

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

Размещение скрипта Python в Docker

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

Перед развертыванием скрипта давайте разберемся, как размещается приложение в Docker контейнере.

  1. Сначала нам нужно создать Dockerfile. Dockerfile является конфигом, который необходим для создания Docker images. Он содержит все необходимые команды, которые мы обычно выполняем через командную строку для создания образа контейнера.
  2. Создав Dockerfile, нам теперь нужно создать образ поверх Dockerfile. Docker images можно рассматривать как шаблон, который помогает создать контейнер в докер. Он упаковывает приложения и устанавливает серверную среду, что упрощает нам использование среды для размещения приложений в контейнерах удобным способом.
  3. Теперь мы можем запустить изображение, чтобы увидеть вывод скрипта python. Как только образ запускается, создается контейнер со случайным именем.
Читайте также:  Python http request with header

Теперь приступим к реализации!! Мы будем использовать приведенный ниже сценарий Python для размещения его в контейнере докера.

lst = list() lst = ['Python', 'Machine Learning', 'R Language', 'Bootstrap'] for x in lst: print(x) 

В приведенном выше сценарии мы создали список, а затем выполнили итерацию цикла for для печати элементов списка.

1. Создайте Dockerfile.

FROM python:3 ADD sample.py / CMD [ "python", "./sample.py" ] 

Dockerfile предлагает определенные директивы, как показано ниже —

  1. FROM — Эта директива устанавливает базовый образ для последующих инструкций по работе. В этом примере мы установили Python версии 3 в качестве базового изображения. Теперь Dockerfile получит этот базовый образ из Docker Hub, который на самом деле является репозиторием образов с открытым исходным кодом.
  2. ADD — инструкция ADD копирует новые файлы, каталоги или URL-адреса удаленных файлов из и добавляет их в файловую систему изображения по пути . В нашем случае src = sample.py , и пункт назначения /
  3. CMD — эта директива запускает службы вместе с базовым настраиваемым образом.

2. Создание образа из Dockerfile

После создания Dockerfile нам нужно создать образ поверх файла Docker, используя следующую команду:

docker build -t image-name:tag . 

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

docker build -t python-img:5.0 . 
[+] Building 5.4s (7/7) FINISHED => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 31B 0.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/python:3 5.0s => [internal] load build context 0.1s => => transferring context: 31B 0.0s => [1/2] FROM docker.io/library/python:3@sha256:b6a9702c4b2f9ceeff807557a63a710ad49ce737ed85c46174a059a299b580 0.0s => CACHED [2/2] ADD sample.py / 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => writing image sha256:8b2da808b361bc5112e2afa087b9eb4e305304bcc53c18925d04fe8003f92975 0.0s => => naming to docker.io/library/python-img:5.0 

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

3. Запустите образ докера.

Давайте теперь запустим наш созданный образ, чтобы увидеть вывод скрипта python из контейнера на консоли GIT BASH.

Python Machine learning R language Bootstrap 

Мы также можем видеть отражение образа, запущенного в консоли Docker Community Edition, как показано ниже —

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

Мы даже можем создавать контейнеры с настраиваемыми именами и запускать скрипт через контейнер, используя следующую команду:

docker run -it --name container-name image:tag 
docker run -it --name sample python-img:5.0 
Python Machine learning R language Bootstrap 

Индивидуальный Docker контейнер</p data-lazy-src=

Как превратить скрипт на Python в «настоящую» программу при помощи Docker

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

Для кого предназначена эта статья?

Вам когда-нибудь передавали код или программу, дерево зависимостей которой напоминает запутанную монтажную плату?

Как выглядит управление зависимостями

Без проблем, я уверен, что разработчик любезно предоставил вам скрипт установки, чтобы всё работало. Итак, вы запускаете его скрипт, и сразу же видите в оболочке кучу сообщений логов ошибок. «У меня на машине всё работало», — обычно так отвечает разработчик, когда вы обращаетесь к нему за помощью.

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

В частности, мы рассмотрим скрипты, которые должны работать как фоновый процесс.

Репозитории Github и Docker

Если вам более удобна наглядность, то изучите репозитории Github и Docker, где будет хоститься этот код.

Но… почему Docker?

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

Контейнеризация приложений на самом деле является золотым стандартом портируемости.

Общая схема Docker/контейнеризации

Контейнеризация (особенно при помощи docker) открывает перед вашим программным приложением огромные возможности. Правильно контейнеризированное (например, докеризированное) приложение можно развёртывать с возможностью масштабирования через Kubernetes или Scale Sets любого поставщика облачных услуг. И да, об этом мы тоже поговорим в следующей статье.

Наше приложение

В нём не будет ничего особо сложного — мы снова работаем с простым скриптом, отслеживающим изменения в каталоге (так как я работаю в Linux, это /tmp ). Логи будут передаваться на stdout, и это важно, если мы хотим, чтобы они отображались в логах docker (подробнее об этом позже).

main.py: простое приложение мониторинга файлов

Эта программа будет выполняться бесконечно.

Как обычно, у нас есть файл requirements.txt с зависимостями, на этот раз только с одной:

Создаём Dockerfile

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

Нам необязательно вдаваться в подробности устройства и работы Dockerfile, об этом есть более подробные туториалы.

Краткое описание Dockerfile — мы начинаем с базового образа, содержащего полный интерпретатор Python и его пакеты, после чего устанавливаем зависимости (строка 6), создаём новый минималистичный образ (строка 9), копируем зависимости и код в новый образ (строки 13–14; это называется многоэтапной сборкой, в нашем случае это снизило размер готового образа с 1 ГБ до 200 МБ), задаём переменную окружения (строка 17) и команду исполнения (строка 20), на чём и завершаем.

Сборка образа

Завершив с Dockerfile, мы просто выполняем из каталога нашего проекта следующую команду:

sudo docker build -t directory-monitor .

Запуск образа

После завершения сборки можно начинать творить магию.

Один из самых замечательных аспектов Docker заключается в том, что он предоставляет стандартизованный интерфейс. Так что если вы правильно спроектируете свою программу, то передавая её кому-то другому, достаточно будет сказать, что нужно изучить docker (если человек ещё его не знает), а не обучать его тонкостям устройства вашей программы.

Хотите увидеть, что я имею в виду?

Команда для запуска программы выглядит примерно так:

Здесь многое нужно объяснить, поэтому разобьём на части:

-d — запуск образа в detached mode, а не в foreground mode

—restart=always — при сбое контейнера docker он перезапустится. Мы можем восстанавливаться после аварий, ура!

—e DIRECTORY=’/tmp/test’ — мы передаём при помощи переменных окружения каталог, который нужно отслеживать. (Также мы можем спроектировать нашу программу на python так, чтобы она считывала аргументы, и передавать отслеживаемый каталог таким способом.)

-v /tmp/:/tmp/ — монтируем каталог /tmp в каталог /tmp контейнера Docker. Это важно: любой каталог, который мы хотим отслеживать, ДОЛЖЕН быть видимым нашим процессам в контейнере docker, и именно так это реализуется.

directory-monitor — имя запускаемого образа

После запуска образа его состояние можно проверять с помощью команды docker ps :

Docker создаёт crazy-имена для запущенных контейнеров, потому что люди не очень хорошо запоминают значения хэшей. В данном случае имя crazy_wozniak относится к нашему контейнеру.

Теперь, поскольку мы отслеживаем /tmp/test на моей локальной машине, если я создам в этом каталоге новый файл, то это должно отразиться в логах контейнера:

Логи Docker демонстрируют, что приложение работает правильно

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

Делимся программой

Ваша докеризированная программа может пригодиться вашим коллегам, друзьям, вам в будущем, да и кому угодно в мире, поэтому нам нужно упростить её распространение. Идеальным решением для этого является Docker hub.

Если у вас ещё нет аккаунта, зарегистрируйтесь, а затем выполните логин из cli:

Логинимся в Dockerhub

Далее пометим и запушим только что созданный образ в свой аккаунт.

Добавляем метку и пушим образ

Теперь образ находится в вашем аккаунте docker hub

Чтобы убедиться, что всё работает, попробуем выполнить pull этого образа и использовать в сквозном тестировании всей проделанной нами работы:

Сквозное тестирование нашего образа docker

Весь этот процесс занял всего 30 секунд.

Что дальше?

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

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

Источники

На правах рекламы

Вдсина предлагает виртуальные серверы на Linux или Windows. Используем исключительно брендовое оборудование, лучшую в своём роде панель управления серверами собственной разработки и одни из лучших дата-центров в России и ЕС. Поспешите заказать!

Источник

Оцените статью