Ответ
Docker построен на нескольких фундаментальных технологиях Linux и принципах проектирования:
-
Namespaces (Пространства имён): Обеспечивают изоляцию. Каждый контейнер получает свои собственные изолированные экземпляры:
PID(процессы),NET(сеть),MNT(файловые системы),UTS(hostname),IPC(межпроцессное взаимодействие),User(UID/GID).
-
Control Groups (cgroups): Ограничивают и отслеживают использование ресурсов (CPU, память, диск I/O, сеть) для каждого контейнера.
-
Union File Systems (OverlayFS, AUFS): Позволяют создавать образы слоями. Это основа для эффективного кэширования, легковесности образов и их неизменяемости. Каждая инструкция в
Dockerfileсоздает новый слой. -
Контейнерная виртуализация (на уровне ОС): В отличие от виртуальных машин, контейнеры разделяют ядро хостовой ОС, что делает их быстрыми и легковесными.
-
Принцип immutable infrastructure: Образ контейнера — неизменяемый артефакт. Для обновления приложения создается новый образ и разворачивается новый контейнер, а не изменяется работающий.
Пример на практике: Когда вы запускаете docker run nginx, Docker Engine использует cgroups для ограничения ресурсов, namespaces для изоляции, а образ, собранный на основе UnionFS, монтируется как корневая файловая система контейнера.