Предпосылки

  • Основы машинного обучения
  • Угловые основы
  • Основы фляги
  • Настольное приложение Docker
  • Вывод из модели машинного обучения с использованием Angular и Flask — Сквозная реализация — Ссылка

Проблемы индустриализации приложений

  • Приложение должно работать в разных системах, независимо от ОС, таких как Windows, Linux и т. д.
  • Как легко добиться масштабируемости без больших накладных расходов?
  • Как добиться балансировки нагрузки?
  • Как обеспечить более быструю доставку и повторные итерации приложений?

Решение

  • Контейнеризация может решить все описанные выше проблемы.
  • Для контейнеризации можно использовать несколько инструментов, таких как Docker, Cloud Foundry, Containerd, CoreOS rkt и т. д. Но в этом блоге мы сосредоточимся на Docker, учитывая его популярность и преимущества.

Что такое Docker?

  • Docker — это программное обеспечение, которое использует виртуализацию на уровне ОС для доставки приложения в пакеты, называемые контейнерами. Docker дает возможность отделить зависимость ваших приложений от инфраструктуры. Процесс упаковки, развертывания и запуска приложений с использованием контейнера Docker называется Dockerizing.
  • Docker имеет как бесплатную, так и платную версии в зависимости от коммерческого/некоммерческого использования, индивидуального/бизнес-использования и количества сотрудников/дохода. По состоянию на март 2023 года существует четыре версии: личная, профессиональная, командная и деловая. Для получения более подробной информации перейдите по этой ссылке.

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

  • Контейнер — это технология виртуализации, в которой системные ресурсы, такие как ОЗУ, ЦП, диск и т. д., могут быть виртуализированы и представлены в виде нескольких ресурсов.
  • Контейнеры — это легкие программные пакеты, которые содержат все зависимости, необходимые для выполнения содержащегося в них программного приложения. Эти зависимости включают в себя такие вещи, как системные библиотеки, внешние сторонние пакеты кода и другие приложения уровня операционной системы.

Разница между контейнером и виртуальной машиной?

  • Контейнер может показаться очень похожим на виртуальную машину, но у него есть несколько отличительных особенностей.
  • Основное различие между контейнером и виртуальной машиной заключается в том, что контейнеры виртуализируются поверх ОС, тогда как виртуальная машина виртуализирует базовую физическую инфраструктуру.
  • Размер также является важным фактором, поскольку контейнер имеет меньший вес (в основном в пересчете на мегабайты). Но, последние, виртуальные машины намного больше в диапазонах ГБ. Этот размер напрямую влияет на время загрузки и настройки, т. е. контейнеры можно быстро настроить, тогда как виртуальные машины требуют больше времени.

Архитектура Docker

  • Как видно из диаграммы архитектуры, Docker обычно использует архитектуру клиент-сервер.
  • Клиент Docker — это механизм, с помощью которого пользователи взаимодействуют с Docker. Команды Docker API выполняются пользователем здесь. Обратите внимание, что клиент Docker может взаимодействовать с несколькими демонами.
  • Docker Host или демон Docker — это ядро, которое выполняет тяжелую работу по созданию, запуску и распространению контейнеров Docker. Демон Docker прослушивает запросы Docker API от клиента и выполняет полученные команды. Обратите внимание, что демон Docker может взаимодействовать с другими демонами для управления службами Docker.
  • Демон Docker и клиент могут работать в одной и той же системе, либо клиент может подключиться к удаленному демону Docker. Клиент и демон взаимодействуют с помощью REST API через сокеты UNIX или сетевой интерфейс.
  • Еще одним важным компонентом является Изображение. Образ — это шаблон только для чтения с инструкциями по созданию контейнера Docker. Как правило, изображение будет основано на другом изображении с дополнительными настройками в зависимости от конкретного варианта использования. Чтобы создать собственный образ, мы можем создать Dockerfile с инструкциями по созданию образа и его запуску.
  • Последняя часть — это реестр Docker. Это место, где мы храним образы Docker. Docker Hub – это общедоступный реестр, содержащий образы Docker. Когда мы создаем образ, используя другие образы, Docker по умолчанию будет искать этот образ в Docker Hub.

Внедрение Docker — шаги

Шаг 1. Установите Docker

  • Следуйте инструкциям по этой ссылке.

Шаг 2. Выберите базовое изображение

  • На основе приложения, которое мы пытаемся Dockerize, нам нужно получить базовый образ из общедоступного реестра Docker. Это сократит большую часть усилий по созданию нового имиджа. Базовым образом может быть Node, Python, Java и т. д.

Шаг 3. Установите необходимые пакеты

  • Установите только те пакеты или модули, которые необходимы для вашего приложения. Пакеты можно устанавливать, указав имена пакетов по отдельности, или можно использовать аналогичный подход, используемый при разработке приложений.
  • Возьмем пример приложения на основе узла. Обычно файлы package.json и package.lock.json используются для указания всех необходимых пакетов и модулей. Используя этот файл в качестве справки, все пакеты и зависимости могут быть установлены одновременно.

Шаг 4. Скопируйте необходимые файлы в рабочий каталог

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

Шаг 5. Настройте запуск контейнера

  • Обычно это достигается путем определения точки входа и команды для выполнения. Этот шаг зависит от используемого базового изображения.

Пример реализации

  • В этом примере реализации мы попробуем докеризировать приложения Flask и Angular по отдельности. Затем мы попытаемся запустить образ и установить соединение из контейнера Angular с контейнером Flask для использования API.
  • Приложение, которое мы пытаемся реализовать здесь, представляет собой базовое приложение для определения надежности пароля на основе машинного обучения. Пожалуйста, проверьте этот блог, чтобы узнать больше о моделировании машинного обучения, настройке Angular и Flask для этого приложения. Весь репозиторий кода GitHub можно найти здесь. В этом блоге мы постараемся больше сосредоточиться на Dockerizing и запуске Dockerized контейнера.

