Линукс контейнеры (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 до нового поколения меня задавит жаба. Поэтому контейнеры для моих нужд подходят очень хорошо.