Чи можливо запустити контейнер LXC всередині контейнера LXC?


21

Чи можливо запустити контейнер LXC всередині іншого контейнера LXC?


1
У вас насправді є реальна причина для цього? Будь ласка, пам’ятайте, що питання тут повинні стосуватися актуальних проблем, з якими ви стикаєтесь .
Зоредаче

6
Я думаю, що lxc повинен спростити міграцію VM (і резервне копіювання + відновлення теж). Але я не впевнений у випадках, коли немає доступу до хост-OS (наприклад, дешеві vps).
Михайло

Відповіді:


45

Я збираюся тут розвіяти кілька міфів.

Це просто погана ідея. Мені шкода. - Яків 5 березня о 20:30

Я не бачу, як це погана ідея. Це дійсно просто chroot всередині chroot. З одного боку, це може, можливо, знизити продуктивність незначним чином (ніщо в порівнянні з запуском VM всередині VM). З іншого боку, це, ймовірно, буде більш безпечним (наприклад, більш ізольованим від кореневої системи хоста та його складових).

У вас насправді є реальна причина для цього? Будь ласка, пам’ятайте, що питання тут повинні стосуватися актуальних проблем, з якими ви стикаєтесь. - Зоредаче 5 березня о 21:52

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

Я думаю, що lxc повинен спростити міграцію VM (і резервне копіювання + відновлення теж). Але я не впевнений у випадках, коли немає доступу до хост-OS (наприклад, дешеві 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, на якому працюють джинкіни, і я хочу, щоб янкіни могли запускати контейнери LXC перед виконанням інтеграційних тестів. Альтернативи: запускати дженкіни за межами 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 (пошук "вкладення")

Переконайтеся, що у вас заздалегідь налаштована мережа перед завантаженням, щоб уникнути тривалої паузи до появи екрана входу!

HTH


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

Ще в 2017 році! Нещодавно мені довелося налаштувати докер всередині lxc для програми "підприємство-у" - працює добре, але не питайте ...
Lester Cheung

1

Крім того ... Ви знали, що тепер можете встановити ВСЕ з Openstack в один контейнер LXC. Кожна з "служб" Openstack (nova, swift тощо) потім всі встановлюються в "вкладені" lxc-контейнери всередині контейнера "master / parent".

Щоб встановити все, потрібно час, але коли ви закінчите, у вас є гарне тестування середовища OpenStack на вашому ноутбуці або на робочому столі, з яким можна експериментувати.

Якщо ви хочете зупинити OpenStack, ви просто lxc - зупиніть головний / батьківський контейнер, щоб перезапустити Openstack.

Див.: Відкриття інструкції про встановлення однієї установки


1

Так, ви можете робити вкладені контейнери LXC, і незважаючи на перший коментар, є випадки та випадки використання, коли вкладені контейнери, безумовно, корисні. Дивіться блог LXC 10-ї частини Стефана Грабера, але, зокрема, розділ "Гніздування контейнерів" -

10 серіалів Стефана Грабера на LXC

випадки використання: припустимо, що вам потрібне середовище LXC для багатьох орендарів. Створіть 1 основний контейнер для кожної людини чи організації, увімкнувши ввімкнення Nesting, додавши 2 смс до файлу конфігурації контейнера LXC. Далі в кожному контейнері Master створіть вкладені підконтейнери, де ви встановлюєте додатки, настільні комп’ютери тощо, необхідні кожній групі. Зверніть увагу, що тоді як мережа за замовчуванням для головних контейнерів буде 10.0.3.x, вкладених контейнерів буде за замовчуванням 10.0.4.x (ви можете змінити або, якщо потрібно).

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

Нарешті, для класного прикладу використання гніздування LXC Stephane Graber та інші побудували тренажер для "Інтернету", використовуючи LXC, BPG та OSPF все в 1 контейнері LXC. Всередині 1 контейнера LXC "головний або батьківський" 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.