Принципы daemonless рантайма: почему Cardinal не требует постоянного фонового сервиса
Почему архитектура без демона эффективнее для контейнерных нагрузок: прямое использование clone(2), cgroups v2, OverlayFS и освобождение системных ресурсов сразу после старта контейнера.
- ▸Традиционные рантаймы тратят память хоста на непрерывно работающие root-демоны (dockerd / containerd).
- ▸Cardinal настраивает изоляцию (PID, Mount, Net, UTS, IPC), монтирует OverlayFS, применяет лимиты cgroups v2 и завершает управляющий процесс.
- ▸Изолированные контейнеры продолжают работать под управлением стандартного ядра Linux (init / systemd).
- ▸Динамическое добавление портов (`cardinal port add/rm`) работает через манипуляцию iptables/nftables без перезапуска контейнера.
1. Проблема постоянного демона в традиционных рантаймах
В классической архитектуре Docker или containerd на сервере непрерывно запущен фоновый сервис (daemon), потребляющий от 50 до 150 МБ оперативной памяти даже в состоянии полного простоя (0 запущенных контейнеров). Более того, падение демона создаёт риск разрыва соединений или затрудняет восстановление состояния процессов. Cardinal изначально спроектирован по daemonless-философии: статический бинарник (~5 МБ) вызывается только тогда, когда нужно запустить, остановить или проинспектировать контейнер.
2. Системные примитивы ядра Linux: clone(2) и cgroups v2
Контейнер в Linux — это не виртуальная машина, а обычный процесс с ограниченным пространством имён. Cardinal использует системный вызов clone(2) с флагами CLONE_NEWPID, CLONE_NEWNS, CLONE_NEWNET, CLONE_NEWUTS и CLONE_NEWIPC. Ограничение потребления ресурсов (CPU shares, memory.max, io.weight) настраивается напрямую через контроллеры современной файловой системы cgroups v2 (`/sys/fs/cgroup/cardinal/<id>`).
# Запуск PostgreSQL с лимитом 1 ГБ RAM и 2 ядрами CPU
cardinal run -d --name pg-main \
--memory 1024m \
--cpus 2 \
-p 5432:5432 \
postgres:16
# Проверка реального потребления ресурсов через cgroups v2:
cardinal stats pg-main3. Динамический проброс портов без перезапуска
Одной из уникальных возможностей Cardinal является динамическое добавление и удаление портов на лету без необходимости пересоздавать контейнер. Команда `cardinal port add <container> <host_port>:<container_port>` напрямую вносит правила NAT в сетевой стек Linux, позволяя подключать новые сервисы в работающий контейнер мгновенно.
