ContainerKit
Общие сведения
ContainerKit является консольным фронтендом к утилитам LXC (легковесная система виртуализации в ядре Linux) и позволяет полноценно управлять контейнерами (использовать утилиты LXC в чистом виде можно разве что в образовательных целях).
На текущий момент в качестве хоста поддерживается Ubuntu и Debian (тестировалось только на Ubuntu 10.04), а для гостевой системы лучше всего использовать Debian.
Основные возможности
- Корректный многопоточный запуск/останов/перезапуск контейнеров.
- Создание новых контейнеров из шаблонов.
- Уничтожение контейнеров.
- Тегирование контейнеров.
- Использование селекторов практически во всех операциях с контейнерами.
- Фильтрация ip адресов разрешенных для использования контейнером.
- Подключение к консоли контейнера.
- Архивация и восстановление контейнеров.
Установка
Сперва необходимо подключить репозиторий:
wget http://archive.linux-containers.ru/key.asc -O -|apt-key add - echo 'deb http://archive.linux-containers.ru/ubuntu lucid main' >> /etc/apt/sources.list
Обновление и установка:
apt-get update apt-get install containerkit
Далее нужно скачать и распаковать шаблон:
cd /var/containers/.templates wget http://download.trueoffice.org/templates/debian-minimal.tar.gz tar xf debian-minimal.tar.gz
Настройка
Сеть
Для функционирования сети необходимо создать мост. В файле /etc/network/interfaces:
auto br0 iface br0 inet static address 192.168.2.1 netmask 255.255.255.0 network 192.168.2.0 pre-up brctl addbr br0 post-down brctl delbr br0
После этого перезапустить сеть:
/etc/init.d/networking restart
Также надо добавить SNAT-правило для iptables:
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to-source <ext_ip>
В случае, если планируется раздавать контейнерам внешние IP-адреса, iptables трогать не нужно — достаточно просто добавить интерфейс eth0 хоста в мост.
Cgroup
Необходимо смонтировать файловую систему cgroup. Для начала создадим каталог:
mkdir /cgroup
Теперь надо прописать точку монтирования в fstab:
echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab
Затем применяем новые настройки монтирования:
mount -a
ContainerKit
В файле /etc/containerkit/config.yml в разделах network и general содержатся параметры, настраиваемые индивидуально для каждого хоста. Названия ключей интуитивно понятны.
Секции roots и executables, как правило, трогать не требуется.
Автозапуск
Чтобы контейнеры с тегом "autostart" запускались при старте системы, нужно добавить init-скрипт в автозагрузку:
update-rc.d containerkit defaults
Управление
Все управление осуществляется с помощью команды "ck".
ContainerKit может работать в двух режимах: обычном и командной строки.
В режиме командной строки можно воспользоваться автоматическим дополнением для названий команд и имен контейнеров, в остальном эти режимы идентичны.
Вход в режим командной строки:
ck -s
Увидеть список команд можно так:
ck cmd-list
(Или нажатием на enter без указания аргументов в режиме командной строки.)
Создание контейнеров
Создание нового контейнера осуществляется командой:
ck create
Команда в интерактивном режиме спросит имя, IP-адрес и шаблон контейнера.
Также можно при создании сразу добавить тег:
ck create --tag test
Имя, IP и шаблон также можно передавать с помощью аргументов —name, —ip, —template.
Селекторы
Селектор — это имя контейнера или тег, присвоенный одному или нескольким контейнерам.
Селектор, содержащий тег, записывается как ":name", а селектор, содержащий имя, — просто "name".
Команды, принимающие селекторы в качестве аргумента
- start
- stop
- restart
- destroy
- list
- tag-add
- tag-remove
- tag-list
- archive
Зарезервированные селекторы
:all — по данному селектору выбираются все контейнеры. Тег "all" не нужно присваивать вручную. Подразумевается, что он есть у всех контейнеров всегда.
:autostart — для того, чтобы контейнер автоматически запускался при старте системы, необходимо присвоить ему тег "autostart".
Примеры использования
Запустить все контейнеры с тегом "test":
ck start :test
Уничтожить контейнер с именем "c1":
ck destroy c1
Добавить контейнеру "с2" тег "autostart":
ck tag-add c2 autostart
Добавить всем контейнерам с тегом "autostart" тег "test":
ck tag-add :autostart test
Технические подробности устройства сети
Несмотря на то, что LXC поддерживает разнообразные варианты конфигурации сети, ContainerKit, в силу необходимости фильтрации IP-адресов гостей, использует только veth-тип сети.
Veth — это виртуальное парное сетевое устройство, один конец которого перемещается в пространство контейнера, а другой присоединяется к программному мосту br0. Фактически схема эмулирует патч-корд и свитч.
На стороне контейнера устройство имеет имя eth0, на стороне хоста — veth_<container_name> (например, veth_test).
Фильтрация трафика реализована с помощью ebtables и отсекает весь трафик с IP-адресами источника, явно не разрешенными для использования контейнером. По такому же принципу фильтруются и ARP-запросы.