LXC/LXD контейнеры: лёгкая виртуализация в продакшене

Системные контейнеры LXC/LXD: что это и зачем

LXC (Linux Containers) — это технология контейнеризации на уровне ОС, которая позволяет запускать полноценные Linux-системы в изолированных окружениях. В отличие от Docker, где каждый контейнер содержит одно приложение, LXC-контейнеры работают как полноценные виртуальные машины: с init-системой, несколькими процессами, systemd и SSH. Но при этом контейнеры LXC потребляют в разы меньше ресурсов, чем классические VM на KVM/QEMU.

LXD — это менеджер контейнеров, построенный поверх LXC. Он предоставляет удобный CLI, REST API, поддержку кластеризации и управление хранилищами. Основные сценарии использования:

  • Изоляция сервисов — каждый сервис в своём контейнере вместо виртуальной машины
  • Тестовые окружения — быстрое создание и удаление сред за секунды
  • CI/CD — чистые сборочные окружения для каждой сборки
  • Хостинг — множество независимых окружений на одном физическом сервере

Контейнер LXD стартует за 1-2 секунды и потребляет около 20-50 МБ RAM для минимальной установки Ubuntu/Debian.

Установка и инициализация LXD

На Ubuntu LXD доступен через snap (рекомендуемый способ) или через apt-пакет. Snap-версия обновляется чаще и поддерживает больше функций.

Установка через snap

Установите последнюю стабильную версию LXD:

sudo snap install lxd --channel=latest/stable

# Добавьте пользователя в группу lxd
sudo usermod -aG lxd $USER
newgrp lxd

Запустите интерактивную инициализацию:

lxd init

Рекомендуемые ответы для продакшен-сервера:

Would you like to use LXD clustering? no
Do you want to configure a new storage pool? yes
Name of the new storage pool: default
Name of the storage backend: zfs
Create a new ZFS pool? yes
Would you like to use an existing empty block device? yes
Path to the existing block device: /dev/sdb
Would you like to connect to a MAAS server? no
Would you like to create a new local network bridge? yes
What should the new bridge be called? lxdbr0
What IPv4 address should be used? auto
What IPv6 address should be used? none
Would you like the LXD server to be available over the network? yes
Address to bind LXD to: [::]  
Port to bind LXD to: 8443
Would you like stale cached images to be updated automatically? yes
Would you like a YAML "lxd init" preseed to be printed? yes

Сохраните preseed-вывод — его можно использовать для автоматической инициализации других серверов:

cat preseed.yaml | lxd init --preseed

Первый контейнер

Создайте и запустите контейнер с Ubuntu 22.04:

# Скачать образ и создать контейнер
lxc launch ubuntu:22.04 web-server

# Проверить статус
lxc list

# Зайти в контейнер
lxc exec web-server -- bash

# Или выполнить команду напрямую
lxc exec web-server -- apt update && apt upgrade -y

Список доступных образов:

# Образы Ubuntu
lxc image list ubuntu: | head -30

# Образы из community-репозитория (Debian, CentOS, Alpine и др.)
lxc image list images: | grep -i debian

Основные команды управления:

lxc start web-server      # Запуск
lxc stop web-server        # Остановка
lxc restart web-server     # Перезапуск
lxc delete web-server      # Удаление (контейнер должен быть остановлен)
lxc delete --force web-server  # Принудительное удаление
lxc info web-server        # Детальная информация

Сетевая конфигурация

LXD поддерживает несколько типов сетей: мосты (bridge), macvlan, VLAN и overlay-сети. По умолчанию создаётся мост lxdbr0 с NAT, что подходит для большинства задач.

Проброс портов

Для доступа к сервисам внутри контейнера настройте проброс портов:

# Проброс порта 80 хоста на порт 80 контейнера
lxc config device add web-server http proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80

# Проброс порта 443
lxc config device add web-server https proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443

# Проверка устройств
lxc config device show web-server

Удаление проброса:

lxc config device remove web-server http

Macvlan: контейнер с IP в основной сети

Если контейнеру нужен собственный IP в сети хоста, используйте macvlan:

# Создайте профиль с macvlan
lxc profile create macvlan-profile
lxc profile device add macvlan-profile eth0 nic nictype=macvlan parent=eth0

