Технологии контейнеризации приложений нашли широкое применение в сферах разработки ПО и анализа данных. Эти технологии помогают сделать приложения более безопасными, облегчают их развёртывание и улучшают возможности по их масштабированию. Рост и развитие технологий контейнеризации можно считать одним из важнейших трендов современности.

Docker — это платформа, которая предназначена для разработки, развёртывания и запуска приложений в контейнерах. Слово «Docker» в последнее время стало чем-то вроде синонима слова «контейнеризация». И если вы ещё не пользуетесь Docker, но при этом работаете или собираетесь работать в сферах разработки приложений или анализа данных, то Docker — это то, с чем вы непременно встретитесь в будущем.

image

Если вы пока не знаете о том, что такое Docker, сейчас у вас есть шанс сделать первый шаг к пониманию этой платформы. А именно, освоив этот материал, вы разберётесь с основами Docker и попутно приготовите пиццу.

Метафоры и Docker


Мы постоянно сталкиваемся с метафорами. Если заглянуть в словарь Ожегова, то окажется, что метафора — это «скрытое образное сравнение, уподобление одного предмета, явления другому». Метафоры помогают нам ухватывать суть новых для нас явлений. Например, виртуальные контейнеры можно сравнить с обычными пластиковыми контейнерами. Такое сравнение, через сопоставление уже известных нам свойств обычных контейнеров со свойствами виртуальных контейнеров, поможет сначала с ними познакомиться, а потом и понять их сущность.


Контейнер

Как вы понимаете, мы собираемся начать разговор о Docker с понятия «контейнер».

Контейнер


Как и обычный пластиковый контейнер, контейнер Docker обладает следующими характеристиками:

  1. В нём можно что-то хранить. Нечто может находиться либо в контейнере, либо за его пределами.
  2. Его можно переносить. Контейнер Docker можно использовать на локальном компьютере, на компьютере коллеги, на сервере поставщика облачных услуг (вроде AWS). Это роднит контейнеры Docker с обычными контейнерами, в которых, например, перевозят разные милые сердцу безделушки при переезде в новый дом.
  3. В контейнер удобно что-то класть и удобно что-то из него вынимать. У обычного контейнера есть крышка на защёлках, которую надо снять для того, чтобы что-то положить в контейнер или что-то из него вынуть. У контейнеров Docker есть нечто подобное, представляющее их интерфейс, то есть — механизмы, позволяющие им взаимодействовать с внешним миром. Например, у контейнера есть порты, которые можно открывать для того, чтобы к приложению, работающему в контейнере, можно было бы обращаться из браузера. Работать с контейнером можно и средствами командной строки.
  4. Если вам нужен контейнер, его можно заказать в интернет-магазине. Пустой контейнер можно купить, например, на сайте Amazon. В этот магазин контейнеры попадают от производителей, которые делают их в огромных количествах, используя пресс-формы. В случае с контейнерами Docker то, что можно сравнить с пресс-формой, а именно — образ контейнера, хранится в специальном репозитории. Если вам нужен некий контейнер, вы можете загрузить из репозитория соответствующий образ, и, используя его, этот контейнер создать.

Конечно, пластиковые контейнеры, в отличие от контейнеров Docker, никто вам не будет присылать бесплатно, да и когда вы их получите, они будут пустыми. А вот в контейнерах Docker всегда есть что-то интересное.

Живые организмы


Ещё один подход к размышлениям о контейнерах Docker заключается в сравнении их с экземплярами живых организмов. «Экземпляр» — это нечто, существующее в некоей форме. Это не просто код. Это код, который стал причиной существования чего-то большего, чем он сам, чего-то, образно говоря, живого. Как и другие живые организмы, экземпляры контейнеров появляются на свет, живут и умирают.


Монстр, вызванный к жизни

Контейнеры Docker — это вызванные к жизни образы Docker.

Программное обеспечение


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


Контейнер — это программа

Во время выполнения контейнера Docker внутри него обычно выполняется какая-то программа. Она выполняет в контейнере некие действия, то есть — делает что-то полезное.

Например, код, который работает в контейнере Docker, возможно, отправил на ваш компьютер тот текст, который вы сейчас читаете. Вполне возможно и то, что именно код, выполняющийся в контейнере Docker, принимает голосовые команды, которые вы даёте Amazon Alexa, и преобразует их в инструкции для ещё каких-нибудь программ, работающих в других контейнерах.

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

Концепции Docker


?Виртуальные машины


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

