3 Августа 2015 15:51

LXC контейнеры на Ubuntu 14.04

После очередного переезда на новый сервер решено было использовать технологию контейнеров LXC. Покопавшись на просторах интернета и проведя не один десяток экспериментов получили вот такую инструкцию по установке этой технологии на сервер. Все получилось весьма просто и быстро.

Операционная система нашего сервера Ubuntu 14.04 64-разряда
HDD 1TB
Память 16Gb
Процессор: 1 x Xeon E3-1230v3

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

Инструкция
Авторизуемся на сервере с правами root и выполняем настройки. Для желающих можно все это сделать через sudo

1. Обновляем операционную среду
Код
apt-get update 
apt-get upgrade

2. Ставим пакеты для работы с контейнерами. Зависимости подтянутся сами.
Код
apt-get install lxc bridge-utils libvirt-bin debootstrap
3. Создаем пользователя с помощью которого будем заходить внутрь наших контейнеров. У него будут обычные права на Хост машине и административные (sudo) внутри контейнера. От его имени будут запускаться все сервисы приложений во всех контейнерах.

Первая команда создает пользователя, а вторая присваивает ему пароль.
Код
useradd zettahelp -m -s /bin/bash 
passwd zettahelp
4. Создаем первый контейнер с именем (к примеру) — tmpl. Наш пользователь zettahelp будет обладать там правами администратора.
Код
lxc-create -t ubuntu -n tmpl -- -b zettahelp

Проверяем что все встало как надо
Код
lxc-checkconfig 
Везде должно быть enabled


Код
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.13.0-59-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
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

5. Правим конфиг контейнера, который располагается по следующему пути /var/lib/lxc/tmpl/config
Добавляем туда два параметра:
1. - автостарт контейнера после перезагрузки хоста
2.- задержка запуска контейнера в секундах. Не стоит завешивать сервер одновременным запуском всех контейнеров.

Эти параметры нужно вставить до параметров настройки сети
Код
lxc.start.auto = 1 
lxc.start.delay = 0

Скрин экрана как это может выглядеть
85b343a1abb74f2b9e0bf07b1beff8a6.jpg



6. Запуск контейнера осуществляется командой
Код
lxc-start -d -n tmpl 
Параметр -d следует указать, если нет необходимости после запуска перейти в контейнер

Проверить статус контейнеров и узнать присвоенный им внутренний IP адрес, можно командой:
Код
lxc-ls --fancy
Чтобы убедиться что контейнер старнует автоматически после перезагрузки сервера следует его перегрузить, а затем вызвать команду:
Код
lxc-ls --fancy


7. Чтобы после перезагрузки контейнер имел один и тот же внутренний IP адрес следует раскомментировать в файле /etc/default/lxc-net следующую строку
Код
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
А в файле /etc/lxc/dnsmasq.conf добавить строку аналогичную этой
Код
dhcp-host=tmpl, 10.0.3.47
После этой операции следует перегрузить сервер и убедиться что контейнеры по прежнему запускаются. Если они не запускаются, то скорее всего ошибка в последних отредактированных файлах.


8. Если к контейнеру нужен доступ из внешнего мира, то нужно пробросить на него внешний IP - адрес.
Например вот такой командой:
Код
iptables -t nat -A PREROUTING -d 194.14.170.18 -j DNAT --to-destination 10.0.3.47

Но после перезагрузки сервера эта команда пропадет, а сохранять ее в таблице редиректов не хочется.
Для решения проблемы можно написать скрипт и запускать его при старте сервера
Код
#!/bin/bash
iptables -t nat -A PREROUTING -d 194.14.170.18 -j DNAT --to-destination 10.0.3.47


Сохраним его к примеру в файл /opt/bin/lxc-iptable.sh и ставим права на выполнения и чтение
Код
chmod 555 /opt/bin/*.sh

Редактируем файл /etc/rc.local и добавляем в нем вызов нашего скрипта

Код
sh /opt/bin/lxc-iptable.sh
Последней строкой должен быть код
Код
exit 0
Перегружаемся и проверяем что все работает как надо.


Проблемы с которыми пришлось столкнуться и пути их решения

1. Из контейнера не пинговался внешний IP адрес. Ping до других адресов доходил


Проблему удалось решить дописав в настройках контейнера внешний IP адрес. Возможно решение и кривое, но оно работает.

Т.е. вот в этот файл /var/lib/lxc/tmpl/config дописываем

Код
lxc.network.ip4 = 194.14.170.18

2. Sendmail очень медленно отправлял письма.
Проблема связана с том, что контейнер имеет имя tmpl и его адрес 127.0.1.1
Корректируем файл /etc/hosts

Должно получиться типа этого

Код
127.0.0.1   localhost localhost.localdomain tmpl
#127.0.1.1   tmpl

Вторую строчку закомментировал.
Просмотров:4435 0   Комментариев:0
'bitrix:asd.share.buttons' is not a component


IT-технологии
WEB сервера, настройка и конфигурирование, интересные решения
Программирование
WEB программирование, WEB дизайн, Кросс-браузерная верстка
Технические науки
Физика, Математика, Химия и все-то, что лежит в основе наших знаний