Освойте эти принципы Docker, и вам больше не нужно будет хвастаться.

Docker

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

  • 1. Различия между контейнерами и виртуальными машинами
  • 2. Принцип изоляции ресурсов Docker
  • 3. Принцип ограничения ресурсов Docker
  • 4. Принцип многоуровневой структуры Docker

Контейнеры против виртуальных машин

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

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

图1.1
Рисунок 1.1

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

Контейнеры могут обеспечить изоляцию процессов на уровне операционной системы.В качестве примера возьмем Docker, когда мы запускаем контейнер Docker, сам контейнер является просто процессом в операционной системе.Он использует только различные функции, предоставляемые операционной системой, для реализации межпроцессного взаимодействия. -process network and space., разрешения и прочая изоляция, чтобы несколько процессов Docker-контейнера не знали о существовании друг друга, как показано на рисунке 1.2.

图1.2
Рисунок 1.2

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

Изоляция ресурсов Docker: пространство имен Linux

Пространство имен Linux (Linux Namespace) — это функция, предоставляемая ядром Linux (Kernel), которая может изолировать ряд системных ресурсов, таких как PID (идентификатор процесса, идентификатор процесса), идентификатор пользователя, сеть, файловая система и т. д.

Если вы знакомы с Linux, вы можете подумать о команде chroot в linux, которая позволяет изменить текущий каталог на корневой каталог (то есть точка монтирования корневого каталога / переключается), что эквивалентно команде изоляция файловой системы, а пространство имен также имеет аналогичную функциональность, но более мощную.

В настоящее время Linux в основном предоставляет 6 различных типов пространств имен, как показано в следующей таблице.

Тип пространства имен описывать флаги системных вызовов
Mount Namespace Изолировать точки монтирования файловой системы CLONE_NEWS
UTS Namespace Изолировать HostName и DomianName CLONE_NEWUTS
IPC Namespace Изоляция межпроцессного взаимодействия CLONE_NEWIPC
PID Namespace Идентификатор карантинного процесса CLONE_NEWPID
Network Namespace Изолированная сеть CLONE_NEWNET
User Namespace Изолировать пользователей и группы пользователей CLONE_NEWUSER

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

Но для некоторых операций требуются привилегии root, и мы не можем предоставить привилегии root пользователям. В настоящее время Namespae можно использовать для изоляции UID через пространство имен пользователей. В частности, пользователь, чей UID равен x, имеет привилегии root в пространстве имен. Но в реальном физической машине, он по-прежнему является пользователем с UID x, что решает проблему изоляции между пользователями.

Кроме того, PID также может быть изолирован через пространство имен PID.С точки зрения пользователей в пространстве имен пространство имен похоже на новый Linux со своим собственным процессом инициализации (начальный процесс, PID равен 1) и PID других процессы находятся в процессе инициализации PID увеличивается, как показано на рисунке 1.3.

图1.3
Рисунок 1.3

На рисунке PID процесса 3 в родительском пространстве имен равен 3, а в дочернем пространстве имен его PID равен 1, и пользователь видит процесс 3 в дочернем пространстве имен точно так же, как процесс init.

Linux предоставляет нам 3 системных API для использования пространства имен:

  • clone() создает новый процесс и определяет, какой тип Namespace будет создан согласно флагам системного вызова, и дочерние процессы процесса также будут содержать эти Namespaces.
  • setns() добавляет процесс в существующее пространство имен.
  • unshare() перемещает процесс из пространства имен

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

Ограничения ресурсов Docker: групповые группы Linux

Docker помогает процессам изолировать собственное пространство/ресурсы через пространство имен Linux.Как Docker ограничивает использование этих ресурсов процессами?

Суть контейнера Docker по-прежнему является процессом.При работе нескольких контейнеров Docker, если один из процессов Docker занимает много ЦП и памяти, другие процессы Docker будут реагировать медленно.Чтобы избежать этого, вы можете использовать технологию Linux Cgroups для ограничивать ресурсы.

Cgroups Linux (Linux Contorl Groups, называемые Cgroups) могут ограничивать, контролировать и подсчитывать ресурсы для группы процессов и их подпроцессов, включая ЦП, память, хранилище, сеть, права доступа к устройствам и т. д. Легко ограничивайте занятость ресурсов процесса и подсчитывать использование процесса в реальном времени.

Cgroups состоят из 3 компонентов, а именно cgroup (контрольная группа), subsystem (подсистема) и Hierarchy (иерархическое дерево), которые работают в синергии друг с другом.

  • cgroup — это механизм группового управления процессами, cgroup обычно содержит группу (множество) процессов, управление ресурсами в Cgroups реализовано в единицах cgroups.
  • Подсистема — это набор (несколько) модулей управления ресурсами, каждая подсистема будет управляться в контрольной группе, а процессы в контрольной группе будут ограничены и соответственно будут контролироваться.
  • Иерархия построит группу (несколько) контрольных групп в древовидную структуру, и Cgropus может использовать эту структуру для реализации таких функций, как наследование.

Как именно эти три работают вместе?

Cgroups группирует системные процессы (cgroups) и строит их в независимые деревья посредством иерархии.Узлы дерева являются cgroups (группами процессов).Каждое дерево может быть связано с одной или несколькими подсистемами, и подсистемы будут выполнять операции над соответствующими группами в дерево.

Есть несколько правил, о которых нужно знать.

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

Иерархия Docker: файловая система Union

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

Чтобы понять эту проблему, вам сначала нужно понять файловую систему Union (называемую UnionFS), которая представляет собой службу файловой системы, разработанную для систем Linux для объединения других файловых систем в точку монтирования объединения. UnionFS использует ветвь (ветку) для прозрачного наложения файлов и каталогов разных файловых систем для формирования единой согласованной файловой системы.Кроме того, UnionFS использует технологию копирования при записи (CoW для краткости) для улучшения использования ресурсов объединенной файловой системы. (В следующих статьях будет представлена ​​технология CoW)

Первым драйвером хранилища, используемым Docker, является AUFS (расширенная многоуровневая файловая система унификации).AUFS полностью переписывает более раннюю версию UnionFS, чтобы повысить ее производительность и надежность, а также вводит новые функции, такие как балансировка нагрузки ветвей.

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

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

Помимо AUFS, драйверы хранилища Docker включают OverlayFS, Devicemapper, Btrfs, ZFS и т. д., которые в этой статье не обсуждаются.

Суммировать

На данный момент мы знаем основные принципы основных функций Docker: Docker использует пространство имен Linux для изоляции различных ресурсов, таких как сети, пользователи и процессы, использует технологию Linux Cgroups для ограничения и мониторинга использования ресурсов и реализует иерархическую структуру с помощью драйверов хранилища. такие как AUFS с добавочными обновлениями и другими функциями.

Есть много других технологий, используемых Docker в реальном мире, но основными и базовыми являются Linux Namespace, Linux Cgrpus и AUFS.

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

Категории