Ізаляцыя асяроддзяў распрацоўкі з дапамогай кантэйнераў LXD
Я раскажу аб падыходзе да арганізацыі лакальных ізаляваных асяроддзяў распрацоўкі на сваёй працоўнай станцыі. Падыход быў выпрацаваны пад уздзеяннем наступных фактараў:
для розных моў патрэбны розныя IDE і тулчайны;
у розных праектах могуць выкарыстоўвацца розныя версіі тулчайнаў і бібліятэк.
Падыход заключаецца ў тым, каб весці распрацоўку ўнутры LXD кантэйнераў запушчаных лакальна на ноўтбуку або працоўнай станцыі з перанакіраваннем вываду графікі ў хост.
Канфігурацыя на прыкладзе Ubuntu 20.04.
Разважанні аб варыянтах і прычынах прыведзены ў канцы артыкула.
1. Устаноўка LXD
В Ubuntu 20.04 LXD больш не даступны для ўстаноўкі як deb пакет, толькі праз snap:
$ snap install lxd
Пасля ўстаноўкі трэба выканаць ініцыялізацыю:
$ lxd init
Адзіны параметр які я мяняю, гэта storage bakend - я выкарыстоўваю dir як самы просты. Так як здымкі і копіі я не выкарыстоўваю, то папярэджання ў дакументацыі мяне не палохаюць:
Падобна, directory backend з'яўляецца вынікам апошніх рэсурсаў option.
Гэта спрыяе ўсім галоўным LXD нюансы, але з'яўляецца вельмі нізкім і неэфектыўным, як ён можа быць
instant copies or snapshots and so needs to copy the entirety of instance's storage every time.
2. Настройка профілю LXD
Профілі ў LXD - Гэта наборы параметраў ужывальных да некалькіх кантэйнераў. Для маіх патрэб мне дастаткова адзінага створанага па змаўчанні профілю default з наступнымі зменамі:
$ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 - Каб прыкладанні ў кантэйнерах маглі ўзаемадзейнічаць з хаставым X11 серверам;
$ lxc profile set default environment.DISPLAY :0 - каб пераменная навакольнага асяроддзя DISPLAY у кантэйнерах была ўстаноўлена карэктна;
$ lxc profile set default raw.idmap "both 1000 1000" - для правільнага мапінга ідэнтыфікатараў.
3. Стварэнне і настройка кантэйнера
Стварэнне кантэйнера на базе выявы images:ubuntu/20.04:
$ lxc launch images:ubuntu/20.04 dev1
Я аддаю перавагу выявы з рэпазітара https://images.linuxcontainers.org, так як у іх менш прадусталяванага софту. Па гэтай прычыне я дадаў прэфікс images: да імя выявы. Стварэнне кантэйнера на базе выявы з рэпазітара Ubuntu можна выканаць наступным чынам: $ lxc launch ubuntu/20.04 dev1.
Доступ да рутавага ішоў кантэйнера:
$ lxc exec dev1 -- bash
Усталюю Firefox і VS Code (з рэпазітара па інструкцыі):
Вокны прыкладанняў будуць адлюстроўвацца на хасце, але пры гэтым выконвацца яны будуць усярэдзіне кантэйнера - падобна пракіду графікі з дапамогай ssh.
Я не выключаю запушчаных кантэйнераў уручную, бо не бачу ў гэтым асаблівага сэнсу - абмяжоўваюся зачыненнем вокнаў запушчаных прыкладанняў.
5. заключэнне
Я аддаю перавагу не выкарыстоўваць хаставую АС для распрацоўкі, бо гэта запатрабавала бы ўсталёўкі прылад распрацоўкі, адладкавых версій бібліятэк, налады кампанентаў сістэмы спецыфічным чынам і іншых маніпуляцый. Усё гэта можа прыводзіць да нечаканых паводзін астатняга, не звязанага з распрацоўкай, праграмнага забеспячэння, а то і ўсёй АС. Напрыклад змены ў канфігурацыі OpenSSL могуць прывесці да таго, што АС перастане карэктна запускацца.
Я спрабаваў розныя сродкі для ізаляцыі асяроддзяў распрацоўкі:
віртуальныя машыны (KVM, VirtualBox і да т.п.) - самы відавочны варыянт, але спажывае значна больш рэсурсаў, хоць для распрацоўкі пад Windows (у тым выпадку, калі хост Linux) іншых варыянтаў няма;
прылады хмарнай распрацоўкі запушчаныя на лакальнай машыне (Cloud9 у кантэйнеры ці віртуальнай машыне, Eclipse Che і да т.п.) - іх распрацоўваюць не для такога рэжыму працы, яны патрабуюць дадатковай налады і суправаджэння, лепш за ўсё выкарыстоўваць іх па прызначэнні - у воблаку;
кантэйнеры Docker - ізноў жа прызначаны для іншага, на мой погляд у іх не вельмі зручна хутка прататыпаваць з ужываннем таго ПА, якое яшчэ не запакаваная ў асобныя кантэйнеры.
Абраны падыход імпануе мне прастатой і нізкім парогам уваходжання. У саміх кантэйнерах можна ўжываць спецыфічныя для праектаў падыходы: усталёўваць і наладжваць усё ўручную, альбо ўжываць аўтаматызацыю (Puppet, Ansible і да т.п.), нават разгортваць інфраструктуру на базе Docker. Я выкарыстоўваю кантэйнеры LXD гэтак жа для запуску спецыфічнага ПА якое альбо патрабуе ўсталёўкі вялікай колькасці залежнасцяў, альбо іншай версіі АС – у гэтым выпадку можна стварыць кантэйнер з патрэбнай версіяй АС да прыкладу $ lxc launch images:ubuntu/16.04 dev16.
Важна памятаць аб тым, што ў разрэзе ізаляцыі кантэйнерызацыя мае вялікую паверхню атакі ў параўнанні з віртуалізацыяй - хост і кантэйнер дзеляць адно ядро, уразлівасць у якім можа дазволіць шкоднаснаму праграмнаму забеспячэнню збегчы з кантэйнера. Для эксперыментаў з сумнеўным ПЗ лепш выкарыстоўваць больш прыдатныя механізмы ізаляцыі.