# Создайте контейнер с этим профилем
lxc launch ubuntu:22.04 db-server --profile default --profile macvlan-profile

# Настройте статический IP внутри контейнера
lxc exec db-server -- bash -c 'cat > /etc/netplan/10-macvlan.yaml <<EOF
network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.50/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
EOF'
lxc exec db-server -- netplan apply

Важно: при macvlan контейнер не может напрямую общаться с хостом. Если это необходимо, создайте дополнительный bridge-интерфейс для связи хост-контейнер.

Управление хранилищами

LXD абстрагирует работу с хранилищами через storage pools. Поддерживаются бэкенды: ZFS, btrfs, LVM, CEPH и dir (обычный каталог). ZFS — рекомендуемый выбор для продакшена благодаря снимкам, компрессии и дедупликации.

Создание и подключение дисков

Добавьте дополнительный диск к контейнеру:

# Создайте storage volume
lxc storage volume create default data-vol size=50GiB

# Подключите к контейнеру
lxc config device add db-server data disk pool=default source=data-vol path=/data

# Проверьте внутри контейнера
lxc exec db-server -- df -h /data

Для проброса каталога хоста (bind mount):

lxc config device add web-server sites disk source=/srv/sites path=/var/www/html

Управление хранилищами:

lxc storage list                          # Список пулов
lxc storage info default                  # Информация о пуле
lxc storage volume list default           # Список томов
lxc storage volume snapshot default data-vol snap0  # Снимок тома

Снимки и восстановление

Снимки (snapshots) позволяют мгновенно сохранить и восстановить состояние контейнера:

# Создать снимок
lxc snapshot web-server before-upgrade

# Список снимков
lxc info web-server | grep -A 10 Snapshots

# Восстановить из снимка
lxc restore web-server before-upgrade

# Создать новый контейнер из снимка
lxc copy web-server/before-upgrade web-server-clone

# Автоматические снимки по расписанию
lxc config set web-server snapshots.schedule "0 2 * * *"
lxc config set web-server snapshots.schedule.stopped false
lxc config set web-server snapshots.expiry 7d
lxc config set web-server snapshots.pattern "auto-%d"

При использовании ZFS снимки создаются мгновенно (copy-on-write) и не занимают дополнительное место, пока данные не начнут изменяться.

Лимиты ресурсов и профили

Для продакшен-окружений критически важно ограничить ресурсы контейнеров, чтобы один «прожорливый» сервис не уронил весь сервер.

Ограничения CPU и памяти

Установите лимиты на контейнер:

# Ограничить 2 ядрами CPU
lxc config set web-server limits.cpu 2

# Привязать к конкретным ядрам
lxc config set web-server limits.cpu 0,1

# Ограничить RAM (жёсткий лимит)
lxc config set web-server limits.memory 2GiB

# Запретить использование swap
lxc config set web-server limits.memory.swap false

# Ограничить приоритет I/O
lxc config set web-server limits.disk.priority 5

# Ограничить скорость сети
lxc config device set web-server eth0 limits.ingress 100Mbit
lxc config device set web-server eth0 limits.egress 100Mbit

Проверьте текущие лимиты:

lxc config show web-server | grep limits

Профили для типовых конфигураций

Профили позволяют задать шаблон настроек и применять его к множеству контейнеров:

# Создайте профиль для веб-серверов
lxc profile create web-tier
lxc profile set web-tier limits.cpu 2
lxc profile set web-tier limits.memory 2GiB
lxc profile set web-tier limits.memory.swap false
lxc profile device add web-tier http proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
lxc profile device add web-tier root disk pool=default path=/ size=20GiB

# Создайте профиль для БД-серверов
lxc profile create db-tier
lxc profile set db-tier limits.cpu 4
lxc profile set db-tier limits.memory 8GiB
lxc profile device add db-tier root disk pool=default path=/ size=100GiB

# Применение профиля при создании
lxc launch ubuntu:22.04 app1 --profile default --profile web-tier
lxc launch ubuntu:22.04 postgres1 --profile default --profile db-tier

# Экспорт профиля в YAML
lxc profile show web-tier

Миграция и бэкап контейнеров

LXD поддерживает live-миграцию контейнеров между серверами и экспорт/импорт для резервного копирования.