?Образ контейнера Docker


Выше мы уже говорили об «образах». Что это такое? Хороший вопрос. То, что в терминологии Docker называется «образом», или, по-английски, «image», это совсем не то же самое, что, например, фотография (это — одно из значений слова «image»).


Образы Docker — это не фотографии

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


Образы контейнеров Docker похожи на формочки для печенья

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

?Файл Dockerfile


Файл Dockerfile содержит набор инструкций, следуя которым Docker будет собирать образ контейнера. Этот файл содержит описание базового образа, который будет представлять собой исходный слой образа. Среди популярных официальных базовых образов можно отметить python, ubuntu, alpine.

В образ контейнера, поверх базового образа, можно добавлять дополнительные слои. Делается это в соответствии с инструкциями из Dockerfile. Например, если Dockerfile описывает образ, который планируется использовать для решения задач машинного обучения, то в нём могут быть инструкции для включения в промежуточный слой такого образа библиотек NumPy, Pandas и Scikit-learn.

И, наконец, в образе может содержаться, поверх всех остальных, ещё один тонкий слой, данные, хранящиеся в котором, поддаются изменению. Это — небольшой по объёму слой, содержащий программу, которую планируется запускать в контейнере.

?Контейнер Docker


Для того чтобы запустить контейнер, нам нужен, во-первых, образ контейнера, во-вторых — среда, в которой установлен Docker, способная понять команду вида docker run image_name. Эта команда создаёт контейнер из образа и запускает его.

?Репозиторий контейнеров


Если вы хотите дать возможность другим людям создавать контейнеры на основе вашего образа, вы можете отправить этот образ в облачное хранилище. Самым крупным подобным хранилищем является репозиторий Docker Hub. Он используется при работе с Docker по умолчанию.

Мы уже довольно много всего обсудили. Пришло время собрать всё это вместе и сравнить работу с контейнерами Docker с приготовлением пиццы.

Готовим с Docker



Готовая пицца — это контейнер

  • Рецепт приготовления пиццы — это файл Dockerfile. Он сообщает нам о том, что нужно сделать для того, чтобы достичь цели, то есть — получить работающий контейнер.
  • Ингредиенты, из которых состоит пицца — это слои образа контейнера. Для нашей пиццы понадобится корж, соус и сыр.

Если положить на стол рецепт и ингредиенты, то получится, что в одном месте собрано всё, что нужно для того, чтобы приготовить пиццу. Это всё можно сравнить с образом контейнера Docker.
Из рецепта (Dockerfile) можно узнать о том, какую последовательность действий нужно выполнить для того, чтобы приготовить пиццу:

  • Корж уже готов к использованию, мы его не меняем. Его можно сравнить с базовым образом ОС Ubuntu. Это — нижний слой образа, его в образ добавляют первым.
  • Затем на корж добавляют сыр. Это — всё равно что добавить в образ второй слой в виде какой-то внешней библиотеки наподобие NumPy.
  • Затем, поверх сыра, добавляют соус. Это — код приложения, которое должно запускаться в контейнере.

Теперь пришло время готовить пиццу в духовке.


Духовка — это платформа Docker

Духовка, в которой готовится пицца, напоминает платформу Docker. Духовку устанавливают на кухне, с её помощью можно готовить еду. Точно так же Docker устанавливают на компьютере для того, чтобы «готовить» контейнеры.

Духовку, если она электрическая, включают, поворачивая ручку регулятора температуры. Команда docker run image_name — это нечто вроде такого регулятора температуры, «поворот» которого приводит к тому, что система создаёт и запускает контейнер.

Готовая пицца — это и есть контейнер Docker.

А есть пиццу — значит пользоваться приложением, запущенным в контейнере.

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

Итоги


Здесь мы, на концептуальном уровне, рассмотрели основы Docker. Надеемся, приведённые здесь сравнения помогли вам разобраться в том, что такое Docker, и ощутить ценность метафор в деле освоения новых технологий.

Уважаемые читатели! Эта публикация представляет собой перевод первой статьи из серии учебных материалов по Docker. По словам автора, всего планируется выпустить 5 таких материалов. Уже готовы вторая, третья и четвёртая части. Подскажите нам, стоит ли переводить следующие статьи этой серии?

