runc
— это утилита с открытым исходным кодом, созданная для запуска контейнеров, совместимых со спецификацией Open Container Initiative (OCI). Она выполняет важную роль в экосистеме Docker, так как является низкоуровневым инструментом, который Docker использует для запуска контейнеров на уровне операционной системы.
Контейнерная runtime-утилита: runc
— это инструмент, который отвечает за создание и запуск контейнеров на уровне операционной системы. Он взаимодействует напрямую с ядром Linux, используя такие технологии, как namespaces и cgroups, чтобы создать изолированное окружение для каждого контейнера. Этот инструмент реализует интерфейс для работы со спецификацией контейнеров OCI, что делает его универсальным для различных контейнерных решений, включая Docker.
Использование в Docker: Docker использует runc
в качестве контейнерного runtime по умолчанию. Docker Daemon принимает команды от пользователя (например, на запуск контейнера), а затем через контейнерную runtime (по умолчанию runc
) выполняет эти команды. runc
отвечает за фактический запуск процесса контейнера с его изолированным окружением.
Open Container Initiative (OCI): В 2015 году Docker запустил инициативу OCI с целью стандартизации контейнерных технологий. Это позволило создать единую спецификацию для контейнеров и их запуска. runc
был разработан на основе этой спецификации, чтобы соответствовать стандартам и быть совместимым с другими инструментами контейнеризации.
Взаимодействие с Docker Daemon: Docker Daemon не запускает контейнеры сам по себе. Он управляет процессами и взаимодействует с различными компонентами экосистемы Docker, включая runc
. Когда вы запускаете контейнер через Docker CLI, Docker Daemon передает команду для запуска контейнера с использованием runc
, который непосредственно создает и исполняет контейнер.
Архитектура Docker с runc
: Docker имеет многоуровневую архитектуру:
runc
): запускает и управляет контейнерами на уровне операционной системы.Лёгкость и минимализм: Одной из причин создания runc
стало желание сделать его минималистичным и высокоэффективным инструментом. Он выполняет одну задачу — запуск контейнеров — и делает это напрямую, что упрощает поддержку и делает контейнеризацию более модульной.
Docker изначально был монолитной системой, выполнявшей все задачи контейнеризации. Однако, с созданием runc
и переходом на стандарты OCI, Docker стал модульной платформой, где каждая часть системы отвечает за конкретную функцию. Это повысило гибкость и совместимость Docker с другими системами, сделало его более прозрачным и стандартизированным.