Что такое Docker?

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

Контейнеры как услуга (Containers as a Service — CaaS), или контейнерные сервисы, — это управляемые облачные решения, которые контролируют жизненный цикл контейнеров. Контейнерные сервисы позволяют координировать (запускать, останавливать, масштабировать) среду выполнения контейнеров. Используя контейнерные сервисы, вы можете упростить, автоматизировать и ускорить разработку и развертывание приложений.

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

Терминология Docker с определениями

Docker.

Контейнерная платформа программного обеспечения, созданная для разработки, отправки и запуска приложений с использованием контейнерных технологий. Платформа Docker представлена в двух версиях: Enterprise Edition и Community Edition.

Контейнер.

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

Ядро Docker.

Программное обеспечение с открытым кодом, установленное на хосте и обеспечивающее создание и запуск контейнеров. Ядра Docker действуют как клиент-серверные приложения, поддерживающие контейнеры на различных серверах Windows и в операционных системах Linux, включая Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE и Ubuntu.

Образы Docker.

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

Реестр Docker.

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

Кто использует Docker?

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

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

Docker и разработчики

Упаковывать контейнеры может любой разработчик. Представители индустрии программного обеспечения часто разделяют разработчиков на группы по их специализации: клиентские программы, серверные программы и все промежуточные этапы. Хотя упаковкой контейнеров чаще всего занимаются разработчики серверных программ, любой, кто знаком с основными понятиями CaaS, может успешно справиться с этим этапом цикла разработки ПО. Прежде чем упаковывать зависимости своего приложения, посетите страницу developer.oracle.com и ознакомьтесь с инструментами, которые можно использовать при создании собственного приложения или программы.

Сравнение Docker и Kubernetes

Контейнеры Linux существуют с 2008 года, но до появления контейнеров Docker в 2013 году они были малоизвестны. С появлением контейнеров Docker стремительно возрос интерес к разработке и развертыванию контейнерных приложений. По мере того как количество контейнерных приложений росло и охватывало сотни контейнеров, развернутых на нескольких серверах, управление ими становилось все более сложным. Как координировать, масштабировать, контролировать и планировать при работе с сотней контейнеров? В этом помогает Kubernetes. Kubernetes — это система оркестрации с открытым исходным кодом, которая позволяет запускать контейнеры Docker и выполнять нагрузки. Она помогает справляться с операционными сложностями при переходе к масштабированию нескольких контейнеров, развернутых на нескольких серверах. Модуль Kubernetes автоматически организует жизненный цикл контейнера, распределяя контейнеры приложений по инфраструктуре хостинга. Kubernetes быстро увеличивает или уменьшает объем ресурсов в зависимости от потребности. Он постоянно подготавливает, планирует и удаляет контейнеры, а также контролирует их работоспособность.

Основы Docker

Основные понятия технологии Docker — это образы и контейнеры. Образ Docker содержит все, что необходимо для запуска программного обеспечения: код, среду выполнения (например, Java Virtual Machine (JVM)), драйверы, инструменты, сценарии, библиотеки, развертывания и т. д.

Контейнер Docker — это работающий экземпляр образа Docker. Однако, в отличие от традиционной виртуализации с гипервизором типа 1 или 2, контейнер Docker работает на ядре операционной системы хоста. В образе Docker нет отдельной операционной системы, как показано на рисунке 1.

иллюстрация основ docker
Рисунок 1.

Изоляция и виртуализация

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

Система инкрементных файлов

иллюстрация системы инкрементных файлов
Рисунок 2.

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

Как показано на рисунке 2, образ Docker с развертыванием WebLogic может быть основан на образе с доменом Oracle WebLogic Server, который может быть основан на образе WebLogic, основанном на образе Java Development Kit (JDK), который в свою очередь основан на базовом образе Oracle Linux.

Реестр Docker

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

Реестр Docker также помогает улучшить управление правами доступа и безопасность образов Docker, хранящихся в его репозитории. Он управляет распространением образов, а также может интегрироваться с рабочими процессами разработки приложений. Разработчики могут настроить собственный реестр Docker или использовать размещенный сервис реестра Docker, например Docker Hub, Oracle Container Registry, Azure Container Registry и т. д.

Docker Hub — это размещенный реестр Docker, управляемый Docker. Docker Hub содержит более 100 000 образов контейнеров от поставщиков программного обеспечения, а также проекты с открытым исходным кодом и сообщества. Docker Hub содержит программное обеспечение и приложения из официальных репозиториев, таких как NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu и Oracle Linux.

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

Рисунок 3. Снимок экрана реестра Docker
Рисунок 3.

Docker как среда выполнения микросервисов

Идея разделить монолитные приложения на более мелкие микросервисы сегодня привлекает большое внимание разработчиков программного обеспечения.