Комментарии (20)


  1. Ivanii
    05.02.2019 12:11

    «Предшественниками контейнеров Docker были виртуальные машины» может jail фряхи?


    1. Hissing_Bridge
      05.02.2019 12:47

      Может автор имел в виду LXC, который в последствии заменили на самописный libcontainer?
      Но мне думается, что речь идет о концепции самой контейнеризации и виртуализации. Что это разные вещи.


  1. karl93rus
    05.02.2019 12:28

    Большое спасибо за старания! Если будет время, обязательно переведите остальное! Докер — тема актуальная! Не то, что бы вот лично мне прям сейчас надо разобраться, но на будущее иметь такую статейку было бы здорово! А кому-то, может, вот прям сейчас и надо, а тут есть :)


  1. slavius
    05.02.2019 13:03

    В этой пицце слишком много теста. Или воды. И даже без описания рецепта.


  1. rookie_cruekie
    05.02.2019 17:03

    будет здорово


  1. bykvaadm
    05.02.2019 18:12

    Зачем нужна очередная вводная статья про докер? существующих нехватает?


  1. Framework
    05.02.2019 18:51

    Практически все сравнивают контейнеры с виртуальными машинами, делают акцент на том что контейнеры требуют меньше ресурсов, но мало кто объясняет почему. Вот об этом было бы интереснее прочесть, чем про сравнение Docker и пиццы.


    1. oller
      05.02.2019 19:47

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


      1. Framework
        05.02.2019 20:11

        Возможность использовать разные версии софта (передаю привет php.ini) скорее приятный бонус, чем основная фича контейнеров. Они позволяют решать куда более широкий круг задач и в разработке, и в тестировании, и в оперировании. А после первого опыта с системами оркестрации, мало у кого возникнет желание деплоить приложение в прод "по-старому".


    1. raamid
      05.02.2019 19:48

      Ну, если в двух словах, то отличие от ВМ в том, что в контейнер не нужно тянуть целиком всю операционную систему. Т.е. контенерная «ОС» использует хостовую (родительскую ОС) для менеджмента памяти и процессов. В этом и заключается экономия.


      1. Framework
        05.02.2019 20:03

        Таки не хостовую ОС, а ядро и не любое, а Linux. Я для себя какое-то очень базовое представление имею, как оно устроено. Но было бы здорово, иметь хорошо изложенное описание работы контейнеров, чтобы и самому понимание подкрепить и другу ссылку сбросить.


        1. raamid
          07.02.2019 09:35
          +1

          Мне лично понравилось руководсто от Хекслет:
          Как и для чего использовать Docker
          Посмотрите, может это то что вы ищете.


  1. gatoazul
    05.02.2019 19:19

    Конечно, переводите дальше. Очень просто и доходчиво.



  1. lamer84
    06.02.2019 00:33

    Переводы делать однозначно! :-)

    Корж уже готов к использованию, мы его не меняем. Его можно сравнить с базовым образом ОС Ubuntu. Это — нижний слой образа, его в образ добавляют первым.
    Вопрос, наверное, глупый, но я не понял, какие именно части образа ОС добавляются в контейнер? И если контейнер собран на Ubuntu, сможет ли он запуститься/развернуться на другой Linux системе?


  1. voidMan
    06.02.2019 06:21

    И если контейнер собран на Ubuntu, сможет ли он запуститься/развернуться на другой Linux системе?

    Конечно, докер-образ полноценная система, но которая работает общаясь с ядром хостовой системы. В качестве хоста может использоваться как Linux так и macOS и Windows.
    Обычно по возможности стараются использовать более легковесные образы, чтобы не тащить с собой кучу ненужных пакетов той же стандартной Ubuntu (сэкономить на размере итогового образа и на времени полного развёртывания). Есть так называемые базовые образы из которых вырезано всё что можно (Minimal Ubuntu) или например Alpine (размер базового образа ~5 MB)


    1. Framework
      06.02.2019 08:46

      Контейнер это не полноценная система,. Хостом может быть только Linux, а на Windows и Mac Docker работает в виртуальной машине.


  1. Ivanii
    06.02.2019 08:37

    Конечно, докер-образ полноценная система, но которая работает общаясь с ядром хостовой системы. В качестве хоста может использоваться как Linux так и macOS и Windows.
    На Windows вам понадобится гостевая Linux система либо специальная минималистичная виртуальная машина с ядром Linux
    от сюда


  1. Linsh
    07.02.2019 11:52

    А мне сравнение с пиццей понравилось. Забираю. Можно немного подробнее про базовый образ и ингридиенты, но в целом хорошо.


  1. Almet
    07.02.2019 16:53

    Да, начало положено, так что ждем продолжения :)