Линукс контейнеры (LXC) на базе Ubuntu.

Ничего нового я не напишу, вся эта информация есть в интернете и даже много раз. Посто хотелось немного обощить, все что я проделал и оставить себе небольшую шпаргалку, если(когда) я буду делать это вновь.

Я давно знаю про jail на FreeBSD, даже приходилось пользоваться им, как в домашних условиях, так и на работе. Я достаточно давно знаю, что для линукса тоже есть нечто подобное, но на днях мне попалась статья об одной из этих технологий, Linux-VServer, мне показалось это интересным, но дистрибутива в убунту не было, надо было подключать сторонние репозитории. Я почитал, оказалось, что подобных контейнеров несколько, есть еще OpenVZ и LXC. Второй оказался в стандартном репозитории Ubuntu. Его я и настроил.

Установка :

apt-get install lxc

Проверка, что все установилось:

lxc-checkconfig

Выглядит это примерно так:

inot@lxc:~$ lxc-checkconfig Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-3.11.0-12-generic --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: missing Network namespace: enabled Multiple /dev/pts instances: enabled

--- Control groups --- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled

--- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Создаем новый контейнер:

lxc-create -n ts -t ubuntu

Операция эта достаточно долгая первый раз. Торопиться не стоит.  После создания вывалится надпись с логином и паролем для нового контейнера.

Список контейнеров можно посмотреть вот так:

lxc-ls --fancy

inot@lxc:~$ sudo lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------ ts STOPPED - - NO

Запускаем:

lxc-start -n ts -d

Проверяем:

inot@lxc:~$ sudo lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------ ts RUNNING 10.0.3.183 - NO

Заходим в консоль контейнера:

lxc-console --name ts

Для того, чтобы выйти из консоли, необходимо нажать Ctrl+A, Q. Со включенным скрином это не работает, я пока не разбирался, как это обойти. Может просто переназначить можно.

Внутри контейнера можно устанавливать софт, точно так же как на обычной машине. apt-get, простая компиляция или скаченный бинарник. В моем случае это был Team Speak сервер.  После установки сервера и его настройки, нужно чтобы к нему был доступ из внешнего мира. Внутри контейнера, по умолчанию своя сеть и контейнеры находятся за НАТом. Настройки iptables можно глянуть вот так на основной машине:

inot@lxc:~$ sudo iptables -t nat -L

Chain PREROUTING (policy ACCEPT) target prot opt source destination

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT) target prot opt source destination

Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24

С помощью команды *lxc-ls —fancy *смотрим айпи нашего контейнера и опять же на **основной машине **выполняем вот такую команду:

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 9987 -j DNAT --to 10.0.3.183:9987

Нужно обратить внимание на выделенные части. Протокол, в данном случае UDP. Порт входящего соединения 9987. Айпи контейнера и порт приложения. Входящий порт и порт приложения могут не совпадать, — ваш КО.

Теперь, все это нужно сохранить и контейнер сделать с автостартом. Делается это так:

iptables-save > /etc/iptables.up.rules

Тут есть небольшое уточнение, команда сохраняет текущее состояние iptables и транслирует его в файл и там добавляется строчка «-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE«, которую прописывает LXC, при запуске сам. Соответственно при следующем запуске, этих строчек будет уже две. Поэтому я руками убираю из файлика с правилами эту строчку, после каждого сохранения. Наверняка можно сделать по другому, но я пока не разбирался тут.

В файле /etc/network/interfaces нужно дописать к интерфейсу eth0(в данном случае он у меня получает айпи по DHCP):

auto eth0 iface eth0 inet dhcp pre-up iptables-restore < /etc/iptables.up.rules

Собственно теперь, доступ возможен снаружи на этот контейнер.

Хотелось бы отметить, что с основной машины, по каким-то причинам, доступ по ssh на контейнер не работает, даже если прописать правило в iptables, я видел несколько таких сообщений на форумах, когда искал как это порешать, но снаружи доступ отлично работает.

Для автоматического старта контейнера, вместе со стартом основной машины нужно выполнить такую команду:

ln -s /var/lib/lxc/ts/config /etc/lxc/auto/ts.conf

Вот примерно так, можно настроить быстро и без проблем LXC контейнеры на Ubuntu. Хочется добавить, что контейнеры интересны в первую очередь тем, что достаточно легко настраиваются и не требуют дополнительных ресурсов для работы(как гипервизор).

У меня есть мысли поменять свой старый HP Microserver на какой-нибудь дешовый ноутбук или неттоп, но на нем явно не установится ESXi, а обновить Microserver до нового поколения меня задавит жаба. Поэтому контейнеры для моих нужд подходят очень хорошо.