Linux-контейнеры: когда контейнеров становится больше

от автора

В прошлой статье я вкратце рассказал о том, что такое контейнерная виртуализация, LXC в частности, зачем это нужно и как это все по-быстрому настроить.

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


Это только то, что живет на личном лаптопе.

Настройка командной оболочки

В первую очередь, хочется избавиться от необходимости каждый раз вводить sudo/su и получить доступ к утилитам управления LXC из-под своего пользователя.

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

lxc.alias

alias "lxc-monitor=sudo lxc-monitor" alias "lxc-test-saveconfig=sudo lxc-test-saveconfig" alias "lxc-wait=sudo lxc-wait" alias "lxc-config=sudo lxc-config" alias "lxc-test-createtest=sudo lxc-test-createtest" alias "lxc-test-apparmor=sudo lxc-test-apparmor" alias "lxc-test-destroytest=sudo lxc-test-destroytest" alias "lxc-test-containertests=sudo lxc-test-containertests" alias "lxc-unshare=sudo lxc-unshare" alias "lxc-autostart=sudo lxc-autostart" alias "lxc-snapshot=sudo lxc-snapshot" alias "lxc-create=sudo lxc-create" alias "lxc-execute=sudo lxc-execute" alias "lxc-test-shutdowntest=sudo lxc-test-shutdowntest" alias "lxc-freeze=sudo lxc-freeze" alias "lxc-test-get_item=sudo lxc-test-get_item" alias "lxc-test-getkeys=sudo lxc-test-getkeys" alias "lxc-cgroup=sudo lxc-cgroup" alias "lxc-test-attach=sudo lxc-test-attach" alias "lxc-usernsexec=sudo lxc-usernsexec" alias "lxc-test-cgpath=sudo lxc-test-cgpath" alias "lxc-test-snapshot=sudo lxc-test-snapshot" alias "lxc-start-ephemeral=sudo lxc-start-ephemeral" alias "lxc-test-device-add-remove=sudo lxc-test-device-add-remove" alias "lxc-test-concurrent=sudo lxc-test-concurrent" alias "lxc-destroy=sudo lxc-destroy" alias "lxc-test-console=sudo lxc-test-console" alias "lxc-checkconfig=sudo lxc-checkconfig" alias "lxc-test-autostart=sudo lxc-test-autostart" alias "lxc-start=sudo lxc-start" alias "lxc-test-locktests=sudo lxc-test-locktests" alias "lxc-clone=sudo lxc-clone" alias "lxc-test-may-control=sudo lxc-test-may-control" alias "lxc-test-list=sudo lxc-test-list" alias "lxc-test-clonetest=sudo lxc-test-clonetest" alias "lxc-test-lxcpath=sudo lxc-test-lxcpath" alias "lxc-ls=sudo lxc-ls --fancy" alias "lxc-console=sudo lxc-console" alias "lxc-info=sudo lxc-info" alias "lxc-unfreeze=sudo lxc-unfreeze" alias "lxc-test-startone=sudo lxc-test-startone" alias "lxc-device=sudo lxc-device" alias "lxc-test-reboot=sudo lxc-test-reboot" alias "lxc-stop=sudo lxc-stop" alias "lxc-attach=sudo lxc-attach" 

Подойдет как для zsh, так и для bash. Для активации, потребуется прописать source /path/to/lxc.alias в ~/.bashrc или ~/.zshrc.

Второе — прописать выполнение всех этих команд в /etc/sudoers.d с разрешением на выполнение без ввода пароля:

/etc/sudoers.d/lxc

user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-autostart user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-attach user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-apparmor user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-concurrent user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-usernsexec user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-destroytest user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-clone user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-shutdowntest user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-device-add-remove user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-locktests user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-clonetest user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-console user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-attach user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-config user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-list user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-startone user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-device user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-snapshot user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-autostart user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-getkeys user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-unfreeze user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-lxcpath user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-createtest user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-execute user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-create user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-console user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-start-ephemeral user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-checkconfig user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-info user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-destroy user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-get_item user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-snapshot user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-cgroup user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-may-control user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-reboot user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-wait user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-unshare user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-start user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-monitor user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-cgpath user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-stop user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-containertests user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-ls user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-freeze user   ALL=(ALL) NOPASSWD:	/usr/bin/lxc-test-saveconfig 

Здесь «user» — имя вашей учетной записи.

Настройка локального DHCP-сервера

Следующее, что хотелось бы сделать: дать возможность нашим контейнерам получать настройки сети в автоматическом режиме, без нудного редактирования персональных конфигов. Немножко погуглив, я наткнулся на вот эту статью.

Рецепт был творчески переосмыслен и взят на вооружение, но кое-что пришлось поправить. Что именно, поведаю далее.

Первое, что нужно сделать — это установить сам dhcp-server.

apt-get install isc-dhcp-server

Если настраивали по моей прошлой статье, то трогать /etc/network/interfaces не нужно. На всякий случай, напомню, как он выглядит:

/etc/network/interfaces

iface br0 inet static    address 172.20.0.1    netmask 255.255.255.0    pre-up  /sbin/brctl addbr br0    post-up /sbin/brctl setfd br0 0    post-up iptables -t nat -A POSTROUTING -s 172.20.0.0/24 -j MASQUERADE    post-up echo 1 > /proc/sys/net/ipv4/ip_forward    pre-down /sbin/brctl delbr br0 

Вместо того, чтобы править конфиг каждого контейнера, отредактируем глобальный:

/etc/lxc/default.conf

lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.name = eth0 

Прописывать здесь шлюзы, маски подсети, DNS и тем более mac-адреса не нужно. Все это выдадут dhcp-сервер и lxc.

Настроим isc-dhcpd:

/etc/default/isc-dhcp-server

INTERFACES="br0" 

То есть, просто укажем интерфейс, на котором dhcpd будет работать.

Открываем файл /etc/dhcp/dhcpd.conf, находим там закоментированные директивы вида subnet и дописываем туда следующее:

/etc/dhcp/dhcpd.conf

subnet 172.20.0.0 netmask 255.255.255.0 { 	range 172.20.0.10 172.20.0.250; 	option domain-name-servers 8.8.8.8,  8.8.4.4 ; 	option routers 172.20.0.1; } 

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

Итоги

В результате вышеприведенных действий, манипуляции с контейнерами становятся гораздо приятнее: пропала нужда править конфиг каждого контейнера да и вообще вводить лишние буковки с клавиатуры.

На этом покамест все.

ссылка на оригинал статьи http://habrahabr.ru/post/270439/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *