Прежде чем говорить о Docker, давайте сначала поговорим о виртуализации в целом.

Виртуализация

Виртуализация — это способ более эффективно использовать базовое оборудование.

Действительно ли нам нужна виртуализация?

В общем, да. Если для каждого отдельного приложения требуется отдельная машина, есть вероятность, что большую часть времени эта машина будет недогружена, и мы будем тратить аппаратные ресурсы, такие как ЦП, память и т. д.

Благодаря виртуализации многие приложения могут использовать одно и то же физическое оборудование.

Решение для виртуализации действует как слой поверх реального оборудования.

Как система достигает виртуализации?

Это делается через гипервизор.

Гипервизор — это программное обеспечение, с помощью которого мы достигаем желаемой виртуализации.

Существует два типа гипервизоров:

  1. Тип-1, также известный как «голое железо», потому что он работает непосредственно на оборудовании.
  2. Тип-2 запускается как приложение в основной операционной системе.

Виртуальные машины (ВМ)

Виртуальная машина, как следует из названия, — это машина с собственной ОС. ВМ эмулирует физическое оборудование.

Приложение, работающее внутри виртуальной машины, не знает, работает оно на реальной машине или нет, отсюда и название «Виртуальная машина».

Многие виртуальные машины могут работать на одной машине, не зная друг друга.

Виртуальная машина работает на гипервизоре и получает доступ к базовому оборудованию через гипервизор.

На этой диаграмме мы видим две разные виртуальные машины, работающие на одной машине с использованием гипервизора.

  • VM1 работает под управлением Linux и запускает приложение с именем App1.
  • VM2 имеет Windows и запускает два приложения — App2 и App3.

Контейнеризация

Контейнеризация или виртуализация на уровне ОС – это функция ОС, в которой ядро ​​позволяет создавать несколько изолированных экземпляров пользовательского пространства. Эти экземпляры называются контейнерами.

Контейнер похож на коробку, в которой запускается приложение. Контейнер обеспечивает виртуализацию этого приложения.

Приложение не знает, на какой ОС оно на самом деле работает, потому что контейнер приложения — это все.

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

Приложение работает в границах контейнера, поэтому оно меньше зависит от операционной системы хоста.

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

Какие проблемы решает контейнер?

Переносимость

Предположим, мы создаем приложение с нуля.

So,

  • Находим машину.
  • Скачиваем весь необходимый софт, их зависимости.
  • Затем все устанавливаем и настраиваем.

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

Наконец, все настроено и работает на вашей машине разработки. Крутая вещь!

Теперь, как бы вы перенесли это приложение вместе с его конфигурациями на другую машину?

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

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

В таком случае либо сама машина, либо какое-то другое приложение прикручено.

С помощью контейнеров или виртуальной машины мы можем просто скопировать виртуальную машину или контейнер на новую машину.

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

Упаковка и развертывание

В дополнение к предыдущему пункту, как только вы помещаете свое приложение в контейнер, оно готово к перемещению на любой компьютер.

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

Контейнер становится исполняемым и развертываемым пакетом.

Любой компьютер с соответствующей контейнерной инфраструктурой сможет запустить ваш контейнер.

Это похоже на классы Java, после компиляции вы можете запускать один и тот же файл класса на любой машине, если на ней установлена ​​​​правильная JVM.

Масштабирование

Контейнеры продвигают шаблон микросервисов. В каждом контейнере должна быть одна служба.

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

Конфликты зависимостей и полное удаление приложений

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

  • Предположим, А нужна x версия Sybase, а Б нужна Y версия Sybase.
  • Давайте рассмотрим другой сценарий. Если вы удаляете/удаляете приложение из своей системы, есть вероятность, что вы можете забыть удалить его зависимости, которые останутся там и займут место в системе.

Подобные зависимости не только усложняют работу, но и загрязняют машину, когда они вам больше не нужны.

В случае контейнеров приложение и его зависимости упаковываются как пакет. Таким образом, нет конфликта зависимостей.

Кроме того, вместо удаления приложения вы удаляете контейнер. Таким образом, все будет удалено как пакет, который поддерживает чистоту машины.

Докер

Давайте, наконец, поговорим о Docker.

Веб-сайт Docker определяет Docker как открытую платформу для разработки, доставки и запуска приложений.

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

Он написан на языке Go.

Под капотом контейнер Docker — это просто процесс Linux, который использует функции Linux, например. пространства имен, cgroups, seccomp и т. д.

Терминология Docker

  • Клиент Docker — клиент Docker установлен на клиентском компьютере. Мы запускаем команды Docker с помощью клиента Docker.
  • Демон Docker — обычно устанавливается на том же компьютере. Он прослушивает запросы API Docker и делает все необходимое для запуска контейнера Docker.
  • Реестр Docker. Реестр — это место, где хранятся образы Docker. Например, GitHub — это реестр, в котором люди управляют своими кодовыми базами. Точно так же образы докеров хранятся в реестре докеров. Реестр может быть общедоступным, как Docker Hub, или частным.
  • Образ Docker. Образ представляет собой шаблон только для чтения с инструкциями по созданию контейнера Docker.
  • Контейнер Docker. Контейнер — это исполняемый экземпляр образа.

Разница между образом Docker и контейнером Docker

Возьмем пример класса Java. У класса есть некоторый код, который можно сохранить в виде файла .java в локальном каталоге или в виде проекта github. Класс ничего не делает сам по себе.

Но когда мы компилируем и запускаем файл .class, тот же самый доступный только для чтения класс становится объектом времени выполнения, исполняемым фрагментом кода, который делает то, для чего он был написан.

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

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

Точно так же, как мы можем создать несколько объектов одного класса, мы можем создать несколько запущенных контейнеров из одного образа докера.

Работа на высоком уровне

На сайте Docker есть хорошая диаграмма, которая изображает поток высокого уровня.

Когда мы запускаем команду для запуска контейнера из образа:

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

Вот короткое видео о том, как запустить Docker-контейнер:

Полезные команды Docker

Архитектура и основные компоненты Docker

Docker имеет многоуровневую архитектуру. Некоторые из ключевых компонентов, в порядке от низкого к высокому, приведены ниже:

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

Что происходит, когда мы запускаем контейнер?

Для получения более подробной информации посетите https://www.vmtechblog.com/search/label/docker.