Когда я гуглил информацию о фреймворках глубокого обучения (deep learning), я заметил, что почти каждый из этих фреймворков поддерживался Docker. В итоге у меня возник резонный вопрос: “А что это за Docker такой?”
Но перед тем как мы обратимся к основной теме, нам нужно понять, что из себя представляют виртуальные машины и контейнеры.
Что такое «виртуальные машины» и «контейнеры»?
Контейнеры и виртуальные машины выполняют схожие задачи: они изолируют приложение и его зависимости в отдельный автономный модуль (или контейнер), который может быть запущен где угодно.
Кроме того, контейнеры и виртуальные машины устраняют необходимость в физическом оборудовании и дополнительном “железе”, что позволяет более эффективно использовать вычислительные ресурсы: как с точки зрения энергопотребления, так и с точки зрения финансовых затрат.
Основное различие между контейнерами и виртуальными машинами заключается в их архитектурном подходе.
Как видно из приведенной выше диаграммы, виртуальные машины установлены поверх 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.
docker pull hello-world
Чтобы посмотреть образ, введите следующую команду:
docker image ls
И наконец, момент, которого вы так ждали — Hello, world в Docker
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
Вы можете увидеть, что размер образа составляет всего 111 МБ, по сравнению с минимум 10 ГБ, которые мы выделяем при использовании виртуальной машины.
Также обратите внимание на то, что когда у нас нет тега -t при сборке, имя репозитория и тег отсутствуют. Поэтому, когда мы пытаемся использовать этот образ, мы должны помнить его IMAGE ID.
-t пишется в основном в формате repository:tag
Если вы забыли поставить тег, Docker по умолчанию помечает его как latest.
И наконец
docker run --rm -it ubuntu1:latest
— rm гарантирует, что после того, как будет запущен контейнер, он будет немедленно удален после него
— it потому что мы хотим взаимодействовать с помощью терминала
Вы можете вводить все команды, которые вы обычно вводите в вашей системе Ubuntu, в этом терминале Docker.
Заключение
Я надеюсь, что теперь вы оснащены всеми необходимыми знаниями по Docker и способны реализовать весь потенциал этого невероятного инструмента!
Перевод статьи Chinmay Shah: Why you should care about Docker?