Краткое руководство и лучшие практики работы с Docker

Мы все были там,

«Это сработало на моей машине !!».

Кто не участвовал в этом заявлении?

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

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

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

Этот контейнер делает код самодостаточным и независимым от операционной системы.

Почему мы используем докеры?

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

  1. Убедитесь, что приложение будет одинаково работать во всех средах.
  2. Избавьте тех, кто будет использовать / запускать ваше приложение, от проблем обработки зависимостей и проблем с установкой.
  3. Избегайте работы с виртуальными машинами.
  4. Сосредоточьтесь на создании приложения, а не на управлении зависимостями.

Основы Docker

Итак, как работает Docker?

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

Изображений

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

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

Контейнеры

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

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

Dockerfiles

Dockerfiles - это файлы, которые содержат необходимую информацию для запуска приложения. Каждый образ должен содержать как минимум - и желательно - Dockerfile. Dockerfiles можно разделить на три основных раздела:

  1. Базовое изображение: ядро ​​приложения. Например, если приложению требуется Python 3 для правильной работы, тогда Python3 будет базовым образом, а в набор инструкций будут включены дополнительные библиотеки.
  2. Набор инструкций: Набор инструкций включает команды RUN; каждый из них представляет собой дополнительную библиотеку или двоичный файл, который необходимо установить или запустить.
  3. Команда ввода: это команды, которые запускаются после установки всех необходимых библиотек. Например, команда ввода может быть Открыть блокнот Jupyter или Запустить командную строку и т. Д.

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

Объемы

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

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

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

Реестры

Реестры являются эквивалентом репозитория для образов Docker. Он позволяет извлекать и подталкивать изображения контейнеров. Вы можете распространять свои изображения прямо со своего хоста Docker или использовать облачный агент, такой как Kubernetes, Docker Swarm или DockerHub. Использование таких сервисов позволяет получить полезные функции, такие как автоматическое развертывание и масштабирование.

Как начать пользоваться докером?

Шаг №1: Установка Docker

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

docker run

Если вы получите что-то вроде следующего, значит, все в порядке, и вы готовы приступить к работе!

Шаг №2: Ознакомьтесь с основными командами

Докеры - довольно широкое понятие. Однако вы можете очень далеко продвинуться, зная 6 основных команд: run, ps, rename, stop, начало и журналы.

Шаг №3: Подготовьте файл требований.

Вы можете напрямую добавить двоичные файлы и необходимые библиотеки в Dockerfile; лучше иметь их в отдельном файле. Этот файл часто называют Requirments.txt. Вот пример файла requirements.txt.

Шаг №4: Подготовьте Dockerfile.

Напишите простой и эффективный Dockerfile. Пора собрать лук изнутри. Нам нужно установить базовое изображение и команды ввода.

Шаг №5: Создайте образ Docker

Часто наш код размещается на GitHub, что упрощает создание образа кода. Если у вас есть GitHub локально, вы можете использовать командную строку и запустить команду repo2docker, чтобы создать образ из вашего репо.

Однако, если код, для которого вы пытаетесь создать изображение, находится на GitHub, вы можете использовать myBinder, чтобы сгенерировать и разместить изображение вашего репо. Вы сможете получить доступ к изображению, используя ссылку, предоставленную myBinder. Если вы используете myBinder, файл requirements.txt будет называться envrionment.yml и будет содержать ту же информацию, что и требования.

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

Если вы используете навигатор Anaconda, вы можете использовать командную строку Conda для создания файла envrionment.yml определенной среды с помощью этой команды:

conda env export --name ENVNAME > envname.yml

Шаг №6: Запускаем контейнер

Чтобы запустить контейнер, вы можете использовать команду запуска, о которой мы упоминали ранее, если контейнер уже загружен на ваш компьютер. Однако, если вы используете myBinder и изображение размещено в облаке, вы можете получить к нему доступ, используя ссылку, созданную с изображением. Ссылка добавляется в ваш файл readme.md и вызывает значок, запускающий контейнер.

Советы и рекомендации для лучшей практики

  1. Всегда проверяйте, что вы используете наиболее эффективное базовое изображение. Например, в случае Python3 выберите slim-buster или stretch-buster. Они имеют полную поддержку и хорошо работают с большинством библиотек DS и ML.
  2. Используйте метки, чтобы предоставить важную информацию, например советы по использованию и дополнительную информацию о приложении и необходимых библиотеках, а также о том, как они используются.
  3. Разделите команды выполнения, чтобы сделать их более читабельными. Поместите все необходимые библиотеки в файл Requirments.txt, чтобы все было организовано.
  4. Устанавливайте только необходимые пакеты. Это делает создание и запуск изображений более эффективным.
  5. Игнорировать файлы явно, чтобы избежать угроз безопасности (добавьте их в файл .ignore).
  6. Избегайте добавления данных: извлекайте данные из базы данных или облака (используйте привязки), но не кодируйте их жестко в образе.
  7. Если вы начинаете с Docker и хотите получить стандартный шаблон проекта, используйте шаблоны проектов CookieCutter data science или CookieCutter docker science.

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

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