Можно ли запустить контейнер LXC внутри контейнера LXC?


21

Можно ли запустить контейнер LXC внутри другого контейнера LXC?


1
У вас действительно есть реальная причина для этого? Пожалуйста, помните, что вопросы здесь должны касаться реальных проблем, с которыми вы сталкиваетесь .
Зоредаче

6
Я думаю, что lxc должен быть в состоянии упростить миграцию виртуальных машин (и резервное копирование + восстановление тоже). Но я не уверен в случаях, когда нет доступа к хост-системе (например, дешевый vps).
Михаил

Ответы:


45

Я собираюсь развеять несколько мифов здесь.

Это просто плохая идея. Мне жаль. - Джейкоб 5 марта в 20:30

Я не понимаю, как это плохая идея. Это действительно просто chroot внутри chroot. С одной стороны, это может снизить производительность каким-то незначительным образом (ничто по сравнению с запуском ВМ внутри ВМ). С другой стороны, он, вероятно, будет более безопасным (например, более изолированным от корневой хост-системы и ее компонентов).

У вас действительно есть реальная причина для этого? Пожалуйста, помните, что вопросы здесь должны касаться реальных проблем, с которыми вы сталкиваетесь. - Зоредаче 5 марта в 21:52

Я согласен на 100% со следующим комментарием автора. Кроме того, я думаю, что можно с уверенностью предположить, что все, кто задает вопрос здесь, вероятно, думают, что у них есть реальная причина сделать это [это] ..

Я думаю, что lxc должен быть в состоянии упростить миграцию виртуальных машин (и резервное копирование + восстановление тоже). Но я не уверен в случаях, когда нет доступа к хост-системе (например, дешевый vps). - Михаил Мар 6 в 11:17

Я действительно столкнулся с этим вопросом еще в июне, когда я впервые погрузился в LXC для проектов PaaS / IaaS, и меня особенно интересовала возможность позволить пользователям эмулировать облачные среды для целей разработки.

LXCeption. Мы слишком глубоко - Том О'Коннор 6 марта в 22:46

Я немного рассмеялся, когда прочитал этот, но это совсем не так :)

В любом случае, после прочтения всего этого, я, в конце концов, настроил среду VirtualBox со стандартной установкой Ubuntu 12.04 LTS Server Edition, полагая, что это на 100% возможно. После установки LXC я создал новый контейнер и установил LXC внутри контейнера с помощью apt-get. Большая часть установки прошла успешно, но в итоге привела к ошибке из-за проблемы с пакетом cgroup-lite, чье задание запуска не удалось запустить после установки пакета.

После небольшого поиска я наткнулся на эту прекрасную статью на stgraber.org (вкусности скрыты в разделе «Вложение контейнера»):

sudo apt-get install lxc
sudo lxc-create -t ubuntu -n my-host-container -t ubuntu
sudo wget https://www.stgraber.org/download/lxc-with-nesting -O /etc/apparmor.d/lxc/lxc-with-nesting
sudo /etc/init.d/apparmor reload
sudo sed -i "s/#lxc.aa_profile = unconfined/lxc.aa_profile = lxc-container-with-nesting/" /var/lib/lxc/my-host-container/config
sudo lxc-start -n my-host-container
(in my-host-container) sudo apt-get install lxc
(in my-host-container) sudo stop lxc
(in my-host-container) sudo sed -i "s/10.0.3/10.0.4/g" /etc/default/lxc
(in my-host-container) sudo start lxc
(in my-host-container) sudo lxc-create -n my-sub-container -t ubuntu
(in my-host-container) sudo lxc-start -n my-sub-container

Установка этой политики AppArmor и перезапуск демона сделали свое дело (хотя не забудьте изменить диапазоны сети!). На самом деле, я подумал, что этот конкретный фрагмент был настолько важен, что отразил его на @ http://pastebin.com/JDFp6cTB на тот случай, если статья когда-нибудь выйдет в офлайн

После этого все sudo /etc/init.d/cgroup-lite startполучилось, и плавание прошло гладко.

Так что, да, можно запустить контейнер LXC внутри другого контейнера LXC :)


1
Эта конфигурация в значительной степени отключает защиту AppArmor (путем запуска контейнера без ограничений). AppArmor «предназначен для защиты хоста от случайного злоупотребления привилегиями внутри контейнера». Эта конфигурация в значительной степени открывает хост lxc для использования вашим вложенным контейнером lxc. Вложенный хост LXC может также не обеспечивать защиту своих контейнеров. В общем, отключение этой защиты не рекомендуется.
Reece45

Есть ли надежный безопасный подход для запуска lxc внутри lxc?
Маскарпоне

10
Реальный пример использования: у меня есть контейнер LXC, на котором выполняется jenkins, и я хочу, чтобы jenkins мог запускать контейнеры LXC перед выполнением интеграционных тестов. Альтернативы: запускать jenkins вне LXC или создавать контейнеры LXC на хосте через ssh (безобразно).
Джованни Торальдо

13

С Ubuntu 14.04 (верный) вы можете просто добавить следующее в конфигурацию родительского контейнера:

lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting

ссылка: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (поиск по запросу "вложение")

Перед загрузкой убедитесь, что у вас предварительно настроена сеть, чтобы избежать долгой паузы перед появлением экрана входа в систему!

НТН


1
Работает отлично - спасибо! Для таких пользователей, как я, у которых, возможно, еще не было конфигурации родительского контейнера, в которую можно поместить вышеуказанные строки, добавление файла ~/.config/lxc/default.confпод учетной записью пользователя, который создает контейнер, и добавление этих двух строк в него работает просто отлично.
Брэндон Родс

Назад в 2017 году! Недавно мне пришлось настроить докер внутри lxc для приложения "enterprise-y" - работает хорошо, но не спрашиваю ...
Lester Cheung

1

Также ... знаете ли вы, что теперь вы можете установить ВСЕ Openstack в один контейнер LXC. Затем все «сервисы» Openstack (nova, swift и т. Д.) Устанавливаются в «вложенные» контейнеры lxc внутри контейнера «master / parent».

Требуется некоторое время, чтобы установить все, но когда вы закончите, у вас будет хорошая среда тестирования OpenStack на вашем ноутбуке или настольном компьютере для экспериментов.

Если вы хотите остановить OpenStack, просто нажмите lxc-stop основного / родительского контейнера, чтобы перезапустить Openstack.

см .: Инструкции по установке Openstack Single


1

Да, вы можете делать вложенные контейнеры LXC, и, несмотря на 1-й комментарий, бывают случаи и случаи использования, когда вложенные контейнеры, безусловно, полезны. См. 10-дневный блог LXC Стефана Грабера, но, в частности, раздел «Вложенность контейнеров» -

Серия из 10 частей Стефана Грабера на LXC

варианты использования: предположим, что вам нужна многопользовательская среда LXC. Создайте 1 мастер-контейнер для каждого человека или организации, убедившись, что включили вложение, добавив 2 cmds в файл конфигурации контейнера LXC. Затем в каждом главном контейнере создайте вложенные вложенные контейнеры, в которые вы устанавливаете приложения, рабочие столы и т. Д., Необходимые для каждой группы. Обратите внимание, что в то время как сеть по умолчанию для мастер-контейнеров будет 10.0.3.x, вложенные контейнеры будут по умолчанию 10.0.4.x (при необходимости вы можете изменить любой из них).

Какое самое большое преимущество у меня было при использовании Nested LXC? Если вы lxc-остановите мастер-контейнер и lxc-клонируете его ... вы клонируете не только мастер, но и все вложенные контейнеры ... это удобно для быстрого резервного копирования. Этот подход также удобен, если вы когда-нибудь захотите сделать живую миграцию LXC с CRIU. Когда вы переносите один из главных контейнеров на другой компьютер ... вы фактически переносите его и все вложенные контейнеры.

Наконец, для классного примера вложения LXC используйте Stephane Graber и другие разработали симулятор для «Интернета», используя LXC, BPG и OSPF в одном контейнере LXC. Внутри этого 1 основного или родительского контейнера LXC находится 512 вложенных контейнеров LXC, каждый из которых работает с Quagga для маршрутизации BGP / OSPF. Вместе эти 512 интернет-узлов моделируют Интернет. Эта реализация была использована на конференции по безопасности NSEC 2014 года для всех участников, чтобы поэкспериментировать с безопасностью в Интернете.

Источник для этого на Githug в: 2014 NSEC LXC симулятор для кода Internet Github

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.