Контейнер LXC стоит выбирать, если нужен обычный Linux-сервис и важна экономия памяти. Виртуальная машина нужна там, где требуется другое ядро, своё ядро или полная изоляция от хоста.
Чем контейнер и виртуальная машина отличаются внутри
Контейнер делит одно ядро с хостом: процессы внутри него видны системе так же, как обычные процессы, только отделены пространствами имён. Виртуальная машина поднимает собственное ядро и не знает о хосте почти ничего, кроме виртуального железа, которое ей показали.
- контейнер запускается почти мгновенно, потому что не грузит отдельное ядро
- контейнер не может работать с другой операционной системой или другой версией ядра
- виртуальная машина изолирована сильнее, потому что не делит ядро ни с хостом, ни с соседями
Базовые понятия платформы разобраны в статье что такое Proxmox VE.
Таблица выбора: на что смотреть
Для конкретного сервиса решение обычно сводится к нескольким практическим критериям, а не к общему «что лучше».
| Критерий | LXC | Виртуальная машина |
|---|---|---|
| Расход памяти | ниже, память не резервируется заранее целиком | выше, память выделяется под гостевую ОС |
| Скорость запуска | почти мгновенно | полноценная загрузка ядра и сервисов |
| Своё ядро | нет, общее с хостом | да, отдельное |
| Модули ядра | ограничено, зависят от ядра хоста | любые, подходящие гостевой ОС |
| Windows | невозможно | да |
| Проброс устройств | ограниченно, через bind-mount | полноценный проброс PCI и USB |
| Миграция | проще и быстрее | возможна живая миграция |
| Изоляция | на уровне пространств имён ядра | на уровне виртуального железа |
Что обычно берут в контейнер
Контейнер подходит для сервисов без особых требований к ядру и собственной операционной системе:
- веб-серверы и обратные прокси
- базы данных без специфичных модулей ядра
- сетевые сервисы вроде DNS или DHCP
- системы мониторинга и сбора логов
- лёгкие служебные утилиты и планировщики задач
Что обязательно нужно виртуальной машиной
Есть задачи, где контейнер в принципе не подойдёт, потому что ему не хватит собственного ядра или изоляции:
- любая не-Linux система, включая Windows
- своё ядро или свои модули ядра, отличные от ядра хоста
- вложенная виртуализация внутри гостя
- проброс дисков и видеокарт в режиме, недоступном контейнеру
- сервисы, которым нужна полная изоляция от остальных нагрузок на узле
Почему виртуальные машины «медленные»
Жалоба на медленную виртуальную машину почти всегда объясняется настройками, а не самой технологией виртуализации:
- дисковый контроллер и режим кэширования выбраны не под нагрузку
- в гостевой системе не установлены гостевые драйверы виртуального железа
- виртуальной машине выделено больше процессорных ядер, чем физически доступно хосту
- память отдана с запасом, а хост вынужден её возвращать через подкачку
Что нельзя делать в контейнере
Контейнеру не стоит давать повышенные привилегии ради удобства: привилегированный контейнер делит ядро с хостом практически без барьера, и уязвимость внутри него угрожает всему узлу. То, что требует root-доступа к ядру хоста, стоит переносить в виртуальную машину, а не решать правами контейнера.
Как перейти с одного на другое, если выбор оказался неверным
Переезд обычно означает перенос данных и конфигурации сервиса на новый носитель, а не копирование самого контейнера или машины целиком, потому что внутреннее устройство у них разное. Шаги по созданию контейнера описаны в статье LXC-контейнеры в Proxmox.