На каких технологиях основан Docker?

Ответ

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

Основные технологии:

  1. Linux Namespaces — обеспечивают изоляцию процессов, сети, файловой системы и других ресурсов. Каждый контейнер получает собственные пространства имён (PID, NET, MNT, IPC, UTS, User).
  2. Control Groups (cgroups) — ограничивают и отслеживают использование ресурсов (CPU, память, дисковый I/O, сеть) для группы процессов.
  3. Union File Systems (OverlayFS, AUFS) — позволяют создавать образы из накладывающихся слоёв (read-only слои базового образа + read-write слой контейнера), что обеспечивает эффективность и лёгкость образов.
  4. Container Runtime (runc) — низкоуровневая реализация контейнеров, соответствующая спецификации Open Container Initiative (OCI). Именно runc создаёт и запускает контейнеры, используя namespaces и cgroups.

Пример Dockerfile, который использует эти технологии:

# Базовый слой образа (использует UnionFS)
FROM alpine:latest

# Команда, выполняемая в изолированном процессе (namespace)
RUN apk add --no-cache nginx

# Точка входа для контейнера
CMD ["nginx", "-g", "daemon off;"]

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

Ответ 18+ 🔞

Давай разберём, как эта штука работает, а то звучит сложно, а на деле — проще пареной репы, если не лезть в дебри. Docker — это, по сути, такая хитрая упаковка для твоего приложения, чтобы оно везде бегало одинаково и не устраивало сюрпризов. А магия вся вот в чём:

На чём всё держится, или Почему это не просто виртуалка:

  1. Linux Namespaces (Пространства имён) — это как будто ты каждому контейнеру даёшь его собственную квартиру-студию в общем доме (системе). У него там свои стены: свой набор процессов (PID), своя сетевая розетка (NET), своя мини-кухня-файловая система (MNT). Соседний контейнер нихуя не знает, что у тебя творится за стенкой. Полная изоляция, но без лишних наворотов — все живут в одном ядре ОС.
  2. Control Groups (cgroups) — а это уже лимиты на коммунальные услуги в этой квартире. Чтобы один жадный контейнер не сожрал всю оперативку и процессор, оставив других голодными. cgroups говорят: «Тебе — два ядра и гигабайт памяти, и ни байтом больше, сволочь». Контроль и учёт ресурсов, короче.
  3. Union File Systems (типа OverlayFS) — вот это вообще гениальная тема для экономии места. Представь, что базовый образ (например, alpine:latest) — это общая стена с обоями (read-only слой). А каждый новый контейнер — это как постик, который ты на эту стену клеишь (read-write слой). Все контейнеры используют одни и те же обои, но у каждого свои постики. Поэтому образы такие лёгкие и быстро разворачиваются. Не надо каждый раз всю операционку таскать с собой, ёпта!
  4. Container Runtime (runc) — а это уже тот самый грузчик-низкоуровневый работяга, который по накладной (спецификации OCI) собирает эту квартиру: стены (namespaces) ставит, лимиты (cgroups) выставляет, обои (слои файловой системы) клеит. Docker ему командует, а runc всё делает.

Вот смотри, как это в коде выглядит, на простом примере:

# Берём те самые общие обои — лёгкий образ Alpine (UnionFS)
FROM alpine:latest

# В изолированной кухне этого будущего контейнера (namespace) ставим nginx
RUN apk add --no-cache nginx

# И говорим, что при заселении контейнер должен сразу запустить сервер
CMD ["nginx", "-g", "daemon off;"]

Короче, вся фишка Docker — не в какой-то космической технологии, а в том, как он упаковал уже существующие в ядре Linux механизмы (namespaces, cgroups) в удобную обёртку. Получился не монстр-виртуалка, который жрёт ресурсы как не в себя, а лёгкий изолированный пакет. Гениально и, если вдуматься, овердохуища просто.