Перейти к содержанию

LXC (Linux Containers)

Linux Containers (LXC) - это технология виртуализации на уровне операционной системы, которая позволяет запускать несколько изолированных экземпляров Linux (контейнеров) на одном хосте. LXC обеспечивает легковесную альтернативу полной виртуализации, используя функции ядра Linux для изоляции процессов.

Преимущества LXC

  • Низкие накладные расходы: Контейнеры используют общее ядро с хост-системой
  • Быстрый запуск: Контейнеры стартуют за секунды
  • Эффективное использование ресурсов: Несколько контейнеров могут работать на одном хосте с минимальными затратами ресурсов
  • Изоляция: Каждый контейнер имеет собственное пространство имен процессов, сеть и файловую систему

Установка LXC

Ubuntu/Debian

Bash
sudo apt update
sudo apt install lxc lxc-templates lxc-utils

CentOS/RHEL

Bash
sudo yum install epel-release
sudo yum install lxc lxc-templates

Проверка установки

Bash
lxc-checkconfig

Все пункты должны быть отмечены как "enabled". Если есть отметки "disabled", возможно, потребуется настроить или обновить ядро.

Создание контейнеров

Использование шаблона download

Шаблон download позволяет загружать предварительно созданные образы для различных дистрибутивов.

Bash
sudo lxc-create -n my-container -t download -- -d debian -r bookworm -a amd64

Где: - -n my-container - имя контейнера - -t download - использовать шаблон download - -d debian - дистрибутив - -r bookworm - релиз/версия - -a amd64 - архитектура

Важно для пользователей из России: При создании контейнеров из России может возникать проблема с загрузкой образов с некоторых серверов, например, с https://fra1lxdmirror01.do.letsbuildthe.cloud/images/debian/trixie/amd64/default/. В этом случае включите VPN для успешного скачивания образов.

Альтернативный способ с указанием зеркала

Bash
sudo lxc-create -n my-container -t download -- -d debian -r bookworm -a amd64 --server images.linuxcontainers.org

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

Чтобы просмотреть список доступных образов:

Bash
sudo lxc-create -n dummy -t download -- --list

Управление контейнерами

Запуск контейнера

Bash
sudo lxc-start -n my-container

Запуск с автоматическим подключением к консоли

Bash
sudo lxc-start -n my-container -F

Подключение к контейнеру

Bash
sudo lxc-attach -n my-container

Выполнение команды в контейнере без подключения

Bash
sudo lxc-attach -n my-container -- command

Пример:

Bash
sudo lxc-attach -n my-container -- apt update

Остановка контейнера

Bash
sudo lxc-stop -n my-container

Принудительная остановка (если обычная остановка не работает)

Bash
sudo lxc-stop -n my-container -k

Просмотр списка контейнеров

Bash
sudo lxc-ls -f

Просмотр информации о контейнере

Bash
sudo lxc-info -n my-container

Клонирование контейнера

Bash
sudo lxc-copy -n source-container -N new-container

Удаление контейнера

Bash
sudo lxc-destroy -n my-container

Настройка контейнеров

Расположение файлов конфигурации

Файлы конфигурации контейнеров находятся в директории:

Text Only
/var/lib/lxc/container-name/config

Основные параметры конфигурации

Сеть

Настройка моста (bridge) для сетевого подключения:

Text Only
1
2
3
4
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx

Лимиты ресурсов

Ограничение CPU:

Text Only
lxc.cgroup.cpuset.cpus = 0,1
lxc.cgroup.cpu.shares = 512

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

Text Only
lxc.cgroup.memory.limit_in_bytes = 512M
lxc.cgroup.memory.memsw.limit_in_bytes = 1G

Автозапуск контейнера

Text Only
lxc.start.auto = 1
lxc.start.delay = 5

Настройка AppArmor для расширенных возможностей

Для некоторых задач (например, выполнения команд вроде emerge в Gentoo) может потребоваться настройка профиля AppArmor:

Text Only
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1

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

Настройка сетевого моста (bridge)

  1. Установите необходимые пакеты:
Bash
sudo apt install bridge-utils
  1. Создайте файл /etc/network/interfaces.d/lxc-bridge:
Text Only
auto lxcbr0
iface lxcbr0 inet static
    bridge_ports none
    bridge_fd 0
    bridge_maxwait 0
    address 10.0.3.1
    netmask 255.255.255.0
    up ip route add 10.0.3.0/24 dev lxcbr0
    up iptables -t nat -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
    down iptables -t nat -D POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
    down ip route del 10.0.3.0/24 dev lxcbr0
  1. Активируйте интерфейс:
Bash
sudo ifup lxcbr0

Настройка DHCP для контейнеров

  1. Установите dnsmasq:
Bash
sudo apt install dnsmasq
  1. Создайте файл /etc/dnsmasq.d/lxc-dhcp:
Text Only
1
2
3
interface=lxcbr0
dhcp-range=10.0.3.2,10.0.3.254,1h
dhcp-option=3,10.0.3.1
  1. Перезапустите dnsmasq:
Bash
sudo systemctl restart dnsmasq

Продвинутые возможности

Создание снимков (snapshots)

Для снимков LXC можно использовать файловую систему с поддержкой снимков, такую как LVM или BTRFS:

Bash
1
2
3
4
5
# Создание снимка LXC на LVM
sudo lxc-snapshot -n my-container

# Восстановление из снимка
sudo lxc-snapshot -n my-container -r snap0

Ограничение ресурсов с помощью cgroups

Bash
1
2
3
4
5
# Ограничение CPU
echo 512 > /sys/fs/cgroup/cpu/lxc/my-container/cpu.shares

# Ограничение памяти
echo 512M > /sys/fs/cgroup/memory/lxc/my-container/memory.limit_in_bytes

Миграция контейнеров между хостами

  1. Остановите контейнер:
Bash
sudo lxc-stop -n my-container
  1. Архивируйте контейнер:
Bash
cd /var/lib/lxc
sudo tar czf my-container.tar.gz my-container/
  1. Перенесите архив на новый хост:
Bash
scp my-container.tar.gz user@new-host:/tmp/
  1. На новом хосте:
Bash
1
2
3
cd /var/lib/lxc
sudo tar xzf /tmp/my-container.tar.gz
sudo lxc-start -n my-container

Решение проблем

Контейнер не запускается

  1. Проверьте журналы:
Bash
sudo lxc-start -n my-container -l DEBUG -o container.log
cat container.log
  1. Проверьте конфигурацию:
Bash
sudo lxc-checkconfig

Проблемы с сетью

  1. Проверьте наличие сетевого интерфейса внутри контейнера:
Bash
sudo lxc-attach -n my-container -- ip addr
  1. Проверьте настройку моста на хосте:
Bash
ip addr show lxcbr0
brctl show

Полезные ресурсы

Сравнение LXC с другими технологиями

Технология Преимущества Недостатки
LXC Легковесность, система Linux в контейнере Ограничен Linux-системами
Docker Портативность, экосистема Ориентирован на одно приложение в контейнере
KVM/QEMU Полная изоляция, любая ОС Высокие накладные расходы
LXD Усовершенствованный LXC с REST API Дополнительный уровень абстракции