Технологии контейнеризации приложений нашли широкое применение в сферах разработки ПО и анализа данных. Эти технологии помогают сделать приложения более безопасными, облегчают их развёртывание и улучшают возможности по их масштабированию. Рост и развитие технологий контейнеризации можно считать одним из важнейших трендов современности.
Docker — это платформа, которая предназначена для разработки, развёртывания и запуска приложений в контейнерах. Слово «Docker» в последнее время стало чем-то вроде синонима слова «контейнеризация». И если вы ещё не пользуетесь Docker, но при этом работаете или собираетесь работать в сферах разработки приложений или анализа данных, то Docker — это то, с чем вы непременно встретитесь в будущем.
Когда мы начнем использовать Docker, то можно будет заметить что контейнер в этом случае является метаморфом. Если заглянуть в словарь Ожегова, то окажется, что метафора — это «скрытое образное сравнение, уподобление одного предмета, явления другому». Метафоры помогают нам ухватывать суть новых для нас явлений. Например, виртуальные контейнеры можно сравнить с обычными пластиковыми контейнерами, или контейнерами, которые перевозятся на грузовых судах (на это даже намекают разработчики если посмотреть на логотип Docker). Такое сравнение, через сопоставление уже известных нам свойств обычных контейнеров со свойствами виртуальных контейнеров, поможет сначала с ними познакомиться, а потом и понять их сущность.
Давайте представим что контейнер Docker - это судоходный контейнер так будет легче описать его свойства:
В нём можно что-то хранить. Нечто может находиться либо в контейнере, либо за его пределами. В случае Docker это могут быть: программы, среды разработки, скрипты, какие-либо зависимости и т.п.
Его можно переносить. Контейнер Docker можно использовать на локальном компьютере, на компьютере коллеги, на сервере поставщика облачных услуг (вроде AWS). Это роднит контейнеры Docker с обычными контейнерами, в которых, например, перевозят разные необходимые вещи по морю в разные части земного шара.
В контейнер удобно что-то класть и удобно что-то из него вынимать. Судоходный контейнер надо сначала открыл, чтобы что-то в него положить или же вытащить. У контейнеров Docker есть нечто подобное, представляющее их интерфейс, то есть — механизмы, позволяющие им взаимодействовать с внешним миром. Например, у контейнера есть порты, которые можно открывать для того, чтобы к приложению, работающему в контейнере, можно было бы обращаться из браузера. Работать с контейнером можно и средствами командной строки.
В случае с контейнерами Docker они хранится в специальном репозитории. Если вам нужен некий контейнер, вы можете загрузить из репозитория соответствующий образ, и, используя его, этот контейнер создать. Если необходимо вы можете сами создать образ для контейнера.
Так же контейнер Docker можно сравнить с живым организмом. Представим, что контейнер Docker это некий экземляр - то есть что-то существующее в некоторой форме. У этого экземляра есть какие-то части, позволяющее ему жить, каждая часть дополняет друг друга. Так же и с контейнером в Docker, в нем есть какие-то специальные части, позволяющее среде, хранимой в этом контейнер, работать на другом компьтере. Этот контейнер так же рождается из образа, когда он кому то нужен, и умирает, когда уже ненужный контейнер удаляют.
На фундаментальном уровне, контейнер представляет собой набор инструкций, который выполняется на некоем процессоре, обрабатывая какие-то данные. Во время выполнения контейнера Docker внутри него обычно выполняется какая-то программа. Она выполняет в контейнере некие действия, то есть — делает что-то полезное.
Например, код, который работает в контейнере Docker, возможно, отправил на ваш компьютер тот текст, который вы сейчас читаете. Вполне возможно и то, что именно код, выполняющийся в контейнере Docker, принимает голосовые команды, которые вы даёте Amazon Alexa, и преобразует их в инструкции для ещё каких-нибудь программ, работающих в других контейнерах.
Благодаря использованию Docker можно, на одном и том же компьютере, одновременно запускать множество контейнеров. И, как и любые другие программы, контейнеры Docker можно запускать, останавливать, удалять. Можно исследовать их содержимое и создавать их.
Виртуальные машины
Предшественниками контейнеров Docker были виртуальные машины. Виртуальная машина, как и контейнер, изолирует от внешней среды приложение и его зависимости. Однако контейнеры Docker обладают преимуществами перед виртуальными машинами. Так, они потребляют меньше ресурсов, их очень легко переносить, они быстрее запускаются и приходят в работоспособное состояние. В этом материале можно найти подробное сравнение контейнеров и виртуальных машин.
Образ контейнера Docker
Выше мы уже говорили об «образах». То, что в терминологии Docker называется «образом», или, по-английски, «image», это совсем не то же самое, что, например, фотография (это — одно из значений слова «image»). Образы контейнеров 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:
Платформа Docker — ПО, благодаря которому можно работать с контейнерами.
Движок Docker — клиент-серверное приложение (CE или Enterprise).
Клиент Docker — программа, которая позволяет взаимодействовать с демоном Docker посредством CLI.
Демон Docker — сервер Docker, отвечающий за управление ключевыми механизмами системы.
Тома Docker — хранилище информации, используемое в контейнерах.
Реестр Docker — удалённое хранилище образов.
Хаб Docker — самый крупный реестр Docker, используемый по умолчанию.
Репозиторий — коллекция образов Docker с одним и тем же именем.
Масштабирование:
Сетевая подсистема Docker — среда, которая позволяет организовывать взаимодействие контейнеров.
Docker Compose — технология, упрощающая работу с многоконтейнерными приложениями.
Docker Swarm — средство для управления развёртыванием контейнеров.
Сервисы Docker — контейнеры в продакшне.