Микросервисы развертываются независимо как процесс, используют облегченные протоколы для связи друг с другом, а каждый сервис обладает своими данными. Поскольку при управлении микросервисами применяется децентрализованный подход, требуется достаточно значительная автоматизация инфраструктуры, автоматизация тестирования, полностью автоматизированные конвейеры CD и квалифицированные и оперативные команды DevOps.

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

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

Docker: два основных измерения

Docker меняет способ создания, доставки и запуска программного обеспечения в двух разных измерениях:

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

Оба измерения подробно описаны ниже.

Образ Docker: от разработки к производству

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

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

снимок экрана образа docker
Рисунок 4.

Статистика показывает, что на сегодняшний день в 65 % случаев Docker используется в процессе разработки, а в 48 % случаев Docker применяется для непрерывной интеграции.

Docker и облако

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

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

Версии Docker: зрелость базовой технологии

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

Хотя Docker и его командная строка, демон Docker, его API и инструменты, такие как Docker Swarm, Docker Machine и Docker Compose, активно развивались только в последние три года, основные функции ядра были доступны в каждом ядре Linux уже почти десять лет.

Ярким примером использования контейнерных технологий уже на первых этапах их развития может служить компания Google. Компания использовала контейнеры Linux еще до появления Docker. Более того, Google все запускает в контейнерах. По имеющимся оценкам, Google запускает несколько миллиардов контейнеров в неделю.

История контрольных групп и пространств имен

Docker использует такие базовые функции ядра Linux, как контрольные группы и пространства имен. В 2008 году контрольные группы были введены в ядро ​​Linux по результатам работы, ранее проделанной разработчиками Google1. Контрольные группы ограничивают и контролируют использование ресурсов в определенном наборе процессов операционной системы.

Ядро Linux использует пространство имен, чтобы изолировать системные ресурсы процессов друг от друга. Первое пространство имен, то есть пространство имен файловой системы (mount), было внедрено еще в 2002 году.2

Контейнерные облачные решения

В первой части этой статьи объяснялись некоторые важные понятия Docker. Однако в производственной среде недостаточно просто запустить приложение в контейнере Docker.

Для настройки и эксплуатации производственной среды требуется оборудование для запуска контейнеров. Такое программное обеспечение, как Docker, а также репозитории и менеджеры кластеров должны устанавливаться, обновляться и исправляться. Если несколько контейнеров Docker обмениваются данными через хосты, необходимо создать сеть. В случае сбоя кластерные контейнеры следует перезапустить. Кроме того, набор связанных друг с другом контейнеров должен развертываться так же легко, как и один логический экземпляр приложения. Примером этого могут служить балансировщик нагрузки, несколько веб-серверов, несколько экземпляров Oracle WebLogic Server с сервером администрирования, управляемый сервер и база данных. Для управления контейнерными приложениями в значительных масштабах требуется система оркестровки контейнеров, такая как Kubernetes или Docker Swarm. Развертывание, контроль и эксплуатация таких систем оркестровки, как Kubernetes, может оказаться сложной задачей и отнимать много времени.

Чтобы разработчики могли быстрее и эффективнее создавать контейнерные приложения, поставщики облачных услуг предлагают облачные контейнерные сервисы или контейнеры как услугу (Containers as a Service — CaaS). Облачные контейнерные сервисы помогают разработчикам и операционным группам оптимизировать жизненный цикл контейнеров и управлять им в автоматическом режиме. Такие сервисы оркестровки, обычно созданные с использованием Kubernetes, упрощают для команд DevOps работу с масштабными контейнерными приложениями и управление ими. Oracle Container Engine for Kubernetes и Azure Kubernetes Service — два примера популярных управляемых облачных сервисов для оркестровки контейнеров.

Oracle Container Engine for Kubernetes — это полностью управляемый, масштабируемый и высокодоступный сервис, который можно использовать для развертывания контейнерных приложений в облаке. Используйте Container Engine for Kubernetes (иногда используется аббревиатура OKE), если ваша команда разработчиков хочет надежно создавать и развертывать приложения cloud native и управлять ими.

Образы Docker от Oracle

Упаковывать контейнеры может любой разработчик. Представители индустрии программного обеспечения часто разделяют разработчиков на группы по их специализации: клиентские программы, серверные программы и все промежуточные этапы. Хотя упаковкой контейнеров чаще всего занимаются разработчики серверных программ, любой, кто знаком с основными понятиями CaaS, может успешно справиться с этим этапом цикла разработки ПО. Прежде чем упаковывать зависимости своего приложения, посетите страницу developer.oracle.com и ознакомьтесь с инструментами, которые можно использовать при создании собственного приложения или программы.

Ниже приведены несколько источников получения или создания образов Docker для продуктов Oracle. Репозиторий Oracle GitHub для образов Docker содержит файлы Docker и образцы для создания образов Docker для коммерческих продуктов Oracle и проектов с открытым исходным кодом, поддерживаемых Oracle.

Тренинг по Docker: контейнерная разработка с Docker

Справочная информация

  1. Контрольные группы (Wikipedia)
  2. Пространства имен Linux (Wikipedia)