Контейнер LXC варто обирати, якщо потрібен звичайний Linux-сервіс і важлива економія пам'яті. Віртуальна машина потрібна там, де потрібне інше ядро, своє ядро або повна ізоляція від хоста.
Чим контейнер і віртуальна машина відрізняються всередині
Контейнер ділить одне ядро з хостом: процеси всередині нього видно системі так само, як звичайні процеси, лише відокремлені просторами імен. Віртуальна машина піднімає власне ядро і майже нічого не знає про хост, крім віртуального заліза, яке їй показали.
- контейнер запускається майже миттєво, бо не вантажить окреме ядро
- контейнер не вміє працювати з іншою операційною системою чи іншою версією ядра
- віртуальна машина ізольована сильніше, бо не ділить ядро ні з хостом, ні із сусідами
Базові поняття платформи розібрані у статті що таке Proxmox VE.
Таблиця вибору: на що звертати увагу
Для конкретного сервісу рішення зазвичай зводиться до кількох практичних критеріїв, а не до загального «що краще».
| Критерій | LXC | Віртуальна машина |
|---|---|---|
| Витрата пам'яті | нижча, пам'ять не резервується заздалегідь цілком | вища, пам'ять виділяється під гостьову ОС |
| Швидкість запуску | майже миттєво | повноцінне завантаження ядра і сервісів |
| Своє ядро | немає, спільне з хостом | так, окреме |
| Модулі ядра | обмежено, залежать від ядра хоста | будь-які, що підходять гостьовій ОС |
| Windows | неможливо | так |
| Проброс пристроїв | обмежено, через bind-mount | повноцінний проброс PCI та USB |
| Міграція | простіша і швидша | можлива жива міграція |
| Ізоляція | на рівні просторів імен ядра | на рівні віртуального заліза |
Що зазвичай беруть у контейнер
Контейнер підходить для сервісів без особливих вимог до ядра і власної операційної системи:
- веб-сервери і зворотні проксі
- бази даних без специфічних модулів ядра
- мережеві сервіси на кшталт DNS чи DHCP
- системи моніторингу і збору логів
- легкі службові утиліти і планувальники завдань
Що обов'язково потрібно віртуальною машиною
Є завдання, де контейнер у принципі не підійде, бо йому бракне власного ядра або ізоляції:
- будь-яка не-Linux система, включно з Windows
- своє ядро або свої модулі ядра, відмінні від ядра хоста
- вкладена віртуалізація всередині гостя
- проброс дисків і відеокарт у режимі, недоступному контейнеру
- сервіси, яким потрібна повна ізоляція від решти навантажень на вузлі
Чому віртуальні машини «повільні»
Скарга на повільну віртуальну машину майже завжди пояснюється налаштуваннями, а не самою технологією віртуалізації:
- дисковий контролер і режим кешування обрані не під навантаження
- у гостьовій системі не встановлено гостьові драйвери віртуального заліза
- віртуальній машині виділено більше процесорних ядер, ніж фізично доступно хосту
- пам'ять віддана із запасом, а хост змушений повертати її через підкачку
Чого не можна робити в контейнері
Контейнеру не варто давати підвищені привілеї заради зручності: привілейований контейнер ділить ядро з хостом практично без бар'єру, і вразливість усередині нього загрожує всьому вузлу. Те, що потребує root-доступу до ядра хоста, варто переносити у віртуальну машину, а не вирішувати правами контейнера.
Як перейти з одного на інше, якщо вибір виявився невірним
Переїзд зазвичай означає перенесення даних і конфігурації сервісу на новий носій, а не копіювання самого контейнера чи машини цілком, бо внутрішня будова в них різна. Кроки зі створення контейнера описані у статті LXC-контейнери в Proxmox.