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. Скорее всего, при первом запуске у вас не будет ни образов, ни контейнеров.
3. Создание контейнера Docker с помощью Dockerfile
Для создания контейнера используется файл Dockerfile (без расширения). Dockerfile сообщает Docker о том, как собирать образы, на основе которых создаются контейнеры.
1. В терминале делаем папку с рабочим проектом текущей с помощью команды cd/Users/artemgruzdev/Documents/ds_project.
2. В рабочей папке создаем файл Dockerfile, в нем мы потом укажем инструкцию, по которой Docker подготовит окружение для проекта. Итак, в терминале запускаем команду cat > Dockerfile и нажимаем Ctrl + D.
Открываем файл Dockerfile (например, можно открыть с помощью программы TextEdit) и теперь для сборки образа контейнера для проекта вносим в Dockerfile следующий текст-инструкцию:
3. Если файл requirements.txt не создан (в нашем случае создан, шаг можно пропустить), создаем его в папке с рабочим проектом. В нем указываем нужные библиотеки и их версии. Это упростит работу:
• не потребуется устанавливать каждую библиотеку отдельно. При запуске контейнера Docker сразу вставит нужные библиотеки;
• перечисление версий используемых библиотек гарантирует, что модель покажет одинаковые результаты на другом компьютере или спустя какое-то время.
В нашем случае содержимое файла requirements.txt будет таким:
4. Кроме того, в той же рабочей папке заведем файл .dockerignore, в котором можно перечислить файлы по маске, которые не нужно будет копировать из текущей папки в образ Docker. Например, такие, как файлы README* , Dockerfile* и т.п. Для этого в терминале запускаем команду cat > .dockerignore, вводим Dockerfile*, README* и нажимаем Ctrl + D.
Файл .dockerignore является скрытым и может не отображаться, для отображения можно воспользоваться комбинацией клавиш Command + Shift + . (точка).
5. После создания файла Dockerfile выполним команду docker build -t megafon_2 ., где:
• -t megafon_2 – задает тэг образа (в данном случае новый образ будет называться megafon_2);
• . – указывает на путь, где лежит Dockerfile. В данном случае Dockerfile находится в текущей папке.
6. После выполнения команды создается образ megafon_2.
Чтобы проверить, что образ создался корректно, выполним команду docker images. В результате в списке образов видим образ megafon_2:
Кроме того, убедиться в создании образа можно с помощью пункта Dashboard приложения Docker Desktop.
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" – команда, которая запускается внутри контейнера.
8. После того как контейнер запустился и в нем запустился, копируем из консольной строки адрес доступа к jupyter notebook вместе с ТОКЕНОМ, например,
http://127.0.0.1:8888/?token=bd086334f7516bee8629efa384023844e3ecede7206ff832
Вставляем его в адресную строку браузера и запускаем.
Сгенерированный токен записываем отдельно, его можно будет в дальнейшем использовать как пароль доступа к jupyter notebook в данном контейнере.
Если при отработке решения в тетрадке возникают ошибки о нехватке ресурсов, попробуйте увеличить ресурсы, выбрав пункт Preferences приложения DockerDesktop и затем Resources.
Папка с рабочим проектом https://drive.google.com/file/d/1aoQVJ6tux5JvWFMFysakur1CD1TU7b_P/view?usp=sharing