Миграция между серверами

Настройте доверие между серверами:

# На целевом сервере
lxc config set core.https_address "[::]:8443"
lxc config set core.trust_password "migration-secret"

# На исходном сервере — добавьте удалённый сервер
lxc remote add target-server 10.0.0.2:8443 --password "migration-secret"

# Миграция контейнера
lxc move web-server target-server:web-server

# Или копирование (оригинал остаётся)
lxc copy web-server target-server:web-server-copy

Для live-миграции (без остановки) потребуется CRIU:

sudo apt install criu
lxc move web-server target-server:web-server --stateful

Экспорт и импорт бэкапов

Создайте полный бэкап контейнера в файл:

# Экспорт (включая снимки)
lxc export web-server /backups/web-server-$(date +%Y%m%d).tar.gz --optimized-storage

# Импорт на другом сервере
lxc import /backups/web-server-20260408.tar.gz web-server-restored
lxc start web-server-restored

Скрипт для автоматического бэкапа всех контейнеров:

#!/bin/bash
BACKUP_DIR="/backups/lxd"
DATE=$(date +%Y%m%d)

mkdir -p "$BACKUP_DIR"

for container in $(lxc list -c n --format csv); do
    echo "Backing up $container..."
    lxc export "$container" "$BACKUP_DIR/${container}-${DATE}.tar.gz" --optimized-storage
    
    # Удаление бэкапов старше 7 дней
    find "$BACKUP_DIR" -name "${container}-*.tar.gz" -mtime +7 -delete
done

echo "Backup complete. Size: $(du -sh $BACKUP_DIR | cut -f1)"

Мониторинг и безопасность контейнеров

Для контроля ресурсов и безопасности контейнеров LXD предоставляет встроенные инструменты.

Просмотр потребления ресурсов:

# Статистика по всем контейнерам
lxc list -c nsCPMD

# Детальная статистика конкретного контейнера
lxc info web-server --resources

# Потребление в реальном времени
watch -n 1 'lxc list -c nsCPMD'

Настройка безопасности:

# Запретить вложенные контейнеры
lxc config set web-server security.nesting false

# Запретить привилегированный режим
lxc config set web-server security.privileged false

# Ограничить системные вызовы
lxc config set web-server raw.lxc "lxc.apparmor.profile=generated"

# Включить idmap (маппинг uid/gid)
lxc config set web-server security.idmap.isolated true

Проверка безопасности всех контейнеров:

for c in $(lxc list -c n --format csv); do
    priv=$(lxc config get $c security.privileged)
    nest=$(lxc config get $c security.nesting)
    echo "$c: privileged=$priv nesting=$nest"
done

Часто задаваемые вопросы

LXC — это системные контейнеры, которые работают как полноценные виртуальные машины с init-системой и несколькими процессами. Docker — контейнеры приложений, каждый запускает один процесс. LXC подходит для замены VM (когда нужна полноценная ОС с SSH), Docker — для микросервисов и CI/CD. Эти технологии дополняют друг друга: можно запускать Docker внутри LXC-контейнера.

Да. Включите поддержку вложенных контейнеров: lxc config set container security.nesting true. После этого внутри LXC-контейнера можно установить Docker обычным способом. Это популярный паттерн: LXC обеспечивает изоляцию на уровне «виртуальной машины», а Docker внутри него управляет приложениями.

LXD требует ядро Linux 4.15+ с поддержкой namespaces (user, pid, net, mnt, ipc, uts), cgroups v1 или v2, seccomp и AppArmor/SELinux. Все современные дистрибутивы (Ubuntu 20.04+, Debian 11+, CentOS 8+) соответствуют этим требованиям без дополнительных настроек. Для CRIU (live-миграции) рекомендуется ядро 5.4+.

Установите лимит на root-устройство: lxc config device override container root size=20GiB. Эта возможность работает только с бэкендами ZFS и btrfs. Для LVM используйте thin provisioning. Для dir-бэкенда лимиты диска не поддерживаются — используйте квоты файловой системы на уровне хоста.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#lxc контейнеры#lxd установка#lxd продакшен#lxc vs docker#системные контейнеры linux#lxd сеть#lxd хранилища#виртуализация linux
Комментарии 0

Оставить комментарий

загрузка...