Вопрос или проблема
У меня есть непривилегированный lxc-контейнер на хосте Arch, созданный следующим образом:
lxc-create -n test_arch11 -t download -- --dist archlinux --release current --arch amd64
И он не запускает docker. Что я сделал внутри контейнера:
- Установил docker из репозиториев Arch
pacman -S docker
- Попробовал запустить контейнер hello-world
docker run hello-world
- Получил следующую ошибку:
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-контейнера
-
Создайте привилегированный LXC-контейнер:
Чтобы создать привилегированный контейнер, вы можете использовать следующую команду:lxc-create -n test_arch11 -t download -- --dist archlinux --release current --arch amd64 --privileged
Привилегированные контейнеры имеют более широкий доступ к ресурсам хостовой системы, что позволяет запускать Docker и другие виртуализации.
-
Установите Docker:
После создания контейнера, необходимо его запустить:lxc-start -n test_arch11 lxc-attach -n test_arch11
Затем установите Docker:
pacman -Syu # Обновите систему pacman -S docker # Установите Docker
-
Запустите службы Docker:
Убедитесь, что служба Docker запущена и настроена для автозапуска:systemctl start docker systemctl enable docker
-
Запустите тестовый контейнер:
Теперь вы можете попробовать запустить «hello-world» контейнер:docker run hello-world
Решение проблем с cgroup (если необходимо)
Если вы столкнулись с проблемами, связанными с cgroup, возможно, вам потребуется изменить настройки GRUB для поддержки cgroup v1:
-
Измените конфигурацию GRUB:
Откройте файл конфигурации GRUB:nano /etc/default/grub
Найдите строку
GRUB_CMDLINE_LINUX
и добавьте следующий параметр:systemd.unified_cgroup_hierarchy=0
-
Обновите конфигурацию GRUB:
После изменения конфигурации обновите ее:grub-mkconfig -o /boot/grub/grub.cfg
-
Перезагрузите систему:
После внесения изменений перезагрузите вашу систему:reboot
Альтернативные решения
Если вы не хотите или не можете использовать привилегированные LXC-контейнеры, рассмотрите возможность использования виртуальных машин с KVM или VirtualBox, поскольку они предоставляют больше возможностей для запуска Docker и других изолированных сред.
Заключение
Запуск Docker в привилегированном LXC-контейнере — это достаточно распространенная практика, но требует внимательного отношения к безопасности и настройкам cgroup. Убедитесь, что ваш контейнер настроен должным образом, и вы следуете лучшим практикам безопасности при работе с привилегированными контейнерами.