Proxmox VE: Мгновенные Сервисы с LXC-Контейнерами! (Часть 4)
Почему я вообще заинтересовался LXC
Когда я создал первую виртуальную машину в Proxmox и поставил на неё Ubuntu, я почувствовал себя почти всемогущим. Ещё бы: целый компьютер внутри компьютера! Но прошло буквально несколько дней, и я столкнулся с проблемой, которую сам себе создал. Мне понадобилось поднять Pi-hole для блокировки рекламы, потом отдельный сервис для умного дома, потом что-то ещё — и каждый раз я шёл в мастер создания VM, выделял виртуалке два ядра и пару гигабайт памяти. На пятом таком «сервисе» мой старый системник начал задыхаться: виртуалки съедали всю оперативку, диск скрипел, а гипервизор еле дышал.
Тогда я вспомнил, что в Proxmox кроме полноценных VM есть ещё и LXC-контейнеры — лёгкие, почти без потерь в производительности. Идея простая: контейнер не эмулирует компьютер целиком, а использует ядро хоста напрямую. Разница на моём железе оказалась огромной. Виртуалка с Ubuntu жрала под гигабайт памяти только на саму систему, а контейнер с тем же Debian укладывался в 100-150 мегабайт. Для мелких сервисов вроде Pi-hole или DNS-сервера это вообще небо и земля: на одной виртуалке можно было держать один сервис, а на том же объёме памяти — десяток контейнеров.
Ещё один момент, который я оценил позже, — скорость работы. Контейнер стартует за секунды, потому что не нужно грузить гостевое ядро. Перезагрузка Pi-hole занимала у меня раньше минут пять в виртуалке, а теперь — буквально мгновение. Когда что-то сломалось и нужно быстро перезапустить сервис, эта разница ощущается очень остро.
Шаг 13: качаю шаблон
Создание контейнера в Proxmox начинается не с ISO-образа, а с шаблона (template) — готовой заготовки системы. Я открыл хранилище local, нашёл пункт Container Templates и нажал кнопку Templates. Открылся список доступных заготовок: Debian, Ubuntu, Alpine, CentOS и ещё пара десятков. Я выбрал debian-12-standard — она маленькая и загружается быстро — и нажал Download.
Скачивание заняло пару минут, зависит от скорости интернета. Никаких телодвижений больше не нужно: шаблон сам распакуется и будет ждать, когда я создам из него контейнер. Кстати, это первое, что меня приятно удивило в LXC: не нужно носить ISO туда-сюда, всё скачивается прямо в интерфейсе одной кнопкой.
Шаблоны бывают разные: «standard» — минимальная система, «default» — с немного большим набором пакетов. Я всегда беру standard: лишнего внутри контейнера мне не нужно, всё необходимое доставляется пакетами. Меньше мусора — меньше поверхность для атак и меньше места на диске.
Шаг 14: создаю контейнер
Мастер создания контейнера вызывается кнопкой Create CT в правом верхнем углу — почти так же, как Create VM, но вкладок меньше и они проще. Пройдусь по всем, как заполнял сам.
General
Здесь я вписал hostname — имя контейнера. Для Pi-hole я назвал его pihole-lxc, чтобы потом не гадать, где что. Тут же задаётся пароль для пользователя root. Важный момент: пароль задаётся сразу, при создании, и потом его сложнее поменять, так что запишите его куда-нибудь, а не «на потом».
Template
Указываем хранилище и сам скачанный шаблон. У меня был только один — debian-12-standard, так что выбор был простым. Если шаблона нет в списке — вы забыли скачать его на предыдущем шаге, возвращайтесь.
Disk
Размер диска я поставил 8 ГБ. Для мелкого сервиса этого хватает с огромным запасом, а главное — в отличие от виртуалок, контейнер не резервирует весь объём сразу. Диск растёт по мере заполнения, так что «лишние» гигабайты не пропадают. Моя первая ошибка была в том, что я щедро выделил 30 ГБ на пустой контейнер, потом разбирался, куда делось место на хосте.
CPU и Memory
Одно ядро и 512 МБ памяти — и этого с головой хватило для Pi-hole. Для контейнеров это нормально: они делят ядро хоста, и нагрузка на саму систему минимальна. Swap я оставил 512 МБ на всякий случай, но по факту он так ни разу и не понадобился. Помните мою историю с виртуалками, которые жрали по 2 гигабайта? Контейнер с той же задачей обходится вчетверо меньшим объёмом.
Network
Мост vmbr0 — как и у виртуалок. Для IP-адреса я выбрал статический: 192.168.1.15/24 с gateway 192.168.1.1. Для сервисов, к которым нужно обращаться постоянно, статический адрес удобнее DHCP: он не поменяется после перезагрузки, и я не потеряю доступ к своему Pi-hole. DHCP тоже можно — Proxmox умеет показывать выданные адреса, но статика снимает все вопросы разом.
DNS
Оставил вариант Use host settings — контейнер возьмёт DNS-настройки с хоста. Это самый беспроблемный вариант: ничего настраивать не нужно, всё работает сразу.
Confirm
Проверил сводку, поставил галочку Start after created и нажал Finish. Через несколько секунд контейнер появился в дереве слева и запустился.
Шаг 15: первый вход и настройка
Логиниться в контейнер можно прямо через консоль в веб-интерфейсе: пользователь root, пароль тот, что я задал при создании. Дальше — обычная возня с пакетами: apt update, apt install и так далее. Всё как на обычном Debian, только без лишнего мусора. Внутри контейнера нет ни графической оболочки, ни кучи предустановленных программ — только голый минимум. Для сервиса, который будет висеть в фоне, это идеально.
Первый мой контейнер получил Pi-hole, и блокировка рекламы во всей домашней сети заработала в тот же вечер. Второй — Nginx для пары маленьких сайтов. Оба заняли в сумме меньше памяти, чем одна виртуалка с Ubuntu до этого. Я сидел и не верил своим глазам: та же задача, а ресурсов нужно в разы меньше.
VM или LXC: что я выбираю теперь
Прошло уже порядочно времени, и я выработал для себя простое правило. Если мне нужен сервис, который будет работать круглосуточно и не требует глубокой настройки ядра — беру LXC. Это DNS, блокировщики рекламы, веб-серверы, умный дом, всевозможные мелкие утилиты. Если мне нужно что-то «тяжёлое» — например, система с графическим интерфейсом, нестандартное ядро или изоляция уровня виртуализации — тогда VM.
Главное ограничение LXC, о котором стоит знать: контейнер использует ядро хоста, поэтому вы не сможете запустить внутри, скажем, Windows или другой Linux со своим специфическим ядром. Для 95% домашних сервисов это вообще не проблема, но когда наступит тот самый пятый процент — вы уже будете знать, куда идти.
Отдельно отмечу скорость работы с контейнерами: создать LXC — пара минут, удалить — один клик, клонировать для эксперимента — вообще секунды. Виртуалки такими темпами похвастаться не могут. Я теперь часто делаю так: сначала поднимаю сервис в контейнере, пробую, и только если он разрастается и начинает требовать изоляции — переезжаю на VM.
Бекапы и снапшоты контейнеров
Отдельная тема, которую я не затронул бы, если бы не обжёгся: бекапы. Хорошая новость в том, что контейнеры бекапить ещё проще, чем виртуалки, — они меньше и быстрее копируются. Я включил ночной VZDump для всех своих контейнеров разом: открыл Datacenter → Backup, создал задачу, указал расписание и список контейнеров. Всё, дальше Proxmox сам снимает копии каждую ночь.
А снапшоты у LXC работают вообще мгновенно — в отличие от виртуалок, где для снимка иногда нужно подождать. Перед каждым обновлением Pi-hole или Nginx я делаю снапшот одной кнопкой. Если после обновления что-то поехало — откат занимает секунды. Я успел оценить это счастье, когда одно из обновлений сломало мне DNS на весь вечер, а откат вернул всё на место за минуту.
Ещё один плюс контейнеров для бекапов — их можно клонировать как «шаблоны» для новых сервисов. У меня есть контейнер с настроенным окружением, и когда нужен новый сервис, я просто клонирую его и ставлю нужный пакет. Вместо получаса настройки с нуля — пять минут готовой основы.
Пара слов про Docker внутри LXC
Рано или поздно вы упрётесь в вопрос: можно ли запускать Docker внутри LXC-контейнера в Proxmox? Короткий ответ — можно, но с нюансами. Docker внутри контейнера требует привилегированного режима и дополнительных настроек, и многие на этом ловят грабли: то сеть не работает, то монтирования нет. Я пробовал — работает, но ощущается как костыль. Мой совет: если вам нужен Docker — поднимите его на полноценной VM или прямо на хосте, а LXC используйте для простых сервисов. Так меньше боли.
Либо идите другим путём: многие сервисы, которые обычно крутят в Docker, имеют готовые скрипты установки для чистого Debian. У меня часть сервисов живёт в контейнерах «нативно», без Docker, и это работает отлично. Не гонитесь за модой — выбирайте то, что проще обслуживать вам.
Если вкратце
- Скачайте шаблон: local → Container Templates → Templates → выберите debian-12-standard → Download.
- Нажмите Create CT, задайте имя и пароль root.
- Выберите шаблон, 8 ГБ диска, 1 ядро, 512 МБ памяти.
- В сети укажите мост vmbr0 и статический IP, если хотите постоянный адрес.
- Finish, зайдите по root, ставьте нужные пакеты.
Итог моего знакомства с LXC такой: я пожалел, что не разобрался в них раньше. Мой сервер стал легче, дешевле и тише — потому что перестал крутить пять виртуалок ради пяти мелких сервисов. Если вы, как и я, только начинаете осваивать Proxmox — начните именно с контейнеров. Они прощают ошибки, требуют мало ресурсов и учат главному: любая задача решается самыми простыми средствами.
Список того, что я держу в контейнерах
Для наглядности покажу, как выглядит моя инфраструктура на LXC сейчас. Первый контейнер — Pi-hole, блокирует рекламу на всю домашнюю сеть и параллельно раздаёт DNS. Второй — Nginx, обслуживает пару внутренних сайтов и проксирует запросы. Третий — Home Assistant, который переехал сюда с отдельной виртуалки и сбросил пару сотен мегабайт. Четвёртый — сервис уведомлений, шлёт мне пуш-сообщения о проблемах. Пятый — маленький файловый обменник для внутренних нужд.
Все пять занимают в сумме меньше памяти, чем одна-единственная виртуалка с Ubuntu, которая у меня была раньше. И каждый из них управляется из одного окна Proxmox: запустить, остановить, обновить, сделать снапшот — всё в пару кликов. Для человека, который не хочет быть системным администратором на полную ставку, а просто хочет работающий сервер, это оптимальный вариант.
Единственное, что я изменил бы, если бы начинал заново, — сразу заложил бы на контейнеры статические IP-адреса и записал бы их в табличку. Когда контейнеров пять, это ещё можно держать в голове. Когда их будет больше — начнётся хаос. Потратьте десять минут на табличку сейчас, сэкономите час потом.