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

    Итоги



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

    На этом покамест все.
    • +9
    • 13,7k
    • 8
    WestComp 24,13
    Компания
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 8
    • +2
      имея возможность запустить любой контейнер lxc можно промонтировать внутрь тот же /etc/sudoers, так что свистопляска с sudo не нужна — можно дать user ALL=(ALL) NOPASSWD: ALL
      • 0
        По крайней мере, дать разрешение на беспарольный запуск команд работающих только на чтение lxc-ls, lxc-info и тому подобное — это, я считаю, вполне оправданно.
      • +1
        На первом скрине контейнер с именем govno — это с языком go?
        • 0
          На самом деле, там когда-то жил skype и еще парочка похожих проприетарных приложений (:
        • 0
          Не очень понял как написанное относится к контейнерам. К работе в консоли, не более того.

          Когда контейнеров становится много, меньше всего хочется заиметь в 2 раза больше команд, и выполнить команду над неправильным контейнером (который, конечно же, запускался ещё во времена динозавров и отлично работал до текущего момента).

          А насчет заполнения sudoers… неужели там не поддерживаются шаблоны, и необходимо все писать самому?
          • 0
            Ну, помимо описания алиасов и заполнения sudoers, у этой небольшой статейки есть еще и вторая часть (:

            А по поводу шаблонов, если имеется в виду конструкции типа lxc-.*?, то нет. Более того, указывать потребно полные пути. Писать самому явно не комильфо и получаются такие вещи как-то так:
            dpkg -L lxc|grep bin|sed "s/^/user   ALL=(ALL) NOPASSWD:\t/"
            • 0
              а где вторая часть?
              • 0
                Так вот же она, начинается с «Настройка локального DHCP-сервера».

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

          Самое читаемое