Docker engine что это

Раньше для развертывания приложений и программных комплексов приходилось тратить много усилий и финансов на закупку и/или аренду необходимого оборудования, и его настройку. С появлением облачных технологий подобные трудности минимизированы, поскольку они позволили нам настраивать инфраструктуру по требованию в облаке по мере необходимости.
Проблемы в продакшене
Облачные вычисления привели к смене парадигмы в индустрии программного обеспечения и изменили многие подходы к его разработке. В первую очередь была обеспечена хорошая масштабируемость и надёжность. Однако осталось одна небольшая проблема, которая существовала очень долгое время и приводила к регулярной головной боли в процессе развертывания в производственных средах. Это — зависимость любого программного обеспечения от среды выполнения. Много раз мы могли наблюдать, когда часть программного обеспечения прекрасно работает в локальной среде разработчика, но не работает или сбоит в производственной. Таким образом, зависимость программного обеспечения от среды раньше приводила к появлению узких мест, стопорящих разработку и деплой, что выражалось в нестабильных сборкам в производственных средах.
Как Docker решает эту проблему?
Docker предоставляет среду выполнения для развертывания приложений в виде контейнеров. По сути, это предварительно упакованная легкая виртуализированная среда, которая состоит только из минимально необходимых компонентов, требующихся для правильной работы программного обеспечения. Поскольку контейнер содержит только необходимые библиотеки, он очень легкий, и поэтому становится легко создавать, распространять и отправлять наше приложение в виде таких контейнеров.
Docker помогает нам, предоставляя среду выполнения для оркестровки и управления этими контейнерами. С помощью Docker мы можем легко и эффективно создавать, распространять и поставлять наше ПО. Он также помогает нам автоматизировать процесс сборки и развертывания, предлагая готовую интеграцию с различными инструментами CI/CD, безопасные способы распространения сборок в виде образов докер, а также обеспечивает масштабируемость корпоративного уровня, которая упрощает нам обрабатывать огромный объем трафик, приходящий в наше приложение или ПО.
Понимание архитектуры Docker

Архитектура Докер
Docker управляет контейнерами с помощью Docker Engine, который включает в себя различные компоненты, такие как Docker CLI, взаимодействующий с Docker REST API для выполнения различных задач оркестровки, что упрощает нам управление контейнерами Docker на серверах. Основной частью Docker Engine является Docker Daemon, который управляет всеми этими задачами в фоновом режиме, такими как управление образами Docker, контейнерами, процессами и т. д.
Терминология Docker
Docker контейнеры
Относится к части программного обеспечения/приложения, которое работает как независимый процесс в форме контейнера, это может быть либо часть распределенного приложения, либо приложение в целом. Например: если приложение состоит из двух компонентов: фронт-енда на React.js и внутренних API-интерфейсов на Symfony и базы данных в PostgreSQL, то оно будет размещено в трех разных докер-контейнерах, содержащих соответствующую часть и необходимые компоненты/библиотеки.
Docker CLI
Относится к интерфейсу командной строки Docker, его можно использовать для создания, распространения и управления Docker контейнерами, Docker образами, томами, сетями и т. д. В основном с помощью Docker CLI мы можем взаимодействовать с Docker, а он в свою очередь выполняет все действия, взаимодействуя с REST API Docker.
Docker образы
Приложение/программное обеспечение упаковано в виде образа, который используется docker контейнерами. В основном, docker контейнеры основаны на на этих образах, поскольку docker образы состоят из кода приложения, необходимых библиотек, компонентов и т. д.
Тома Docker
В докере контейнеры развертываются на движке докера, поэтому его хранилище не связано напрямую с файловой системой хоста, а контейнеры представляют собой набор процессов. Поэтому, если нам нужно хранить какие-либо постоянные данные, которые необходимо сохранить даже после остановки или перезапуска, то в этом случае нам нужно использовать докер тома. По сути, он создает мост между контейнерами докер и файловой системой хоста, чтобы файлы могли постоянно храниться в файловой системе хоста.
Docker Networks