Докеризация приложения Flask

Создайте файл с именем «Dockerfile»

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

Извлеките образ Python

FROM python:3.7.2-slim
  • Поскольку Flask — это фреймворк на основе Python, мы извлекаем образ Python. Обратите внимание, что есть несколько изображений python, чтобы узнать больше о типах, перейдите по этой ссылке.

Скопируйте файл требований и переключите рабочий каталог

COPY ./requirements.txt /app/requirements.txt
  • На этом этапе мы пытаемся установить зависимости, необходимые для нашего приложения. Для этого мы перемещаем файл requirements.txt из локальной системы в образ.

Переключите рабочий каталог и установите зависимости

WORKDIR /app
RUN pip install -r requirements.txt
  • Во-первых, мы переключаем текущий рабочий каталог изображения на /app. Затем мы выполняем команду pip install, чтобы прочитать и установить все зависимости, указанные в файле requirements.txt.

Копировать содержимое из локального в изображение

COPY . /app
  • Теперь мы перемещаем все необходимые файлы из нашего локального каталога в образ.
  • Примечание. Если есть какие-либо файлы или папки, которые не следует включать в перемещение в образ, их можно упомянуть в отдельном файле с именем .dockerignore.

Настройте контейнер для запуска

ENTRYPOINT [ "python" ]
CMD ["app.py" ]
  • Мы определяем точку входа как python, за которой следует команда для запуска этого приложения.

Создайте свой образ

  • Перейдите в каталог с файлом докера и выполните приведенную ниже команду. Здесь флаг -t используется для пометки изображения, чтобы его было легче найти с помощью команды docker images.
docker build . -t server:3.0
  • После успешного выполнения команды вы сможете увидеть созданный образ в настольном приложении Docker на вкладке «Изображения».

Запустите образ как контейнер

  • Чтобы запустить образ как контейнер, используйте команду, указанную ниже. Флаг -d означает запуск контейнера в автономном режиме, при этом контейнер остается работающим в фоновом режиме. Принимая во внимание, что флаг -p перенаправляет общедоступный порт на частный порт внутри контейнера, выступая в качестве моста между общедоступным портом и контейнером.
docker run -p 5011:5011 -d server:1.0
  • Порт, указанный слева, представляет собой общедоступный порт, на котором будет работать приложение. И порт, упомянутый справа, указывает на частный порт внутри контейнера. После запуска команды вы сможете получить доступ к API этого приложения Flask.

Докеризация приложения Angular

  • Поскольку мы уже видели пример настройки приложения Docker в деталях, учитывая длину контента, мы постараемся сделать объяснение реализации Angular кратким. Код Dockerfile для докеризации приложения Angular показан ниже:
  # Stage 1
  #Download Node Alpine image
  FROM node:12.16.1-alpine as build
  #Setup the working directory
  WORKDIR /usr/src/ng-app
  #Copy package.json
  COPY package.json package-lock.json ./
  #Install dependencies
  RUN npm install
  #Copy other files and folder to working directory
  COPY . .
  #Build Angular application in PROD mode
  RUN npm run build

  # -----------------------------------
  # Stage 2
  #Download NGINX Image
  FROM nginx:1.15.8-alpine
  #Copy built angular app files to NGINX HTML folder
  COPY --from=build /usr/src/ng-app/dist/client/ /usr/share/nginx/html

Как видно из приведенного выше кода, докеризация приложения Angular включает два этапа:

Этап 1 — сборка приложения Angular и создание файлов dist

  • Для этого этапа мы используем изображение узла alpine. Затем устанавливаем все необходимые зависимости. Наконец, мы запускаем команду сборки для создания файлов dist.

Этап 2 — Запустите сгенерированные dist-файлы с помощью NGINX.

  • Мы используем образ NGINX на втором этапе. Этот этап включает в себя копирование всех сгенерированных файлов dist из образа alpine узла этапа 1 в образ NGINX.

Создайте свой образ

  • Перейдите в каталог с файлом докера и выполните приведенную ниже команду.
docker build . -t client:1.0
  • После успешного выполнения команды вы сможете увидеть созданный образ в настольном приложении Docker на вкладке «Изображения».

Запустите образ как контейнер

  • Чтобы запустить образ как контейнер, используйте команду, указанную ниже:
docker run -p 4200:80 -d client:1.0
  • После успешного выполнения команды перейдите на localhost: 4200, приложение angular будет работать, как показано ниже:

  • Поскольку серверная часть этого углового приложения, т. е. Flask, открыта через порт 5011, угловое приложение сможет успешно взаимодействовать с серверной частью Flask и получить требуемый ответ. Для тестирования нажмите кнопку «Ping Server to Test Connection», мы должны получить предупреждающее сообщение «Успешно», что означает, что связь с сервером установлена ​​успешно.
  • Чтобы проверить надежность пароля, введите пароль в поле ввода и нажмите кнопку «Проверить надежность пароля». Надежность пароля будет получена от серверной части и показана в виде предупреждения, как показано ниже:

Заключение

  • Таким образом, докер подробно объясняется вместе с проблемами, которые он может преодолеть. Мы также обсудили шаги, необходимые для докеризации приложения. Наконец, мы реализовали простое приложение для определения надежности пароля на основе Angular Flask ML и докеризовали его. Связь между двумя докерами была успешно установлена ​​с использованием общедоступного порта.

Рекомендации