Назад | Перейти на главную страницу

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

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

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

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

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

У вас на самом деле есть реальная причина для этого? Помните, что вопросы здесь должны касаться реальных проблем, с которыми вы сталкиваетесь. - Zoredache 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 :)

В 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 (ищите "вложенность")

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

HTH

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

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

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

видеть: Инструкции по установке OpenStack Single Installer

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

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

случаи использования: Предположим, вам нужна мультитенантная среда LXC. Создайте по 1 главному контейнеру для каждого человека или организации, включив вложение, добавив 2 cmds в файл конфигурации контейнера LXC. Затем в каждом главном контейнере создайте вложенные подконтейнеры, в которые вы устанавливаете приложения, рабочие столы и т. Д., Которые требуются каждой группе. ЗАМЕТЬТЕ, что в то время как сеть по умолчанию для главных контейнеров будет 10.0.3.x, вложенные контейнеры будут 10.0.4.x по умолчанию (вы можете изменить любой из них, если вам нужно).

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

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

Источник этого находится на Githug по адресу: Симулятор NSEC LXC 2014 для кода на github в Интернете