Снятие ограничений для Docker в LXC на Debian 13
-
Содержание
-
ВНИМАНИЕ ! Инструкция не проверена
Снятие ограничений для Docker в LXC на Debian 13
Полная инструкция по адаптации LXC для установки и запуска Docker внутри контейнера на хосте Debian 13
В отличие от Ubuntu 24.04, где Docker работает "из коробки" благодаря более свежим настройкам ядра, AppArmor и LXC, на Debian 13 требуется специальная конфигурация для поддержки вложенных контейнеров (nesting). Это включает отключение ограничений AppArmor, разрешение устройств и capabilities, а также правильное монтирование файловых систем для cgroups и overlayFS, которые необходимы Docker.
Инструкция охватывает создание привилегированного LXC-контейнера с Debian 12 (bookworm) внутри, настройку для полной совместимости с Docker и рекомендации по установке Docker. Контейнер будет настроен как привилегированный (автоматически, без явного ключа
lxc.privileged, который не поддерживается в LXC на Debian 13). Это позволит запускать Docker-контейнеры без ошибок, связанных с cgroups, overlay, сетью или capabilities.Важные предупреждения:
- Такие настройки снижают безопасность (включая nesting и unconfined AppArmor), поэтому используйте только для доверенных сред. Избегайте в продакшене без дополнительных мер (например, SELinux или ограниченных capabilities).
- Тестируйте на чистой системе. Если у вас уже есть контейнер, создайте новый для чистоты.
- Хост: Debian 13 (Trixie). Гость: Debian 12 (Bookworm, amd64).
- Docker внутри LXC требует ядра хоста ≥ 6.1 с поддержкой overlayFS и cgroups v2. Проверьте:
uname -r(должно быть ≥ 6.1) иgrep -i overlay /proc/filesystems(должно показать "nodev overlay").
Шаг 1: Подготовка хоста (Debian 13)
-
Установите LXC и необходимые пакеты:
sudo apt update sudo apt install lxc lxc-templates bridge-utils- Это установит LXC версии ~5.x–6.x, типичной для Debian 13.
- Если нужно, настройте мост lxcbr0 (обычно создается автоматически при установке LXC).
-
Проверьте поддержку ядра:
- Версия ядра:
uname -r(должна быть 6.1+). - Поддержка overlay:
grep -i overlay /proc/filesystems(если нет, обновите ядро:sudo apt install linux-image-amd64и перезагрузите). - cgroups v2:
ls /sys/fs/cgroup(должны быть файлы unified или cgroup2).
- Версия ядра:
-
Настройте сетевой мост (если не настроен):
- Редактируйте
/etc/network/interfacesили используйте systemd-networkd. - Пример для lxcbr0:
sudo apt install bridge-utils sudo brctl addbr lxcbr0 sudo ip addr add 10.0.3.1/24 dev lxcbr0 sudo ip link set lxcbr0 up - Для постоянства добавьте в
/etc/network/interfaces:auto lxcbr0 iface lxcbr0 inet static address 10.0.3.1/24 bridge_ports none bridge_fd 0 bridge_maxwait 0
- Редактируйте
Шаг 2: Создание LXC-контейнера
Команда для создания контейнера:
sudo lxc-create -t download -n container_jitsi -- --dist debian --release bookworm --arch amd64-
Достаточно ли этой команды? Да, полностью достаточно для создания базового контейнера. Она скачает шаблон Debian 12 (bookworm) для amd64, создаст rootfs в
/var/lib/lxc/container_jitsi/rootfsи сгенерирует базовый config в/var/lib/lxc/container_jitsi/config. После этого контейнер готов к редактированию и запуску. Нет нужды в дополнительных флагах — привилегированный режим достигается автоматически (безlxc.idmap), если контейнер создается от root. -
Если возникнут ошибки (например, нет интернета), проверьте прокси или зеркала в
/etc/lxc/default.conf.
Шаг 3: Редактирование конфигурации LXC для поддержки Docker
Откройте файл
/var/lib/lxc/container_jitsi/configв редакторе (например,sudo nano /var/lib/lxc/container_jitsi/config) и замените его содержимое на следующее. Это адаптированный конфиг из обсуждения, оптимизированный для Debian 13: включена nesting, отключены ограничения, добавлено монтирование cgroup2 для Docker.# --- Автозагрузка контейнера --- lxc.start.auto = 1 lxc.start.order = 100 # --- Включаем базовые конфиги и поддержку nested контейнеров --- lxc.include = /usr/share/lxc/config/common.conf lxc.include = /usr/share/lxc/config/nesting.conf lxc.arch = linux64 # --- Полное отключение AppArmor (критично для Debian, чтобы избежать ошибок с Docker и Jitsi) --- lxc.apparmor.profile = unconfined # --- Разрешить все устройства (для Docker и Jitsi) --- lxc.cgroup.devices.allow = a # --- Не отбрасывать capabilities (полные права для Docker) --- lxc.cap.drop = # --- Корневая файловая система и имя контейнера --- lxc.rootfs.path = dir:/var/lib/lxc/container_jitsi/rootfs lxc.uts.name = container_jitsi # --- Автомонтирование системных директорий с правами rw --- lxc.mount.auto = proc:rw sys:rw # --- Монтирование cgroup2 (обязательно для cgroups v2 в Docker на Debian) --- lxc.mount.entry = /sys/fs/cgroup sys/fs/cgroup none bind,create=dir 0 0 # --- Сетевые настройки --- lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up lxc.net.0.hwaddr = 00:16:3a:12:34:50 # Замените на уникальный MAC, если нужно lxc.net.0.ipv4.address = 10.0.3.140/24 # Статический IP, измените по необходимости lxc.net.0.ipv4.gateway = 10.0.3.1Объяснение ключевых настроек (почему они нужны на Debian 13):
lxc.include = /usr/share/lxc/config/nesting.conf: Включает поддержку вложенных контейнеров (namespaces, overlayFS, cgroups). Без этого Docker не запустится.lxc.apparmor.profile = unconfined: Отключает AppArmor, который на Debian строже, чем на Ubuntu, и блокирует системные вызовы для Docker (например, для Jitsi Video Bridge). Альтернативаgeneratedне работает стабильно.lxc.cgroup.devices.allow = a: Разрешает все устройства — Docker и Jitsi используют random устройства (timerfd, netlink).lxc.cap.drop =: Убирает ограничения на capabilities (SYS_ADMIN, NET_ADMIN и т.д.), иначе Docker не сможет создавать сети или mount.lxc.mount.auto = proc:rw sys:rw: Монтирует /proc и /sys с правами записи — нужно для Docker.lxc.mount.entry = /sys/fs/cgroup ...: Исправляет монтирование cgroup2, без чего Docker падает на Debian.- Нет
lxc.privileged = 1: Этот ключ не поддерживается в LXC на Debian (выдаст ошибку). Привилегированный режим автоматический, если нет idmap. - Сеть: veth с мостом lxcbr0 — стандартно для изоляции, но Docker внутри сможет создавать свои сети.
Сохраните файл и проверьте синтаксис:
sudo lxc-info -n container_jitsi(должен показать stopped).Шаг 4: Запуск и проверка LXC-контейнера
-
Запустите контейнер:
sudo lxc-start -n container_jitsi- Если ошибки, проверьте логи:
sudo lxc-info -n container_jitsi --statsили/var/log/lxc/container_jitsi.log.
- Если ошибки, проверьте логи:
-
Войдите в контейнер:
sudo lxc-attach -n container_jitsi- Вы окажетесь в root-шелле Debian 12 внутри.
-
Проверьте внутри:
uname -r: Должно показать ядро хоста (Debian 13).ls /sys/fs/cgroup: Должно быть смонтировано правильно.
Шаг 5: Установка Docker внутри LXC-контейнера
Внутри контейнера (после
lxc-attach
-
Обновите систему:
apt update && apt upgrade -y -
Установите Docker:
apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable" > /etc/apt/sources.list.d/docker.list apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -
Запустите Docker:
systemctl start docker systemctl enable docker -
Проверьте Docker:
docker run hello-world- Если работает — nesting настроено правильно.
- Проверьте storage driver:
docker info | grep Storage(должен быть overlay2). - Если ошибки (overlay not supported), проверьте ядро хоста.
Шаг 6: Установка Jitsi в Docker (опционально, на основе обсуждения)
Если цель — Jitsi, используйте docker-compose.yml из обсуждения. Внутри контейнера:
- Установите docker-compose:
apt install docker-compose. - Создайте .env и docker-compose.yml (скопируйте из #11–#12 в обсуждении).
- Для порта 10001 UDP вместо 10000:
- В .env:
JVB_PORT=10001иJVB_PORT_UDP=10001. - В docker-compose.yml: ports: - '${JVB_PORT:-10001}:${JVB_PORT:-10001}/udp'.
- Запустите:
docker compose up -d. - Откройте порт:
ufw allow 10001/udp(на хосте и в NAT).
- В .env:
Шаг 7: Диагностика и отладка
- Логи LXC:
sudo lxc-console -n container_jitsiили journalctl на хосте. - Логи Docker внутри:
journalctl -u dockerилиdocker logs <container>. - Если ошибки:
- Overlay: Проверьте ядро.
- cgroups: Добавьте
lxc.cgroup2.devices.allow = a(если не помогает). - AppArmor: Убедитесь в unconfined.
- Для безопасности: После теста ограничьте capabilities (например,
lxc.cap.drop = mac_admin mac_override).
Эта конфигурация гарантирует работу Docker как на Ubuntu 24.04.
-
Снятие ограничений для Docker в LXC на Ubuntu 24.04
# Template used to create this container: /usr/share/lxc/templates/lxc-download # Parameters passed to the template: --dist debian --release bookworm --arch amd64 # For additional config options, please look at lxc.container.conf(5) # Включаем поддержку вложенных контейнеров (nesting) lxc.include = /usr/share/lxc/config/nesting.conf # Отключаем ограничения AppArmor для полной свободы действий lxc.apparmor.profile = unconfined # Разрешаем все устройства (для работы Docker) lxc.cgroup.devices.allow = a # Убираем ограничения на capabilities (полные права для контейнера) lxc.cap.drop = # Разрешаем монтирование системных директорий с правами чтения-записи lxc.mount.auto = proc:rw sys:rw # Distribution configuration lxc.include = /usr/share/lxc/config/common.conf lxc.arch = linux64 # Container specific configuration lxc.rootfs.path = dir:/var/lib/lxc/container_native/rootfs lxc.uts.name = container_native # Network configuration lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up lxc.net.0.hwaddr = 00:16:3e:7f:79:c0 lxc.net.0.ipv4.address = 10.0.3.170/24 lxc.net.0.ipv4.gateway = 10.0.3.1
Этот конфиг LXC работает на хосте Ubuntu 24.04 и позволяет нормально запускать Docker с Jitsi внутри контейнера
Конфиг создаёт привилегированный LXC-контейнер (без
lxc.idmap, от root) с Debian 12 внутри. Он включает ключевые настройки для nested контейнеризации (Docker внутри LXC):lxc.include = /usr/share/lxc/config/nesting.conf— включает nesting.lxc.apparmor.profile = unconfined— полностью отключает AppArmor.lxc.cgroup.devices.allow = a— разрешает все устройства.lxc.cap.drop =— сохраняет все capabilities.lxc.mount.auto = proc:rw sys:rw— монтирует /proc и /sys с правами записи.
На Ubuntu 24.04 этот конфиг работает стабильно, и Docker (включая сложный стек Jitsi с web, prosody, jicofo, jvb) запускается без ошибок. На Debian 13 (или старых версиях) часто возникают проблемы с overlay2, cgroups, сетью или capabilities. Вот подробное объяснение причин.
1. Более свежее ядро Linux
- Ubuntu 24.04 использует Linux kernel 6.8 (с возможными обновлениями до новее через HWE).
- Это обеспечивает отличную поддержку:
- cgroups v2 (единой иерархии, которую Docker предпочитает по умолчанию).
- overlayFS (storage driver overlay2 в Docker — самый эффективный).
- Вложенных namespaces и устройств для nested контейнеров.
- Docker и Jitsi (особенно JVB с UDP-портами и сетевыми привилегиями) требуют современных фич ядра. На старом ядре (например, 6.1 в базовом Debian) могут быть баги или отсутствовать оптимизации → ошибки при создании контейнеров.
2. Более лояльный и современный AppArmor
- Ubuntu активно развивает AppArmor (Canonical — основной контрибьютор). В Ubuntu 24.04 профили для nested контейнеров менее строгие: даже без
unconfinedмногие системные вызовы проходят. nesting.confв Ubuntu включает улучшения для вложенных контейнеров (лучшая поддержка overlay, cgroups, capabilities).- В Debian AppArmor строже и консервативнее → даже с nesting часто блокирует вызовы, нужные Docker (mount namespace, cap_sys_admin для JVB, сетевые операции). Поэтому требуется явное
unconfined. - На Ubuntu ваш конфиг с
unconfinedработает, но часто достаточно и без него — система "прощает" больше.
3. Автоматические улучшения для nested контейнеров в LXC
- Версия LXC в Ubuntu 24.04 — новее (5.x–6.x с патчами от Canonical).
nesting.confв Ubuntu авто-разрешает многие вещи:- Полный доступ к cgroups для Docker.
- Лучшую работу с устройствами и capabilities.
- Монтирование /proc и /sys без дополнительных настроек.
- В Debian nesting менее "щедрый" → нужны дополнительные строки (например, ручное монтирование cgroup2).
- Ubuntu ориентирована на облака/контейнеры (Canonical продвигает LXD/LXC), поэтому баги с Docker внутри LXC фиксятся быстрее.
4. Привилегированный режим "из коробки"
- Контейнер привилегированный (нет idmap) → root внутри имеет почти полные права на хостовом ядре.
- В комбинации с свежим ядром и AppArmor это даёт Docker всё необходимое:
- Управление cgroups.
- Создание overlayFS.
- NET_ADMIN/SYS_ADMIN для сетей Jitsi.
- На Debian даже в привилегированном режиме строгий AppArmor и старое ядро могут ограничивать.
5. Специфика Jitsi в Docker
- Jitsi требует:
- UDP-порты (10000/10001) с NET_ADMIN.
- Много устройств (timerfd, RTC).
- Полные capabilities для JVB (видеомост).
- На Ubuntu это проходит гладко благодаря ядру и nesting.
- На Debian часто падает JVB или web с ошибками "shim task", "mount namespace" или "overlay not supported".
Итог: Ubuntu 24.04 "заточена" под современную контейнеризацию — свежее ядро, лояльный AppArmor и оптимизированный LXC делают ваш конфиг достаточным. Debian более консервативен и стабилен, но требует дополнительных настроек (как в исправленном конфиге из обсуждения: без privileged-ключа, с ручным cgroup2). Поэтому на Ubuntu всё работает "из коробки", а Jitsi запускается без проблем. Если переходите на Debian-хост — используйте полный исправленный конфиг с монтированием cgroup2.