LXC контейнеры vs Docker: когда что использовать
Фундаментальные различия
LXC и Docker работают на разных уровнях абстракции. Docker упаковывает один процесс в изолированный образ, созданный для микро-сервисов. LXC предоставляет полноценную систему с init-процессом, несколькими сервисами и файловой системой, аналогичной виртуальной машине, но с производительностью контейнера.
Архитектура
Docker использует namespaces и cgroups, добавляя overlay filesystem для образов. Каждый контейнер — это один процесс. LXC также использует namespaces и cgroups, но предоставляет полную файловую систему с init-системой (systemd или OpenRC).
# Docker: один процесс на контейнер
docker run -d nginx:alpine
# LXC: полноценная система
lxc launch ubuntu:22.04 my-server
lxc exec my-server bash
Когда использовать LXC
- Замена виртуальных машин — LXC контейнер работает как легкий VM с минимальными накладными расходами
- Множество сервисов — когда нужно запустить nginx + php-fpm + mysql в одном контейнере
- Разработка — полная Linux-среда для тестирования конфигураций
- Сетевые эксперименты — LXC поддерживает виртуальные сети и bridge
Когда использовать Docker
- Микро-сервисы — каждый сервис в отдельном контейнере
- CI/CD — быстрый запуск и остановка для тестов
- Compose — описание multi-service приложений в одном файле
- Экосистема — Docker Hub, Kubernetes, регулярные обновления образов
Пример: web-сервер на LXC
# Создание контейнера
lxc launch ubuntu:22.04 web-server
# Установка пакетов
lxc exec web-server -- apt update
lxc exec web-server -- apt install -y nginx php8.1-fpm mysql-server
# Настройка сети
lxc config device add web-server eth0 nic \
name=eth0 nictype=bridged parent=lxdbr0
# Запуск сервисов
lxc exec web-server -- systemctl enable nginx mysql
lxc exec web-server -- systemctl start nginx mysql
# Просмотр логов
lxc exec web-server -- journalctl -u nginx -f
Пример: то же на Docker Compose
# docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./app:/var/www/html
depends_on:
- php
php:
image: php:8.1-fpm
volumes:
- ./app:/var/www/html
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Производительность
На реальных тестах:
- Память — Docker Alpine: 5 МБ, LXC Ubuntu: 30-50 МБ
- Время запуска — Docker: 1-2 секунды, LXC: 3-5 секунд
- Дисковое пространство — Docker: 10-50 МБ, LXC: 200-500 МБ
- CPU overhead — идентичны, оба используют cgroups
LXC идеален как замена виртуальным машинам для dev-окружений и серверов, где нужна полная Linux-среда. Docker лучше подходит для production-сервисов с четкой изоляцией процессов.
Proxmox + LXC
Proxmox VE использует LXC как основу для контейнеров. Это позволяет создавать контейнеры с минимальными накладными расходами и управлять ими через веб-интерфейс:
# Proxmox API: создание контейнера
pvesh create /nodes/pve/lxc \
--ostemplate local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname web-server \
--memory 512 \
--cores 2 \
--net0 name=eth0,bridge=vmbr0,ip=10.0.0.10/24
Сетевые особенности
- Docker: каждая сеть — это bridge с NAT по умолчанию
- LXC: поддержка macvlan, bridge, VLAN и.vxlan
- Docker: нет встроенного support для приватных сетей 3 уровня
- LXC: можно настроить BGP и OSPF между контейнерами
Вывод
Не противопоставляйте LXC и Docker — они решают разные задачи. Docker для микро-сервисов и CI/CD. LXC для замены VM и full-stack development. Профессиональный DevOps инженер знает оба инструмента и применяет их там, где они наиболее эффективны.