- Docker: размещение и запуск Python сценария
- Что такое контейнер?
- Размещение скрипта Python в Docker
- 1. Создайте Dockerfile.
- 2. Создание образа из Dockerfile
- 3. Запустите образ докера.
- Как превратить скрипт на Python в «настоящую» программу при помощи Docker
- Для кого предназначена эта статья?
- Репозитории Github и Docker
- Но… почему Docker?
- Наше приложение
- Создаём Dockerfile
- Сборка образа
- Запуск образа
- Делимся программой
- Что дальше?
- Источники
- На правах рекламы
Docker: размещение и запуск Python сценария
В этой статье мы подробно рассмотрим процесс размещения скрипта Python в контейнере Docker.
Что такое контейнер?
Контейнер представляет собой пакет всех требований к системе и программному обеспечению, которые необходимы для запуска приложения. Он состоит из исполняемых файлов времени выполнения, системных настроек, кода и библиотек.
Таким образом, с контейнерами мы можем изменять спецификации, поскольку контейнеры доступны для записи, а затем легко размещать в них приложения.
Размещение скрипта Python в Docker
Разобравшись с контейнерами, пора реализовать сценарий через контейнеры. Тем самым мы гарантируем, что контейнер позаботится обо всех требованиях и хостинге.
Перед развертыванием скрипта давайте разберемся, как размещается приложение в Docker контейнере.
- Сначала нам нужно создать Dockerfile. Dockerfile является конфигом, который необходим для создания Docker images. Он содержит все необходимые команды, которые мы обычно выполняем через командную строку для создания образа контейнера.
- Создав Dockerfile, нам теперь нужно создать образ поверх Dockerfile. Docker images можно рассматривать как шаблон, который помогает создать контейнер в докер. Он упаковывает приложения и устанавливает серверную среду, что упрощает нам использование среды для размещения приложений в контейнерах удобным способом.
- Теперь мы можем запустить изображение, чтобы увидеть вывод скрипта python. Как только образ запускается, создается контейнер со случайным именем.
Теперь приступим к реализации!! Мы будем использовать приведенный ниже сценарий 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 предлагает определенные директивы, как показано ниже —
- FROM — Эта директива устанавливает базовый образ для последующих инструкций по работе. В этом примере мы установили Python версии 3 в качестве базового изображения. Теперь Dockerfile получит этот базовый образ из Docker Hub, который на самом деле является репозиторием образов с открытым исходным кодом.
- ADD — инструкция ADD копирует новые файлы, каталоги или URL-адреса удаленных файлов из и добавляет их в файловую систему изображения по пути . В нашем случае src = sample.py , и пункт назначения /
- 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
Как превратить скрипт на 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. Используем исключительно брендовое оборудование, лучшую в своём роде панель управления серверами собственной разработки и одни из лучших дата-центров в России и ЕС. Поспешите заказать!