Найти в Дзене
ИЦ "ГЕВИССТА"

Краткое знакомство с Docker

Оглавление

1. Введение

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

Возникает вопрос, зачем нужен Docker в DS-проектах?

Скорость. Docker позволяет быстро создать среду разработки для data scienceпроекта. Вам не потребуется отдельно устанавливать python, anaconda или библиотеки для data science. Все, что нужно – найти подходящий образ Docker и запустить контейнер.
Повторяемость. При запуске Docker можно указать версии библиотек, используемых в проекте. Это гарантирует, что ваша модель покажет те же результаты на другом компьютере или спустя какое-то время.
Мобильность. Контейнер Docker можно использовать на локальном компьютере, на компьютере коллеги или на сервере поставщика облачных услуг.

В Docker существует 2 основных понятия – образ (image) и контейнер (container).

Образ (image) — это шаблон, который используются для создания контейнера. В образе контейнера Docker указывается операционная система и библиотеки для анализа данных. Образы можно собирать самостоятельно или использовать уже готовые, которые хранятся в Docker Hub.

Контейнер (container) – это рабочий экземпляр образа. Контейнеры состоят из слоев. Каждый слой, кроме последнего, устанавливает ПО или библиотеку.

Файл Dockerfile — это текстовый файл, который сообщает Docker о том, какие слои и в каком порядке нужно добавить в контейнер. Этот файл содержит описание базового образа и дополнительных слоев (например, библиотек NumPy, Pandas, Scikit-learn и пр.). Среди популярных официальных базовых образов для datascience можно отметить:

• jupyter/base-notebook – образ содержит только Jupyter Notebook, нет никаких предустановленных библиотек;

• jupyter/scipy-notebook – образ уже содержит Jupyter Notebook, библиотеки pandas, matplotlib, scipy, seaborn, scikit-learn, statsmodel, beautifulsoup и пр.;

• jupyter/tensorflow-notebook – все из образа jupyter/scipy-notebook, а также дополнительно библиотеки tensorflow, keras.

Более подробно изучить образы контейнеров Docker можно тут: https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html.

Репозиторий контейнеров (Docker Hub). Это облачное хранилище, где хранятся образы, собранные разработчиками или пользователями Docker. Самым крупным хранилищем является репозиторий Docker Hub. Он используется при работе с Docker по умолчанию.
Платформа Docker (Docker Platform) — это программа, которая даёт возможность упаковывать приложения в контейнеры и запускать их на серверах. 
Тома Docker (Docker Volumes) – хранилище информации, используемое в контейнерах.

Docker Compose — это инструмент, который упрощает развёртывание приложений, для работы которых требуется несколько контейнеров Docker. Docker Composeпозволяет выполнять команды, описываемые в файле docker-compose.yml.

Docker управляется командной строкой в терминале. Вcе команды начинаются  с ключевого слова docker, за которым идёт пробел, затем указание на то, на что именно будет направлена команда (container, image, volume и пр.), потом ещё один пробел, а потом следует сама команда. Например, именно так построена такая команда: docker container stop container_id.

Общая схема команд для управления контейнерами выглядит так: docker my_command my_container, где:

• my_container – имя или id контейнера;

• my_command – команда.

Перечислим основные команды для управления контейнерами:

• create – создание контейнера из образа;

• start – запуск существующего контейнера;

• run – создание контейнера и его запуск;

• ls – вывод списка работающих контейнеров;

• inspect – вывод подробной информации о контейнере;

• logs – вывод логов;

• stop – корректная остановка контейнера;

• kill – быстрая остановка контейнера;

• rm – удаление остановленного контейнера.

2. Запуск контейнера Docker

Устанавливаем Docker Desktop https://www.docker.com/products/docker-desktop и запускаем.

Создаем папку с рабочим проектом локально на компьютере. Допустим, путь к папке выглядит так: /Users/user/Documents/ds_project. В моем случае путь к папке выглядит так: /Users/artemgruzdev/Documents/ds_project.

Папка ds_project содержит папку Data, в которой находятся исторический набор contest_train.csv и набор новых данных contest_test.csv, тетрадку MegaFon Accelerator(2-е место).ipynb с решением задачи MegaFon Accelerator с Kaggle, дающим 2-е место в приватном лидерборде https://www.kaggle.com/c/mf-accelerator, и текстовый файл requirements.txt с описанием версий необходимых библиотек. Файл requirements.txt содержит следующие записи:

Открываем любой терминал.

После установки Docker запустите в терминале команду docker, тем самым проверяем, что Docker установлен правильно.

