Lxc — Собственные Контейнеры Linux

В настоящее время в Linux существуют следующие известные реализации контейнеров:

Но они требуют применения своих патчей к ядру для получения необходимого функционала.

В отличие от них lxc начиная с версии ядра 2.6.29 это не требуется.

Для реализации изоляции используются существующие в ядре.

пространства имен и для управления ресурсами Контрольная группа .

Это позволяет создавать не только полностью изолированные среды, но и изолировать отдельные приложения.

Чтобы начать с lxc Вам понадобится Linux с ядром 2.6.29. В этом случае в ядре должны быть включены следующие опции:

* General setup ** Control Group support ---> Namespace cgroup subsystem ---> Freezer cgroup subsystem ---> Cpuset support ----> Simple CPU accounting cgroup subsystem ----> Resource counters ----> Memory resource controllers for Control Groups ** Group CPU scheduler ---> Basis for grouping tasks (Control Groups) ** Namespaces support ---> UTS namespace ---> IPC namespace ---> User namespace ---> Pid namespace ---> Network namespace * Security options --> File POSIX Capabilities * Device Drivers ** Network device support ---> Virtual ethernet pair device

Если все это включено, то монтируем файловую систему cgroup:

mkdir -p /var/lxc/cgroup mount -t cgroup cgroup /var/lxc/cgroup

Скачать lxc , собрать и установить:

.

/configure --prefix=/ make make install

Затем проверьте, какая версия iproute2 установлена.

Вам понадобится версия выше 2.6.26. Эта версия позволяет управлять виртуальными сетевыми устройствами и настраивать сетевые пространства имен.

Кроме того, если вы планируете использовать сеть внутри контейнера, вам необходимо перенастроить сетевую систему, чтобы она использовала режим моста.

Для этого опустите сетевой интерфейс:

ifconfig eth0 down

Создать мост br0:

brctl addbr br0 brctl setfd br0 0

Подключите к нему сетевой интерфейс:

brctl addif br0 eth0 ifconfig eth0 0.0.0.0 up

Настройте br0 с необходимым адресом и укажите шлюз по умолчанию:

ifconfig bdr0 192.168.1.2/24 up route add default gw 192.168.1.1

Затем при запуске контейнера будет создано специальное виртуальное устройство, соединяющее мост с виртуальным интерфейсом контейнера.

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

Самый простой способ — использовать готовые шаблоны от OpenVZ. я использовал шаблон для CentOS .

Загрузите и распакуйте его в каталог /var/lxc/centos/rootfs .

После этого вам нужно будет немного доработать шаблон, так как он предназначен для работы с OpenVZ. Для этого выполните следующие действия: Перейдите в каталог /var/lxc/centos/rootfs/etc/rc.d и в файле rc.sysinit закомментируйте следующие строки:

/sbin/start_udev mount -n /dev/pts >/dev/null 2>&1

В настоящее время каталог /dev монтируется с использованием привязки из текущей системы.

Затем закомментируйте строку в каталоге /var/lxc/centos/rootfs/etc/ в файле fstab:

none /dev/pts devpts rw 0 0

Затем перейдите в каталог /var/lxc/centos/rootfs/etc/sysconfig/network-scripts и создайте файл темы ifcfg-eth0, который выглядит следующим образом:

DEVICE=eth0 IPADDR=192.168.1.102 NETMASK=255.255.255.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 ONBOOT=yes NAME=eth0

Затем перейдите в каталог /var/lxc/centos/rootfs/etc/sysconfig/ и создайте сетевой файл:

NETWORKING="yes" GATEWAY="192.168.1.1" HOSTNAME="centos_ssh"

Теперь осталось только сменить пароль root. Для этого выполните chroot в образ системы и вызовите passwd:

chroot /var/lxc/centos/rootfs passwd

Подготовка системы завершена.

Перейдем к созданию настроек контейнера.

Для этого создайте два файла fstab и lxc-centos.conf в каталоге /var/lib/.

Далее вам необходимо создать файлы настроек контейнера.

Создайте lxc-centos.conf и fstab в каталоге /var/lxc/centos со следующим содержимым: lxc-centos.conf

lxc.utsname = centos_ssh lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.ipv4 = 192.168.1.101/24 lxc.network.name = eth0 lxc.mount = /var/lxc/centos/fstab lxc.rootfs = /var/lxc/centos/rootfs

fstab

