Docker

Когда я гуглил информацию о фреймворках глубокого обучения (deep learning), я заметил, что почти каждый из этих фреймворков поддерживался Docker. В итоге у меня возник резонный вопрос: “А что это за Docker такой?”


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

Что такое «виртуальные машины» и «контейнеры»?

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

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

VMs and Container architecture

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

Что такое Docker?

Docker отделяет код приложения от требований и потребностей вашей конкретной инфраструктуры, путем запуска каждого приложения в изолированной среде, называемой «контейнер».

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

Так почему вы должны обратить внимание на Docker?

Каждый отдельный Docker-контейнер начинается с ванильного Linux, который “ничего не знает”.

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

1. Простота в использовании: Docker значительно облегчает использование контейнеров кому бы то ни было (разработчикам, системным администраторам, архитекторам и другим) для быстрого создания и тестирования приложений. Это позволяет любому пользователю упаковать приложение на свой ноутбук, которое, в свою очередь, может работать без изменений в любом общедоступном облаке. Мантра гласит: «Построй один раз, запускай где угодно».

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

3. Docker Hub. Пользователи Docker также получают выгоду от богатой и постоянно растущей экосистемы Docker Hub, которую вы можете рассматривать как «магазин приложений для Docker». Сообщество Docker Hub имеет десятки тысяч образов в свободном доступе, которые вы можете свободно использовать. Вы с легкостью сможете найти готовые и рабочие образы, которые будут отвечать всем вашим потребностям. И вам даже не придется модифицировать их (либо придется, но немного).

4. Модульность и масштабируемость: Docker позволяет легко разбить функциональность вашего приложения на отдельные контейнеры. Например, база данных Postgres может работать в одном контейнере, а сервер Redis — во втором, в то время как приложение Node.js находится в третьем. С помощью Docker стало проще связывать эти контейнеры вместе, для создания приложения, что упрощает масштабирование или независимое обновление компонентов в будущем.


Начало работы с Docker

Перейдите на официальный веб-сайт Docker. Если вы используете Windows 10 Home Edition — вам нужен Docker Toolbox.
 
Как только вам удастся установить Docker, давайте попробуем запустить на нем образ Ubuntu — подробнее об этом позже.

Docker позволяет вам загружать и использовать необходимые образы с Docker Hub, либо изменять загруженные образы и использовать их для создания новых образов.

Прежде чем мы начнем работать с Dockerfile, давайте удостоверимся, что установка завершена.

На рабочем столе найдите Docker Quickstart Terminal и запустите его.

Docker Quick Start Terminal

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

docker pull hello-world
docker pull command

Чтобы посмотреть образ, введите следующую команду:

docker image ls

И наконец, момент, которого вы так ждали — Hello, world в Docker

запуск контейнера hello-world
docker run hello-world

Dockerfile — там, где все начинается

Docker может автоматически создавать образы, читая инструкции из Dockerfile. Файл Dockerfile представляет из себя текстовый документ, содержащий все команды для сборки образа. С помощью команды docker buildпользователи могут производить автоматизированную сборку, которая выполняет последовательность инструкций в командной строке. — Docker, Справочник по Dockerfile

Docker-образ состоит из read-only (только для чтения) слоёв, каждый из которых описывает какую-то Dockerfile инструкцию. Слои уложены друг на друга и каждый слой описывает какое-то изменение, которое должно быть выполнено с данными на запущенном контейнере.

Когда контейнер Docker запускается, ему нужно сказать, что делать, потому что в нем ничего не установлено.

Первое, что нужно Dockerfile — это базовый образ. Базовый образ сообщает контейнеру, что установить в качестве его ОС — Ubuntu, RHEL, SuSE, Node, Java и т.д.

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

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

Запускаем Ubuntu на Docker

Ниже приведены несколько примеров Dockerfiles, вместе с комментариями, разъясняющими каждую строчку и то, что происходит слой за слоем.

# Get the base ubuntu 18.04 from Docker hub

# Head to https://hub.docker.com/_/ubuntu for other variations

FROM ubuntu:18.04

# Get the necessary updates

RUN apt-get update

# This ensures that the first directory that is opened once image is # build is /home

WORKDIR /home

Сохраните этот файл как Dockerfile.

Теперь запустите Docker Quickstart Terminal и убедитесь, что текущая директория и место, в котором хранится Dockerfile, совпадают.

docker build .

Теперь, когда вы это сделали, несмотря на то что Docker создает образ из Dockerlife и контекста, вам нужно будет запомнить случайное имя, данное ему Docker’ом, поскольку мы еще не успели назвать его. 

docker build -t ubuntu1:latest .

Теперь эта сборка образа будет называться ubuntu1.

docker image ls
Docker images

Вы можете увидеть, что размер образа составляет всего 111 МБ, по сравнению с минимум 10 ГБ, которые мы выделяем при использовании виртуальной машины.

Также обратите внимание на то, что когда у нас нет тега -t при сборке, имя репозитория и тег отсутствуют. Поэтому, когда мы пытаемся использовать этот образ, мы должны помнить его IMAGE ID.

-t пишется в основном в формате repository:tag

Если вы забыли поставить тег, Docker по умолчанию помечает его как latest.

И наконец

docker run --rm -it ubuntu1:latest

— rm гарантирует, что после того, как будет запущен контейнер, он будет немедленно удален после него

 — it потому что мы хотим взаимодействовать с помощью терминала

Вы можете вводить все команды, которые вы обычно вводите в вашей системе Ubuntu, в этом терминале Docker.

Заключение

Я надеюсь, что теперь вы оснащены всеми необходимыми знаниями по Docker и способны реализовать весь потенциал этого невероятного инструмента!

Перевод статьи Chinmay ShahWhy you should care about Docker?