Выведем список созданных образов командой docker image ls и список запущенных контейнеров командой docker ps -as. Скорее всего, при первом запуске у вас не будет ни образов, ни контейнеров.

-2

3. Создание контейнера Docker с помощью Dockerfile

Для создания контейнера используется файл Dockerfile (без расширения). Dockerfile сообщает Docker о том, как собирать образы, на основе которых создаются контейнеры.

1. В терминале делаем папку с рабочим проектом текущей с помощью команды cd/Users/artemgruzdev/Documents/ds_project.

-3

2. В рабочей папке создаем файл Dockerfile, в нем мы потом укажем инструкцию, по которой Docker подготовит окружение для проекта.  Итак, в терминале запускаем команду cat > Dockerfile и нажимаем Ctrl + D.

-4

Открываем файл Dockerfile (например, можно открыть с помощью программы TextEdit) и теперь для сборки образа контейнера для проекта вносим в Dockerfile следующий текст-инструкцию:

Рис. 1 Заполнение Dockerfile
Рис. 1 Заполнение Dockerfile

3. Если файл requirements.txt не создан (в нашем случае создан, шаг можно пропустить), создаем его в папке с рабочим проектом. В нем указываем нужные библиотеки и их версии. Это упростит работу:

• не потребуется устанавливать каждую библиотеку отдельно. При запуске контейнера Docker сразу вставит нужные библиотеки;

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

В нашем случае содержимое файла requirements.txt будет таким:

Рис. 2 Содержание файла requirements.txt
Рис. 2 Содержание файла requirements.txt

4. Кроме того, в той же рабочей папке заведем файл .dockerignore, в котором можно перечислить файлы по маске, которые не нужно будет копировать из текущей папки в образ Docker. Например, такие, как файлы README* , Dockerfile* и т.п. Для этого в терминале запускаем команду cat > .dockerignore, вводим Dockerfile*, README* и нажимаем Ctrl + D.

-7

Файл .dockerignore является скрытым и может не отображаться, для отображения можно воспользоваться комбинацией клавиш Command + Shift + . (точка).

Рис. 3 Файл .dockerignore
Рис. 3 Файл .dockerignore

5. После создания файла Dockerfile выполним команду docker build -t megafon_2 ., где:

-t megafon_2 – задает тэг образа (в данном случае новый образ будет называться megafon_2);

. – указывает на путь, где лежит Dockerfile. В данном случае Dockerfile находится в текущей папке.

-9

6. После выполнения команды создается образ megafon_2.

Чтобы проверить, что образ создался корректно, выполним команду docker images. В результате в списке образов видим образ megafon_2:

-10

Кроме того, убедиться в создании образа можно с помощью пункта Dashboard приложения Docker Desktop.

Рис. 4 Работа с приложением Docker Desktop: образ Docker
Рис. 4 Работа с приложением Docker Desktop: образ Docker

7. Теперь из созданного образа нужно запустить контейнер

docker run -it --name meg2 -p 8888:8888 megafon_2 /bin/bash -c "jupyter notebook --notebook-dir=/mnt/jupyter/ --ip='*' --port=8888 --no-browser",

где:

docker run – команда, создающая и запускающая контейнер из образа;

-p 8888:8888 – указывает, какой порт будет открыт у контейнера;

--name – задает имя контейнера (в данном примере контейнер называется meg2);

Megafon_2 – образ, из которого запускается контейнер;

/bin/bash -c "jupyter notebook --notebook-dir=/mnt/jupyter/ --ip='*' --port=8888 --no-browser" – команда, которая запускается внутри контейнера.

-12

8. После того как контейнер запустился и в нем запустился, копируем из консольной строки адрес доступа к jupyter notebook вместе с ТОКЕНОМ, например,

http://127.0.0.1:8888/?token=bd086334f7516bee8629efa384023844e3ecede7206ff832

Вставляем его в адресную строку браузера и запускаем.

Рис. 5 Запуск Jupiter Notebook
Рис. 5 Запуск Jupiter Notebook

Сгенерированный токен записываем отдельно, его можно будет в дальнейшем использовать как пароль доступа к jupyter notebook в данном контейнере.

Если при отработке решения в тетрадке возникают ошибки о нехватке ресурсов, попробуйте увеличить ресурсы, выбрав пункт Preferences приложения DockerDesktop и затем Resources.

Рис. 6 Работа с приложением Docker Desktop: настройка ресурсов
Рис. 6 Работа с приложением Docker Desktop: настройка ресурсов

Папка с рабочим проектом https://drive.google.com/file/d/1aoQVJ6tux5JvWFMFysakur1CD1TU7b_P/view?usp=sharing