/dev /var/lxc/centos/rootfs/dev none bind 0 0 /dev/pts /var/lxc/centos/rootfs/dev/pts none bind 0 0

Теперь вы можете создать контейнер.

Укажите имя centos и файл конфигурации:

lxc-create -n centos -f /var/lxc/centos/lxc-centos.conf

Проверяем, создан ли контейнер:

lxc-info -n centos 'centos' is STOPPED

Контейнер создан, но в данный момент не запущен.

Давайте запустим его:

lxc-start -n centos

Centos начнет загружаться.

Как только вы увидите:

INIT: no more processes left in this runlevel

Загрузка завершена.

Откройте ближайшую консоль и попробуйте проверить связь с адресом, выделенным контейнеру.

Как только он пингуется, вы можете войти в систему через ssh. Но помимо полноценных контейнеров lxc позволяет создавать контейнеры приложений.

Для этого создайте следующую структуру каталогов в каталоге /var/lxc/simple:

rootfs |-- bin |-- dev | |-- pts | `-- shm | `-- network |-- etc |-- lib |-- proc |-- root |-- sbin |-- sys |-- usr `-- var |-- empty |-- lib | `-- empty `-- run

Затем мы создаем lxc-simple.conf :

lxc.utsname = simple lxc.mount = /var/lxc/simple/fstab lxc.rootfs = /var/lxc/simple/rootfs

И fstab :

/lib /var/lxc/simple/rootfs/lib none ro,bind 0 0 /bin /var/lxc/simple/rootfs/bin none ro,bind 0 0 /usr /var/lxc/simple/rootfs/usr none ro,bind 0 0 /sbin /var/lxc/simple/rootfs/sbin none ro,bind 0 0

Далее создайте контейнер:

lxc-create -n simple -f /var/lxc/simple/lxc-simple.conf

И запустите приложение:

lxc-execute -n centos /bin/ls

Как видите, с одной стороны создать контейнер с приложением проще, с другой — сложнее, чем создать полноценный контейнер.

В настоящее время у вас есть один работающий контейнер и один остановленный контейнер приложения.

Но контейнеры, помимо утепления, должны позволять ограничивать ресурсы.

Для этого lxc использует lxc-cgroup. На данный момент он позволяет указать, какой процессор будет использоваться, сколько процессорного времени ему будет выделено, лимит доступной памяти и класс сетевого трафика, исходящего из контейнера для дальнейшей обработки.

Все настройки основаны на cgroup; за подробной информацией о настройках следует обратиться в каталог документации ядра.

Документация/группы Позвольте мне привести вам несколько простых примеров.

Привязка контейнера к первому ядру процессора:

lxc-cgroup -n centos cpuset.cpus 0

Ограничение памяти контейнера до 128 МБ:

lxc-cgroup -n centos memory.limit_in_bytes 128M

Кроме того, существуют различные варианты учета.

Непосредственно все это без lxc-cgroup можно посмотреть в каталоге /var/lxc/cgroup/centos. Если контейнер вам больше не нужен, вы можете остановить его:

lxc-stop -n centos

И удалите:

lxc-destroy -n centos

Обратите внимание: хотя при этом контейнер и будет удален, образ системы останется на диске.

Вы можете просмотреть запущенные процессы с помощью lxc-ps:

lxc-ps --lxc centos 7480 ? 00:00:00 init centos 7719 ? 00:00:00 syslogd centos 7736 ? 00:00:00 sshd

lxc-info показывает состояние контейнера:

lxc-info -n centos 'centos' is RUNNING

lxc-freeze блокирует все процессы в контейнере до тех пор, пока не будет вызван lxc-unfreeze

lxc-freeze -n centos

lxc-unfreeze снимает блокировку со всех процессов в контейнере

lxc-unfreeze -n centos

lxc — интересная технология, но на данный момент она не готова к использованию в производстве.

Изоляция явно недостаточна.

Таким образом, top внутри контейнера показывает все процессоры и всю память, mount отображает точки, смонтированные вне контейнера, а вызов set time изменяет их вне контейнера.

Кроме того, нет квот на используемое дисковое пространство и нет жестких ограничений на использование процессора.

Сейчас ведется работа над квотами, поэтому надеюсь, что скоро не будет необходимости патчить ядро для создания контейнеров.

Теги: #linux #Виртуализация #контейнер #openvz #jail

Вместе с данным постом часто просматривают: