Введение в Docker

Что такое Docker?
Согласно анализу IBM, определение Docker звучит так: «Docker — это платформа контейнеризации с открытым исходным кодом. Она позволяет разработчикам упаковывать приложения в контейнеры — стандартизированные исполняемые компоненты, объединяющие исходный код приложения с библиотеками операционной системы (ОС) и зависимостями, необходимыми для запуска этого кода в любой среде».


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

Краткая история Docker:
В 2008 году Docker был известен как DotCloud и впервые был основан Соломоном Хайксом в Париже. Она начинала как платформа как сервис (PaaS), а в 2013 году переключилась на демократизацию программных контейнеров, на которых работала платформа.
Хайкс впервые продемонстрировал Docker на PyCon в марте 2013 года, где он объяснил, что Docker был создан потому, что разработчики постоянно просили предоставить им технологию, лежащую в основе платформы DotCloud. Мы всегда думали, что было бы здорово иметь возможность сказать: «Да, вот наша низкоуровневая часть. Теперь вы можете делать с нами контейнеры Linux и делать все, что захотите, строить свою платформу». Вот что мы делаем».
Так родился Docker, проект с открытым исходным кодом быстро набрал обороты среди разработчиков и привлек внимание таких известных поставщиков технологий, как Microsoft, IBM и Red Hat, а также венчурных капиталистов, готовых влить миллионы долларов в инновационный стартап. Революция контейнеров началась.

Что такое «контейнер& как он работает?
Контейнер — это стандартная единица программного обеспечения, которая упаковывает код и все его зависимости, чтобы приложение быстро и надежно работало в разных вычислительных средах.
Контейнеры стали возможны благодаря изоляции процессов и возможностям виртуализации, встроенным в ядро Linux. Эти возможности — такие как группы управления (Cgroups) для распределения ресурсов между процессами и пространства имен для ограничения доступа процессов к другим ресурсам или областям системы — позволяют нескольким компонентам приложения совместно использовать ресурсы одного экземпляра операционной системы хоста точно так же, как гипервизор позволяет нескольким виртуальным машинам (VM) совместно использовать процессор, память и другие ресурсы одного аппаратного сервера.
В результате контейнерная технология предлагает все функциональные возможности и преимущества виртуальных машин — включая изоляцию приложений, экономически эффективную масштабируемость и возможность утилизации — плюс важные дополнительные преимущества:
1.меньший вес.
2.Большая эффективность использования ресурсов.
3.Повышенная производительность разработчиков.
Контейнеры Docker дают возможность получить контроль над программным обеспечением. Вы можете использовать Docker, чтобы обернуть приложение таким образом, чтобы вопросы его развертывания и выполнения — как выставить его в сеть, как управлять использованием хранилища, памяти и ввода-вывода, как контролировать разрешения на доступ — решались вне самого приложения и согласованно для всех «контейнеризированных» приложений. Вы можете запустить свой контейнер Docker на любом совместимом с ОС хосте (Linux или Windows), на котором установлена среда выполнения Docker.

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

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

Архитектура Docker:
Docker использует архитектуру клиент-сервер. Клиент Docker общается с демоном Docker, который выполняет тяжелую работу по созданию, запуску и распространению ваших контейнеров Docker. Клиент и демон Docker могут работать на одной системе, или вы можете подключить клиента Docker к удаленному демону Docker. Клиент и демон Docker взаимодействуют с помощью REST API, через сокеты UNIX или сетевой интерфейс. Еще одним клиентом Docker является Docker Compose, который позволяет работать с приложениями, состоящими из набора контейнеров.

Демон Docker:
Демон Docker (dockerd) прослушивает запросы API Docker и управляет объектами Docker, такими как образы, контейнеры, сети и тома. Демон также может взаимодействовать с другими демонами для управления службами Docker.

Клиент Docker:
Клиент Docker (docker) — это основной способ взаимодействия многих пользователей Docker с Docker. Когда вы используете такие команды, как docker run, клиент отправляет эти команды в dockerd, который их выполняет. Команда docker использует API Docker. Клиент Docker может взаимодействовать с несколькими демонами.

Реестры Docker:
В реестре Docker хранятся образы Docker. Docker Hub — это публичный реестр, который может использовать любой желающий, а Docker по умолчанию настроен на поиск образов на Docker Hub. Вы даже можете запустить свой собственный частный реестр.
Когда вы используете команды docker pull или docker run, необходимые образы извлекаются из настроенного реестра. При использовании команды docker push образ выталкивается в настроенный реестр.

Объекты Docker:
Когда вы используете Docker, вы создаете и используете образы, контейнеры, сети, тома, плагины и другие объекты. В этом разделе приводится краткий обзор некоторых из этих объектов.

Образы:
Образ — это шаблон, доступный только для чтения, с инструкциями по созданию контейнера Docker. Часто образ основан на другом образе с некоторыми дополнительными настройками. Например, вы можете создать образ, основанный на образе Ubuntu, но установить веб-сервер Apache и ваше приложение, а также детали конфигурации, необходимые для работы вашего приложения.
Вы можете создавать собственные образы или использовать только те, которые созданы другими и опубликованы в реестре. Чтобы создать свой собственный образ, вы создаете Docker-файл с простым синтаксисом для определения шагов, необходимых для создания образа и его запуска. Каждая инструкция в Docker-файле создает слой в образе. Когда вы изменяете Docker-файл и перестраиваете образ, перестраиваются только те слои, которые изменились. Это часть того, что делает образы такими легкими, маленькими и быстрыми по сравнению с другими технологиями виртуализации.

Контейнеры:


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

Пример команды docker-run:
Следующая команда запускает контейнер ubuntu, подключается интерактивно к вашей локальной сессии командной строки и запускает /bin/bash.
$ docker run -i -t ubuntu /bin/bash
Когда вы выполняете эту команду, происходит следующее (при условии, что вы используете конфигурацию реестра по умолчанию):

  1. Если у вас нет локального образа ubuntu, Docker извлекает его из настроенного реестра, как если бы вы выполнили команду docker pull ubuntu вручную.
  2. Docker создает новый контейнер, как если бы вы выполнили команду docker container create вручную.
  3. Docker выделяет контейнеру файловую систему с возможностью чтения и записи в качестве последнего уровня. Это позволяет запущенному контейнеру создавать или изменять файлы и каталоги в своей локальной файловой системе.
  4. Docker создает сетевой интерфейс для подключения контейнера к сети по умолчанию, поскольку вы не указали никаких сетевых опций. Это включает в себя назначение IP-адреса контейнеру. По умолчанию контейнеры могут подключаться к внешним сетям, используя сетевое подключение хост-машины.
  5. Docker запускает контейнер и выполняет команду /bin/bash. Поскольку контейнер работает в интерактивном режиме и подключен к вашему терминалу (благодаря флагам -i и -t), вы можете вводить данные с клавиатуры, а вывод записывается в журнал терминала.
  6. Когда вы набираете exit для завершения команды /bin/bash, контейнер останавливается, но не удаляется. Вы можете запустить его снова или удалить.

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

Развертывание и оркестровка Docker:
Если вы используете всего несколько контейнеров, то управлять вашим приложением довольно просто в Docker Engine — среде выполнения де-факто. Но если ваше развертывание состоит из тысяч контейнеров и сотен сервисов, то управлять этим рабочим процессом практически невозможно без помощи этих инструментов, созданных для решения конкретных задач.

Docker Compose ->
Если вы создаете приложение из процессов в нескольких контейнерах, расположенных на одном хосте, вы можете использовать Docker Compose для управления архитектурой программного обеспечения. Docker Compose создает YAML-файл, в котором указывается, какие сервисы включены в приложение, и может развертывать/устанавливать и запускать контейнеры с помощью одной команды. Используя Docker Compose, можно также очертить непрерывные тома для хранения данных, указать базовые узлы, а также документировать и настраивать зависимости сервисов.

Kubernetes ->
Для мониторинга и управления жизненным циклом контейнеров в более сложных средах вам понадобится инструмент оркестровки контейнеров. Хотя Docker включает свой собственный инструмент оркестровки (называется Docker Swarm), большинство разработчиков выбирают Kubernetes в качестве альтернативы.
Kubernetes — это платформа для оркестровки контейнеров с открытым исходным кодом, возникшая из проекта, разработанного для внутреннего использования в Google. Kubernetes планирует и автоматизирует задачи, необходимые для управления архитектурами на основе контейнеров, включая развертывание контейнеров, обновления, обнаружение сервисов, предоставление хранилищ, балансировку нагрузки, мониторинг состояния и многое другое. Кроме того, экосистема инструментов для Kubernetes, включая Istio и Knative, позволяет организациям развернуть высокопроизводительную платформу как услугу (PaaS) для контейнерных приложений и быстрее перейти к бессерверным вычислениям.

Преимущества Docker:

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

Недостатки Docker:

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

Что такое Docker сегодня?
Использование контейнеров продолжает расти по мере того, как методы облачно-нативной разработки становятся основной моделью создания и запуска программного обеспечения, но Docker сейчас является лишь частью этой головоломки.
Docker стал мейнстримом, упростив перенос кода приложения и всех его зависимостей с компьютера разработчика на сервер. Но рост популярности контейнеров привел к изменению способа создания приложений — от монолитных стеков к сетям микросервисов. Вскоре многим пользователям понадобился способ оркестровки и управления группами контейнеров в масштабе.
Родившийся в Google проект с открытым исходным кодом Kubernetes быстро стал лучшим вариантом для этого, вытеснив собственные попытки Docker решить эту проблему с помощью своего оркестратора Swarm (RIP). На фоне растущих проблем с финансированием Docker в конечном итоге предложил свою организацию предприятия компании Mirantis в 2019 году, которая и поглотила Docker Enterprise в Mirantis Kubernetes Engine.
Останки Docker — которые включают в себя оригинальную среду выполнения контейнеров Docker Engine с открытым исходным кодом, хранилище образов Docker Hub и приложение Docker Desktop — продолжают работать под руководством ветерана компании Скотта Джонстона, который пытается переориентировать предприятие вокруг его основной базы покупателей центра — разработчиков программного обеспечения.

Оцените статью
devanswers.ru
Добавить комментарий