runc
runc — это легковесная утилита командной строки для запуска контейнеров в операционной системе Linux, реализующая спецификацию Open Container Initiative (OCI). runc создаёт и управляет жизненным циклом контейнеров на основе спецификаций OCI Runtime Specification и OCI Image Specification. Инструмент написан на языке программирования Go и является основным компонентом многих современных систем контейнеризации, включая Docker, Podman и containerd.
История
Разработка runc началась внутри компании Docker Inc. как часть проекта по созданию более модульной и стандартизированной архитектуры контейнеров. В 2014 году Docker передал код runc в некоммерческую организацию Linux Foundation под управлением Open Container Initiative (OCI). Целью передачи было создание единого открытого стандарта для контейнерных сред, чтобы избежать фрагментации экосистемы. runc стал эталонной реализацией спецификации OCI Runtime Specification.
Первая стабильная версия runc была выпущена в 2015 году. С тех пор инструмент активно развивается сообществом разработчиков, поддерживается крупными компаниями (Red Hat, Google, SUSE, IBM) и используется в большинстве современных контейнерных платформ. В 2016 году runc стал частью проекта containerd, который также был передан Docker в Cloud Native Computing Foundation (CNCF).
Архитектура и принцип работы
runc работает на низком уровне, используя системные вызовы ядра Linux для изоляции процессов. Основные механизмы, задействованные при запуске контейнера:
- Пространства имён (namespaces) — изоляция ресурсов: PID, сеть, монтирование, UTS, IPC, пользовательские ID.
- Контрольные группы (cgroups) — ограничение и учёт ресурсов: CPU, память, диск, сетевой трафик.
- UnionFS — файловая система для объединения слоёв образа (например, overlay2, aufs).
- Seccomp — фильтрация системных вызовов для повышения безопасности.
- Capabilities — ограничение привилегий процесса внутри контейнера.
Жизненный цикл контейнера
- Создание (create) — runc создаёт контейнер на основе конфигурационного файла
config.json, который описывает корневую файловую систему, точки монтирования, переменные окружения, команду запуска и ограничения ресурсов. - Запуск (start) — процесс внутри контейнера начинает выполнение указанной команды (например,
/bin/shили пользовательского приложения). - Остановка (stop) — runc посылает сигнал завершения процессу (SIGTERM, затем SIGKILL).
- Удаление (delete) — освобождение ресурсов, связанных с контейнером.
Формат конфигурации
Конфигурация контейнера для runc задаётся в файле config.json, который соответствует OCI Runtime Specification. Файл включает следующие основные секции:
- ociVersion — версия спецификации.
- root — путь к корневой файловой системе контейнера.
- mounts — список точек монтирования (внешние каталоги, tmpfs, proc, sys).
- process — параметры запускаемого процесса:
args,env,cwd,capabilities,rlimits. - hostname — имя хоста внутри контейнера.
- linux — специфичные для Linux настройки:
namespaces,cgroupsPath,seccomp,devices,resources.
Пример минимального config.json:
``json { "ociVersion": "1.0.2-dev", "root": { "path": "rootfs" }, "process": { "terminal": true, "user": { "uid": 0, "gid": 0 }, "args": [ "/bin/sh" ], "env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "TERM=xterm" ], "cwd": "/" }, "linux": { "namespaces": [ {"type": "pid"}, {"type": "network"}, {"type": "ipc"}, {"type": "uts"}, {"type": "mount"} ] } } ``
Применение
runc используется как низкоуровневый компонент в следующих системах:
- Docker — начиная с версии 1.11, Docker использует runc через containerd. Команда
docker runв конечном счёте запускает контейнер через runc. - Podman — контейнерный движок без демона, напрямую взаимодействующий с runc (или crun) для запуска контейнеров.
- containerd — промышленный контейнерный рантайм, который управляет жизненным циклом контейнеров через runc.
- Kubernetes — через CRI (Container Runtime Interface) использует containerd, который, в свою очередь, использует runc.
- LXC/LXD — некоторые версии могут использовать runc для совместимости с OCI-образами.
Преимущества и недостатки
Преимущества
- Лёгкость и минимализм — runc не имеет зависимостей, кроме ядра Linux, и не требует запуска фонового демона.
- Стандартизация — полная совместимость с OCI Runtime Specification, что гарантирует переносимость контейнеров между разными платформами.
- Безопасность — использование изоляции на уровне ядра, seccomp, capabilities и пользовательских пространств имён.
- Открытый исходный код — лицензия Apache 2.0, активное сообщество разработчиков.
Недостатки
- Только Linux — runc не работает на Windows или macOS напрямую (требуется виртуализация).
- Низкий уровень — для обычного пользователя runc неудобен: требуется ручное создание
config.jsonи файловой системы. - Отсутствие управления образами — runc не умеет скачивать, хранить или распаковывать образы контейнеров; для этого нужны дополнительные инструменты (skopeo, podman, docker).
- Ограниченная поддержка графических интерфейсов — запуск GUI-приложений в контейнерах через runc требует дополнительной настройки X11 или Wayland.
Безопасность
runc считается одним из самых безопасных контейнерных рантаймов благодаря прямому использованию системных вызовов ядра и отсутствию привилегированного демона. Однако в истории проекта были обнаружены уязвимости:
- CVE-2019-5736 — уязвимость, позволяющая злоумышленнику с правами root внутри контейнера переписать бинарный файл runc на хосте. Исправлена в версии 1.0.0-rc8.
- CVE-2021-30465 — проблема с символическими ссылками при монтировании томов, позволяющая выполнять атаки типа «symlink race». Исправлена в версии 1.0.0-rc95.
Разработчики runc рекомендуют использовать последнюю стабильную версию и применять дополнительные меры безопасности: пользовательские пространства имён (user namespaces), ограничение capabilities, включение seccomp-профилей.
Альтернативы
- crun — более быстрая реализация OCI Runtime на языке C, разрабатываемая Red Hat. Использует меньше памяти и быстрее запускает контейнеры.
- youki — реализация на языке Rust, ориентированная на безопасность и производительность.
- gVisor — рантайм от Google, который запускает контейнеры в изолированном пользовательском ядре (sandbox), что повышает безопасность, но снижает производительность.
- Kata Containers — использует легковесные виртуальные машины для изоляции контейнеров.
Развитие и сообщество
Проект runc размещён на GitHub и поддерживается Open Container Initiative. Релизы выходят несколько раз в год. Основные участники — инженеры из Red Hat, SUSE, Docker, Google, IBM. runc является частью экосистемы CNCF и используется в большинстве промышленных контейнерных решений.
Источники
- Open Container Initiative Runtime Specification
- Официальная документация runc (GitHub)
- Docker Inc. — история передачи runc в OCI
- Cloud Native Computing Foundation — проект containerd
- Red Hat — сравнение runc и crun
- CVE-2019-5736 и CVE-2021-30465 — отчёты об уязвимостях
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →