Как запустить Docker внутри контейнера LXC?

Вопрос или проблема

У меня есть непривилегированный lxc-контейнер на хосте Arch, созданный следующим образом:

lxc-create -n test_arch11 -t download -- --dist archlinux --release current --arch amd64

И он не запускает docker. Что я сделал внутри контейнера:

  1. Установил docker из репозиториев Arch pacman -S docker
  2. Попробовал запустить контейнер hello-world docker run hello-world
  3. Получил следующую ошибку:

docker: Ошибка ответа от демона: OCI runtime create failed: container_linux.go:346: запуск процесса контейнера вызвал “process_linux.go:297: применение конфигурации cgroup для процесса вызвало \”mkdir /sys/fs/cgroup/cpuset/docker: permission denied\””: неизвестно.

ERRO[0037] ошибка ожидания контейнера: контекст отменен

Что не так и как заставить docker работать внутри контейнера?

Поскольку lxc и docker используют один и тот же вид изоляции (так называемое пространство имен ядра), вы не можете запустить docker в непривилегированном lxc.

Ваш lxc контейнер должен иметь привилегии.

Но вы можете запустить docker в обычной виртуальной машине (kvm, virtualbox и т.д.)

Я решил проблему, добавив флаг в конфигурацию grub. Вот источник: https://fedoraproject.org/wiki/Changes/CGroupsV2#Upgrade.2Fcompatibility_impact

Следуйте этим шагам:

1- Отредактируйте /etc/default/grub

2- Добавьте следующий флаг в строку GRUB_CMDLINE_LINUX: systemd.unified_cgroup_hierarchy=0

3- Затем: grub2-mkconfig

4- Перезагрузите ваш ПК

Ответ или решение

Запуск Docker внутри LXC-контейнера — задача не из легких, так как оба используют похожую изоляцию (пространства имен ядра). Это значит, что, в частности, вы не сможете запустить Docker в непривилегированном LXC-контейнере. Чтобы Docker мог работать, ваш LXC-контейнер должен быть привилегированным.

Шаги, чтобы запустить Docker внутри привилегированного LXC-контейнера

  1. Создайте привилегированный LXC-контейнер:
    Чтобы создать привилегированный контейнер, вы можете использовать следующую команду:

    lxc-create -n test_arch11 -t download -- --dist archlinux --release current --arch amd64 --privileged

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

  2. Установите Docker:
    После создания контейнера, необходимо его запустить:

    lxc-start -n test_arch11
    lxc-attach -n test_arch11

    Затем установите Docker:

    pacman -Syu      # Обновите систему
    pacman -S docker # Установите Docker
  3. Запустите службы Docker:
    Убедитесь, что служба Docker запущена и настроена для автозапуска:

    systemctl start docker
    systemctl enable docker
  4. Запустите тестовый контейнер:
    Теперь вы можете попробовать запустить «hello-world» контейнер:

    docker run hello-world

Решение проблем с cgroup (если необходимо)

Если вы столкнулись с проблемами, связанными с cgroup, возможно, вам потребуется изменить настройки GRUB для поддержки cgroup v1:

  1. Измените конфигурацию GRUB:
    Откройте файл конфигурации GRUB:

    nano /etc/default/grub

    Найдите строку GRUB_CMDLINE_LINUX и добавьте следующий параметр:

    systemd.unified_cgroup_hierarchy=0
  2. Обновите конфигурацию GRUB:
    После изменения конфигурации обновите ее:

    grub-mkconfig -o /boot/grub/grub.cfg
  3. Перезагрузите систему:
    После внесения изменений перезагрузите вашу систему:

    reboot

Альтернативные решения

Если вы не хотите или не можете использовать привилегированные LXC-контейнеры, рассмотрите возможность использования виртуальных машин с KVM или VirtualBox, поскольку они предоставляют больше возможностей для запуска Docker и других изолированных сред.

Заключение

Запуск Docker в привилегированном LXC-контейнере — это достаточно распространенная практика, но требует внимательного отношения к безопасности и настройкам cgroup. Убедитесь, что ваш контейнер настроен должным образом, и вы следуете лучшим практикам безопасности при работе с привилегированными контейнерами.

Оцените материал
Добавить комментарий

Капча загружается...