С помощью Docker Networks контейнеры взаимодействуют с хостом. Docker Networks работает как мост между хост-сетью и системой Docker, а также облегчают связь между несколькими контейнерами и обеспечивают безопасную среду связи для передачи данных между ними. После понимания того, как работает докер, очень распространенный вопрос, который появляется, заключается в том, чем докер отличается от традиционных виртуальных машин, которые использовались ранее? За исключением того, что докер легкий, есть некоторые существенные различия между тем, как эти технологии функционируют. Именно эти существенные отличия делает докер гораздо более эффективным, чем виртуальные машины.
Разница между Docker и виртуальными машинами
Docker и виртуальные машины функционируют на основе концепции виртуализации, но способ их взаимодействия с хост-системой отличается. Docker устанавливается поверх основной операционной системы и взаимодействует с ядром этой операционной системы для выделения ресурсов контейнерам.
Докер против виртуальной машины
Основным преимуществом docker является то, что, поскольку он взаимодействует с операционной системой хоста, он может запрашивать ресурсы по требованию, когда это требуется контейнерам, что делает его намного более эффективным, чем виртуальные машины. Почему? Потому что, в отличие от Docker, виртуальные машины развертываются поверх гипервизора, который выполняет жесткое распределение ресурсов для конкретной виртуальной машины, и его размер нельзя изменить без прерывания работы приложения.
Еще одним недостатком виртуальной машины является то, что если приложение не использует выделенные ресурсы, они тратятся как бы впустую, что снижает эффективность системы. С другой стороны, в докере ресурсы постепенно распределяются между всеми контейнерами по мере необходимости. К контейнерам также могут быть применены ограничения по ресурсам, которые могут быть выделена. Следовательно, это делает docker предпочтительным выбором по сравнению с виртуальной машиной, поскольку он обеспечивает простой способ создания и распространения приложений с безопасностью, масштабируемостью и надежностью корпоративного уровня.
Что такое 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 имеет собственную файловую систему, собственный сетевой стек (и, следовательно, собственный IP-адрес), собственное пространство процессов и определенные ограничения ресурсов для ЦП и памяти. Поскольку контейнеру Docker не нужно загружать операционную систему, он запускается мгновенно. Docker — это технология изоляции, то есть разделения ресурсов операционной системы хоста, в отличие от виртуализации, которая предоставляет гостевую операционную систему поверх операционной системы хоста.
Система инкрементных файлов

Файловая система образа 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 в общедоступный или частный репозиторий.

Docker как среда выполнения микросервисов
Идея разделить монолитные приложения на более мелкие микросервисы сегодня привлекает большое внимание разработчиков программного обеспечения.
Микросервисы развертываются независимо как процесс, используют облегченные протоколы для связи друг с другом, а каждый сервис обладает своими данными. Поскольку при управлении микросервисами применяется децентрализованный подход, требуется достаточно значительная автоматизация инфраструктуры, автоматизация тестирования, полностью автоматизированные конвейеры CD и квалифицированные и оперативные команды DevOps.
По поводу такого архитектурного стиля все еще идет много дискуссий, но было бы наивно полагать, что приложение, разложенное на микросервисы, может просто работать как набор процессов. Вот лишь несколько требований: микросервис должен быть независимым от хоста и изолированным на уровне операционной системы. Он должен работать в пределах своих ресурсных возможностей, увеличиваться и уменьшаться в размерах, перезапускаться в случае сбоя, обнаруживаться другими микросервисами и подключаться к ним через программно-определяемый сетевой уровень.
Таким образом, запуск микросервиса в контейнере Docker — это прекрасный старт для решения большинства из этих задач.
Docker: два основных измерения
Docker меняет способ создания, доставки и запуска программного обеспечения в двух разных измерениях:
- Он усовершенствует процесс надежного перехода приложения от разработки к производству.
- Он предоставляет стандартный формат образа для передачи из локальной среды в облако.
Оба измерения подробно описаны ниже.
Образ Docker: от разработки к производству
Создание образа Docker со всеми зависимостями решает знакомую многим разработчикам проблему «а на моем компьютере все работало». Основная идея заключается в том, что образ Docker создается конвейером сборки автоматически из репозитория исходного кода, такого как Git, и первоначально тестируется в среде разработки. Затем этот постоянный образ сохраняется в реестре Docker.
Как показано на рисунке 4, этот же образ используется для дальнейших тестов на загрузку, тестов интеграции, приемочных тестов и т. д. В каждой среде будет использоваться один и тот же образ. Небольшие, но необходимые для среды различия, такие как URL-адрес JDBC для производственной базы данных, могут быть переданы в контейнер в виде переменных или файлов среды.

Статистика показывает, что на сегодняшний день в 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 по результатам работы, ранее проделанной разработчиками Google 1 . Контрольные группы ограничивают и контролируют использование ресурсов в определенном наборе процессов операционной системы.
Ядро 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.
- Репозиторий Oracle GitHub для образов Docker
- Docker Hub
- Oracle Container Registry
Тренинг по Docker: контейнерная разработка с Docker
Справочная информация
- Контрольные группы (Wikipedia)
- Пространства имен Linux (Wikipedia)
Docker: новый подход к разработке и внедрению программного обеспечения
Статья также доступна на украинском (перейти к просмотру). Быстрое технологическое развитие ставит перед разработчиками и администраторами новые вызовы. Возникает необходимость в обеспечении гибкости, масштабируемости и переносимости приложений на разных платформах. Именно здесь вступает в игру Docker – инновационная платформа, изменяющая подход к разработке, доставке и управлению программным обеспечением. Расскажем о ней поподробнее.
Что такое Docker?

Docker – это платформа контейнеризации, которая позволяет разработчикам создавать, запускать и масштабировать приложения в изолированных средах, называемых контейнерами. Контейнеры – это легкий способ упаковки и запуска приложений, которые могут работать на любой машине с установленной платформой. Docker имеет ряд преимуществ перед другими способами развертывания приложений (например, виртуальных машин). Контейнеры намного легче виртуальных машин, поэтому они используют меньше ресурсов и быстрее запускаются. Контейнеры тоже легче переносить. Docker является популярным выбором для разработчиков. Также это решение используют компании, поскольку оно помогает стандартизировать среду выполнения приложений и облегчает управление кластерами серверов.
Подытожим: преимущества использования Docker
- портативность: контейнеры можно запускать на любой машине с установленным Docker.
- легкость: контейнеры гораздо легче виртуальных машин, поэтому они используют меньше ресурсов и быстрее запускаются.
- изоляция: контейнеры отделены друг от друга, что облегчает управление ими и устранение багов.
- масштабирование: контейнеры легко масштабировать горизонтально, чтобы увеличить производительность.
- стандартизация: Docker помогает стандартизировать среду выполнения приложений и облегчает управление серверными кластерами.
Как работает платформа?
Docker работает, создавая воображаемую среду для каждого контейнера. Эта среда включает в себя ядро ??операционной системы, библиотеки, файлы и настройки, необходимые для работы приложения. Контейнеры изолированы друг от друга, что означает, что они не могут взаимодействовать напрямую. Это предотвращает проблемы с конфигурацией и повышает стабильность.
Платформа также обеспечивает удобный способ управления контейнерами. Можно использовать Docker CLI для запуска, остановки, перезапуска и удаления контейнеров. Также можно использовать Docker Compose для создания и управления группами контейнеров.

Архитектура и базовые понятия Docker
Архитектуру платформы составляют сервер, клиент и реестр.
Docker Daemon (сервер)
Это основной процесс, работающий на хост-системе. Он отвечает за управление контейнерами, образами, сетями и хранящимися объектами Docker. Daemon предоставляет API REST, которое может использоваться для взаимодействия с Docker через командную строку или другие инструменты.
Docker Client (клиент)
Это пользовательский интерфейс для взаимодействия с Docker. Он может являться командной строкой (CLI) или графическим интерфейсом (например, Docker Desktop). Клиент отправляет команды Docker Daemon через API, чтобы управлять контейнерами, образами и другими составляющими Docker.
Docker Registry (реестр)
Это централизованное место для хранения образов Docker. Docker Hub является одним из публичных регистров, где разработчики могут найти готовые образы. Однако Docker также поддерживает частные реестры, которые могут быть использованы для сохранения собственных образов.
К базовым понятиям платформы относятся:
- Контейнер. Это изолированная исполнительная среда, содержащая программное обеспечение и все его зависимости. Контейнеры базируются на образах, хранящих данные о файлах и конфигурации для создания и запуска виртуальных изолированных процессов.
- Образ. Это шаблон для создания контейнера. Он содержит код программы, среду выполнения, библиотеки, зависимости и другие компоненты, необходимые для выполнения приложения.
- Dockerfile. Это текстовый файл, в котором описываются инструкции по созданию образа. В нем указаны шаги по настройке среды, импорту зависимостей и копированию кода приложения.
- Ре. Это централизованное место для хранения и управления образами. Docker Hub является одним из самых популярных публичных реестров, где можно найти готовые образы, а также скачать собственные.
- Compose. Это инструмент для определения и управления многими контейнерами, как одной программой. Используя файл docker-compose.yml, можно определить конфигурацию приложения и его зависимости, что позволяет запускать их вместе одной командой.
- CLI. Это командная строка пользовательского интерфейса для взаимодействия с Docker. С его помощью можно создавать, запускать, останавливать, удалять и управлять контейнерами и образами.
- Docker Swarm (Docker Engine Swarm mode). Это встроенная в Docker среда для управления контейнерами в кластерной среде. Оно позволяет объединить несколько Docker-хостов для создания высокодоступных и масштабируемых приложений.
- Compose. Инструмент для определения и управления многими контейнерами в качестве одной программы.
Платформа ускоряет разработку, облегчает внедрение, обеспечивает изолированную среду и увеличивает масштабируемость приложений, поэтому стала очень популярной среди разработчиков и администраторов систем.
Что такое Docker и как его использовать в разработке

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

Разработка Docker была начата в 2008 году, а в 2013 году он был опубликован как свободно распространяемое ПО под лицензией Apache 2.0. В качестве тестового приложения Docker был включен в дистрибутив Red Hat Enterprise Linux 6.5. В 2017 году была выпущена коммерческая версия Docker с расширенными возможностями.
Docker работает в Linux, ядро которых поддерживает cgroups, а также изоляцию пространства имен. Для инсталляции и использования на платформах, отличных от Linux, существуют специальные утилиты Kitematic или Docker Machine.
Основной принцип работы Docker — контейнеризация приложений. Этот тип виртуализации позволяет упаковывать программное обеспечение по изолированным средам — контейнерам. Каждый из этих виртуальных блоков содержит все нужные элементы для работы приложения. Это дает возможность одновременного запуска большого количества контейнеров на одном хосте.

Docker-контейнеры работают в разных средах: локальном центре обработки информации, облаке, персональных компьютерах и т. д.
Преимущества использования Docker
- Минимальное потребление ресурсов — контейнеры не виртуализируют всю операционную систему (ОС), а используют ядро хоста и изолируют программу на уровне процесса. Последний потребляет намного меньше ресурсов локального компьютера, чем виртуальная машина.
- Скоростное развертывание — вспомогательные компоненты можно не устанавливать, а использовать уже готовые docker-образы (шаблоны). Например, не имеет смысла постоянно устанавливать и настраивать Linux Ubuntu. Достаточно 1 раз ее инсталлировать, создать образ и постоянно использовать, лишь обновляя версию при необходимости.
- Удобное скрытие процессов — для каждого контейнера можно использовать разные методы обработки данных, скрывая фоновые процессы.
- Работа с небезопасным кодом — технология изоляции контейнеров позволяет запускать любой код без вреда для ОС.
- Простое масштабирование — любой проект можно расширить, внедрив новые контейнеры.
- Удобный запуск — приложение, находящееся внутри контейнера, можно запустить на любом docker-хосте.
- Оптимизация файловой системы — образ состоит из слоев, которые позволяют очень эффективно использовать файловую систему.
Компоненты Docker
Для начинающих разработчиков необходимо знать как работает Docker, его основные компоненты и связь между ними.

- Docker-демон (Docker-daemon) — сервер контейнеров, входящий в состав программных средств Docker. Демон управляет Docker-объектами (сети, хранилища, образы и контейнеры). Демон также может связываться с другими демонами для управления сервисами Docker.
- Docker-клиент (Docker-client / CLI) — интерфейс взаимодействия пользователя с Docker-демоном. Клиент и Демон — важнейшие компоненты «движка» Докера (Docker Engine). Клиент Docker может взаимодействовать с несколькими демонами.
- Docker-образ (Docker-image) — файл, включающий зависимости, сведения, конфигурацию для дальнейшего развертывания и инициализации контейнера.
- Docker-файл (Docker-file) — описание правил по сборке образа, в котором первая строка указывает на базовый образ. Последующие команды выполняют копирование файлов и установку программ для создания определенной среды для разработки.
- Docker-контейнер (Docker-container) — это легкий, автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки.
- Том (Volume) — эмуляция файловой системы для осуществления операций чтения и записи. Она создается автоматически с контейнером, поскольку некоторые приложения осуществляют сохранение данных.
- Реестр (Docker-registry) — зарезервированный сервер, используемый для хранения docker-образов.
Примеры реестров:- Центр Docker — реестр, используемый для загрузки docker-image. Он обеспечивает их размещение и интеграцию с GitHub и Bitbucket.
- Контейнеры Azure — предназначен для работы с образами и их компонентами в директории Azure (Azure Active Directory).
- Доверенный реестр Docker или DTR — служба docker-реестра для инсталляции на локальном компьютере или сети компании.
- Docker-хаб (Docker-hub) или хранилище данных — репозиторий, предназначенный для хранения образов с различным программным обеспечением. Наличие готовых элементов влияет на скорость разработки.
- Docker-хост (Docker-host) — машинная среда для запуска контейнеров с программным обеспечением.
- Docker-сети (Docker-networks) — применяются для организации сетевого интерфейса между приложениями, развернутыми в контейнерах.
Что такое Docker Engine
Docker Engine («Движок» Docker) — ядро механизма Докера. «Движок» отвечает за функционирование и обеспечение связи между основными Docker-объектами (реестром, образами и контейнерами).

Элементы Docker Engine
- Сервер выполняет инициализацию демона (фоновой программы), который применяется для управления и модификации контейнеров, образов и томов.
- RESTAPI — механизм, отвечающий за организацию взаимодействия Докер-клиента и Докер-демона.
- Клиент — позволяет пользователю взаимодействовать с сервером при помощи команд, набираемых в интерфейсе (CLI).
Как работает Docker
Работа Docker основана на принципах клиент-серверной архитектуры, которая основана на взаимодействии клиента с веб-сервером (хостом). Первый отправляет запросы на получение данных, а второй их предоставляет.

Схема работы
- Пользователь отдает команду с помощью клиентского интерфейса Docker-демону, развернутому на Docker-хосте. Например, скачать готовый образ из реестра (хранилища Docker-образов) с помощью команды docker pull . Взаимодействие между клиентом и демоном обеспечивает REST API. Демон может использовать публичный (Docker Hub) или частный реестры.
- Исходя из команды, заданной клиентом, демон выполняет различные операции с образами на основе инструкций, прописанных в файле Dockerfile. Например, производит их автоматическую сборку с помощью команды docker build .
- Работа образа в контейнере. Например, запуск docker-image, посредством команды docker run или удаление контейнера через команду docker kill .
Как работают образы
Docker-image — шаблон только для чтения (read-only) с набором некоторых инструкций, предназначенных для создания контейнера. Он состоит из слоев, которые Docker комбинирует в один образ при помощи вспомогательной файловой системы UnionFS. Так решается проблема нерационального использования дисковой памяти. Параметры образа определяются в Docker-file.
Для многократного применения Docker-image следует пользоваться реестром образов или Докер-реестром (Docker-registry), позволяющим закачивать готовые образы с внешнего репозитория сервиса и хранить их в реестре Докер-хоста. Рекомендуемый вариант — официальный реестр компании Docker Trusted Registry (DTR).

Если требуется файл, то скачиваться будут только нужные слои. Например, разработчик решил доработать программное обеспечение и модифицировать образ, изменив несколько файлов. После загрузки на сервер будут отправлены слои, содержащие только модифицированные данные.
Как работают контейнеры
Каждый контейнер строится на основе Docker-образов. Контейнеры запускаются напрямую из ядра операционной системы Linux. Благодаря этому, они потребляют гораздо меньше ресурсов, чем при аппаратной виртуализации.
Изоляция рабочей среды осуществляется при помощи технологии namespace. Для каждого изолированного пространства (контейнера) создается уникальное пространство имен, которое и обеспечивает к нему доступ. Любой процесс, выполняемый внутри контейнера, ограничивается namespace.

В ОС Linux посредством Docker Engine используется немного другая технология — контрольные группы (cgroups). При этом приложение ограничивается некоторым набором ресурсов. Сgroups осуществляют обмен доступных аппаратных ресурсов с контейнерами, на которые дополнительно устанавливаются необходимые ограничения (использование памяти, прав доступа к другому ресурсу и т. д.).
Движок Docker объединяет пространство имен (namespace), контрольные группы (cgroups) и файловую систему (UnionFS) в формат контейнера. В будущем планируется поддержка других форматов посредством интеграции технологий BSD Jails или Solaris Zones.
Что происходит при запуске контейнера
- Происходит запуск образа (Docker-image). Docker Engine проверяет существование образа. Если образ уже существует локально, Docker использует его для нового контейнера. При его отсутствии выполняется скачивание с Docker Hub.
- Создание контейнера из образа.
- Разметка файловой системы и добавление слоя для записи.
- Создание сетевого интерфейса.
- Поиск и присвоение IP-адреса.
- Запуск указанного процесса.
- Захват ввода/вывода приложения.
Docker Compose
Для управления несколькими контейнерами, из которых состоит проект, используют пакетный менеджер — Docker Compose.

Он применяется не во всех случаях. Если проект является простым приложением, не требующим использования сторонних сервисов, то для его развертывания можно ограничиться только Docker. Docker Compose рекомендуется использовать при проектировании сложных программных продуктов, включающих в себя множество процессов и сервисов.
Подробнее о возможностях и практикической стороне работы с Docker Compose можно узнать здесь.
Docker Swarm
При преобразовании хостов в кластер нужно воспользоваться утилитой кластеризации Docker Swarm («Docker в режиме роя). Хост, находящийся в его составе, называется «узлом» (node), который бывает управляющим или рабочим. Один кластер содержит только один управляющий «узел».

Некоторые возможности утилиты
- Управление нагрузочными характеристиками — осуществляется оптимизация рассылки запросов между хостами, обеспечивая на них равномерную нагрузку.
- Динамическое управление — допускается добавление элементов в swarm-кластер без дальнейшего его перезапуска.
- Возможность масштабирования — позволяет добавлять или удалять docker-образ для автоматического создания контейнера.
- Восстановление «узла» после сбоя — работоспособность каждого хоста постоянно контролируется управляющим «узлом». При сбое кластера происходит его восстановление и перезапуск.
- Rolling-update — выполняет обновление контейнеров. Процедура может выполняться в определенной последовательности и с временной задержкой для запуска другого контейнера. Параметр указывается в настройках. Если произойдет сбой обновления, то Docker Swarm выдаст ошибку и процесс повторится заново.
Для оркестрации контейнеров Doсker, наряду с Docker Swarm, применяют сторонний инструмент — опенсорсную платформу Kubernetes. Однако, в 2021 году в Kubernetes заявили об отказе от использования Doker в новых версиях. Поэтому связка Kubernetes и Docker будет постепенно терять актуальность.
Примеры применения
Окружение для разработки Docker применяется во множестве сфер — от обработки больших массивов данных, до работы с микросервисами, основанных на распределенной архитектуре.

Чтобы понять, как можно применять Докер на практике, разберем основные примеры использования для чайников.
- Быстрая доставка приложений (команды docker pull и docker push ) позволяет организовать коллективную работу над проектом. Разработчики могут работать удаленно на локальных компьютерах и выполнять пересылку фрагментов кода в контейнер для тестов.
- Развертывание и масштабирование — контейнеры работоспособны на локальных компьютерах, серверах, в облачных онлайн-сервисах. Их можно загружать на хостинг для дальнейшего тестирования, создавать ( docker run ), останавливать ( docker stop ), запускать ( docker start ), приостанавливать и возобновлять ( docker pause и docker unpause соответственно).
- Множественные нагрузки — осуществление запуска большого количества контейнеров на одном и том же оборудовании, поскольку Docker занимает небольшой объем дисковой памяти.
- Диспетчер процессов — возможность мониторинга процессов в Docker посредством команд docker ps и docker top , имеющими схожий синтаксис с Linux.
- Удобный поиск — в реестрах Docker он осуществляется очень просто. Для этого следует использовать команду docker search .
Заключение
Docker является важным инструментом для каждого современного разработчика, как основа аппаратной виртуализации приложений. Эта технология обладает широким функционалом и возможностями для контроля процессов. Докер позволяет не только развертывать контейнеры, но и оперативно масштабировать их экземпляры, работать с многоконтейнерными приложениями (Docker Compose), а также объединять несколько Докер-хостов в единый кластер (Docker Swarm).
Докер характеризуется достаточно простым синтаксисом. Поэтому он довольно прост в освоении как для опытных IT-специалистов, так и для новичков. Программное обеспечение совместимо со всеми версиями операционных систем Linux и Windows, поэтому область применения Docker практически не ограничена.
Чтобы использовать возможности контейнеризации на 100%, Docker нужна подходящая рабочая среда. Правильное решение — VPS от Eternalhost. Мощные виртуальные сервера с возможностью быстрого масштабирования ресурсов!