Як використовувати контейнери Linux з LXC та LXD

У старі добрі часи встановлення операційної системи означало з’єднання всіх апаратних компонентів, запуск нового комп’ютера інсталяційним диском у периферійному приводі та розв’язання процесу інсталяції. Загальний проміжок часу може тривати десь між годинами та тижнями.

У наші дні я можу сказати собі: "Я б не проти протестувати це на сервері, на якому запущена певна версія CentOS", і - залежно від кількості змінних і припускаючи, що оригінальне зображення вже завантажено - я можу мати повноцінну роботу віртуальна система готова протягом 30 секунд. Точні результати можуть відрізнятися, але не настільки.

Ви можете побачити, як все це працює, у моєму новому курсі Pluralsight "Оптимізація системи Linux" - на якому базується ця стаття.

Що зумовило всі ці зміни? Віртуалізація. І, зокрема, віртуалізація контейнерів.

Віртуалізована ОС - це файлова система, що містить усі програмні бібліотеки, двійкові файли та файли конфігурації, необхідні для запуску традиційної машини. Просто ця конкретна файлова система зберігається не в кореневому або завантажувальному розділі, який би читав ваш комп’ютер при включенні, а в якійсь іншій частині вашого обсягу пам’яті.

А «включення» вашого віртуального комп’ютера відбувається, коли якесь програмне забезпечення хитро обдурює файли, думаючи, що вони працюють самі на власному обладнанні, коли вони дійсно діляться простором і ресурсами з операційною системою хосту і, можливо, якоюсь іншою віртуальні комп'ютери.

Загалом кажучи, існує два типи програмних систем, що використовуються для адміністрування віртуалізації серверів: гіпервізор і контейнер.

Гіпервізори забезпечують рівень абстракції, який дозволяє гостьовим віртуальним машинам створювати ізольоване середовище з доступом до системного обладнання, яке емулює голий металевий сервер. Це означає, що віртуальні машини гіпервізора можна створювати з будь-якої операційної системи, сумісної з вашим базовим обладнанням. Але це також означає, що вони будуть використовувати більше місця та більше пам'яті та обчислювальних ресурсів.

Віртуалізація контейнерів

З іншого боку, контейнери мають спільне ядро ​​ОС головного комп'ютера і існують у ретельно захищених та ізольованих просторах, якими керують системні інструменти, такі як cgroups. Оскільки вони діляться ядром, пам’ять та системні ресурси, що споживаються контейнерами, можуть бути справді мінімальними, абсолютно нічого не витрачаючи. І, як ви побачите, швидкість, яку ви отримаєте, запущуючи контейнерні програми, захоплює дух.

Багато уваги, пов’язаної з контейнерами, протягом останніх кількох років було зосереджено на Docker та, нещодавно, інструменті оркестрації контейнерів Google, Kubernetes. Насправді Kubernetes добре підходить для архітектур мікропослуг корпоративного масштабу.

Але є давня і, можливо, більш зріла реалізація моделі контейнера, яка нікуди не поділася. Контейнерний проект Linux, LXC, та його найновіший набір інструментів, LXD, мають сильні сторони, які, на думку багатьох, роблять його кращим кандидатом для деяких випадків використання, ніж Kubernetes. Зокрема, LXC перевершує створення легких та швидких середовищ для тестування та розробки додатків.

У цій статті я збираюся показати вам, як встановити LXD, як підготувати та запустити простий контейнер, на якому запущений ультрамалий Alpine Linux, а потім як відкрити сеанс оболонки у вашому новому контейнері. Також я поясню, як знайти та запустити кілька версій інших дистрибутивів.

Одне, що я можу сказати вам одразу, це те, що кожного разу, коли я викладаю LXC, студенти реагують із подивом, наскільки потужним та ефективним може бути використання контейнерів.

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

Будівництво контейнерів LXD

Ми збираємось запустити LXC, працюючи над новою установкою машини Ubuntu 18.04. У цій демонстрації ми встановимо та ініціалізуємо середовище LXD, а потім використаємо версію LXD інтерфейсу командного рядка LXC для завантаження та запуску контейнера Alpine Linux. Ми підтвердимо, що все спрацювало, а потім трохи оглянемося навколо, щоб побачити, як заселено середовище.

Я збираюся використовувати менеджер пакетних пакетів для встановлення LXD, оскільки це зараз офіційна рекомендація. І не лише для LXD, майте на увазі: всі види додатків переходять до інших менеджерів, таких як snap або AppImmage та Flatpak. Я все ще люблю свої здібності до Debian, але ти не можеш боротися з усім світом.

$ sudo snap install lxd 

LXD - це, знову ж таки, оновлений набір інструментів, призначений для управління API LXC - поставляється в пакеті, що включає всі звичайні залежності LXC. Одна команда встановлення, і ми закінчили.

Важливо ініціалізувати середовище LXC за допомогою команди lxd init. Ви можете налаштувати ситуацію самостійно вручну, але, швидше за все, це все буде правильно. Процес ініціювання задасть вам купу питань, і щонайменше, відповіді за замовчуванням будуть працювати.

$ sudo lxd init 

Після цього ми готові створити ваш перший контейнер. Який би дистрибутив та версію Linux ми не хотіли, нам потрібно буде знайти та завантажити зображення. Проект LXC підтримує сховище цілого ряду зображень на сайті images.linuxcontainers.org. Ви бачите, що зазвичай існує декілька версій кожного дистрибутива, що дозволяє створювати контейнери, які працюватимуть майже з будь-яким програмним забезпеченням, яке ви можете кинути на нього.

Я збираюся використовувати останню версію Alpine Linux, оскільки вона справді невелика. Не соромтеся використовувати будь-яке зображення, яке вам подобається, включаючи таких великих хлопців, як Ubuntu та CentoOS. Звичайно, Alpine завантажиться дуже швидко.

Але перед тим, як ми це зробимо, я повинен розповісти вам, як з’ясувати синтаксис командного рядка, необхідний для отримання вашого зображення.

Як ви можете бачити на цьому знімку екрана з веб-сайту LXD, ви можете отримати три частини інформації, які вам знадобляться на самій сторінці: назва дистрибутива - Alpine, у цьому випадку - номер випуску - 3.10 - та архітектура . Ми переслідуємо amd64.

Тепер ми готові ініціювати завантаження, виконавши launchкоманду:

$ sudo lxc launch images:alpine/3.10/amd64 demo 

Зверніть увагу, як синтаксис "lxc", хоча це технічно інтерфейс LXD. "images" повідомляє LXC, що наш образ живе в публічному репо, яке ми бачили раніше. Наші три біти даних - ім’я дистрибутива, номер випуску та архітектура вводяться через косу риску. Я буду використовувати "демо" як назву мого контейнера. Це має бути все, що нам потрібно.

Ви бачите, наскільки маленький Alpine, за тим, як швидко він завантажується. Моє з’єднання з Інтернетом не таке швидке, і я не грав у жодні ігри із записом. Щоб підтвердити, що це спрацювало, я запущу "lxc ls", щоб перерахувати всі встановлені зараз контейнери. Є лише один. І його поточний статус "працює".

sudo lxc ls +------+---------+----------------------+------------+-----------+ | NAME | STATE | IPV4 | TYPE | SNAPSHOTS | +------+---------+----------------------+------------+-----------+ | demo | RUNNING | 10.125.45.119 (eth0) | PERSISTENT | 0 | +------+---------+----------------------+------------+-----------+ 

Ви можете відкрити невхідний кореневий сеанс у контейнері за допомогою команди "lxc exec". Просто вкажіть ім'я контейнера, а потім скажіть LXC, що ви хочете запустити оболонку за допомогою інтерпретатора sh (можливо, ви віддасте перевагу, /bin/bashякщо ви працюєте з контейнером Ubuntu або CentOS - ваш виклик в будь-якому випадку). Як ви самі зможете переконатися, чи стежите за собою вдома, у нас є звичайний командний рядок для Linux, і тепер можливо все, що є у Linux-y.

$ sudo lxc exec demo sh ~ # 

You could also run a single command without opening a full shell by typing the command instead of this sh.

$ sudo lxc exec demo ls / bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr 

You can bail out of the shell any time you like using exit and return to your host. Here, besides listing running containers, I can also list any storage pools. The default pool that was created during initialization is there, and we can see where the disk image is stored. /var/lib/lxd is, by default, where all LXC resources are kept.

$ sudo lxc storage ls +---------+-------------+--------+--------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------+---------+ | default | | btrfs | /var/lib/lxd/disks/default.img | 3 | +---------+-------------+--------+--------------------------------+---------+ 

I can similarly list all my networks. There happen to be a few network bridges on this system (I've been playing around a bit, as you can see). There's also the physical enp0s3 bridge used by the host Ubuntu server. Although between you and me, that one's not physical either, as this is actually a VM running in Oracle's Virtual Box.

$ lxc network ls +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | enp0s3 | physical | NO | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | mynet | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ | testbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ 

If we needed to, we could easily add a new virtual interface to our container using the "lxc network attach" command. Here, I'll specify the physical network and then the name of our container.

$ lxc network attach enp0s3 demo 

With that done, you could open a new shell in the container to see what's changed. There should now be an eth1 interface listed. You may need to reboot for all the changes to take full effect. By doing that you can also marvel at just how fast this thing can reboot itself - for all intents and purposes, it'll happen faster than you can type your exec command to open a new shell.

Enjoy your new environment!

This article is based on content in my Pluralsight course, "Linux System Optimization." There's much more administration goodness in the form of books, courses, and articles available at bootstrap-it.com.