Разработка приложения для сквозного NLP-генератора текста (часть 3) — Использование Docker и локальное развертывание приложения

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

В части 1 мы сосредоточились на создании двунаправленной модели LSTM, перейдите по этой ссылке, если вы ее еще не видели:



Во второй части мы сосредоточились на создании полнофункционального приложения с помощью FLASK. Если вы еще не видели его, перейдите по этой ссылке:



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

Что вызывает вопрос:

"Что такое Docker-контейнер?"

Из документации докера:

«Контейнер — это стандартная единица программного обеспечения, которая упаковывает код и все его зависимости, чтобы приложение быстро и надежно запускалось из одной вычислительной среды в другую. Образ контейнера Docker – это легкий автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки".

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

Докер-образы

Контейнеры строятся на основе так называемых образов. Эти образы определяются Dockerfile.

Если мы вспомним древовидную структуру нашего проекта, показанную во второй части, мы увидим, что в каждой папке есть свой Dockerfile.

API

API Dockerfile выглядит следующим образом:

Команда FROM указывает Родительский образ, из которого вы строите. В нашем случае нам нужен образ python 3.7. В конце концов вы можете выбрать Ubuntu, Windows или другой родительский образ для сборки.

WORKDIR задает рабочий каталог для любых инструкций run, cmd, copy и add, которые следуют за ним в Dockerfile.

Инструкция ADD копирует новые файлы, каталоги. Поэтому в данном случае мы копируем содержимое папки API.

Команды RUN устанавливают uwsgi и библиотеки, указанные в файле api/requirements.txt.

CMD выполняет протокол uwsgi, установленный в файле api/app.ini.

КЛИЕНТ

Клиентский Dockerfile выглядит следующим образом:

Файл следует тем же командам, что и api/Dockerfile.

Nginx

Dockerfile nginx выглядит следующим образом:

Файл nginx/Docker начинается с загрузки образа nginx, затем удаления файла .conf из образа и замены его нашим файлом nginx.conf.

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

Одним из подходов может быть изменение каждого файла докера, сборка образов и запуск контейнеров по отдельности. Другой подход — использовать docker-compose, чтобы сообщить докеру, какой образ нужно создать, и порядок запуска каждого контейнера.

Docker-Compose

Чтобы включить использование docker-compose, нам нужно создать файл docker-compose.yml как набор инструкций для docker.

Файл начинается с указания сборки образа API и предоставления порта 8080 для этого контейнера. Затем мы указываем сборку образа клиента, раскрывая порт 6060 и объявляя, что этот контейнер связан с API, поэтому контейнер API должен быть запущен до того, как клиент. Наконец, мы указываем контейнер nginx и устанавливаем внешний порт на 9080 и направляем его на порт 80 этого контейнера.

В основном это означает, что весь трафик через порт 9080 назначается как порт 80 контейнера nginx.

Локальное развертывание

Теперь, когда наше приложение, контейнер и файлы docker-compose определены, мы можем развернуть приложение локально, запустив команды docker-compose build и docker-compose up.

Заключение части 3

Да, нам нужно развернуть наше приложение локально, используя докер. 🐋

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

Спасибо за чтение!