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-запросы.