Izolácia vývojových prostredí pomocou kontajnerov LXD
Budem hovoriť o prístupe k organizovaniu miestnych izolovaných vývojových prostredí na mojej pracovnej stanici. Tento prístup bol vyvinutý pod vplyvom nasledujúcich faktorov:
Rôzne jazyky vyžadujú rôzne IDE a reťazce nástrojov;
Rôzne projekty môžu používať rôzne verzie nástrojov a knižníc.
Prístup spočíva vo vývoji vnútri kontajnerov LXD bežiacich lokálne na notebooku alebo pracovnej stanici s grafickým výstupom presmerovaným na hostiteľa.
Príklad konfigurácie Ubuntu 20.04.
Úvahy o možnostiach a dôvodoch sú uvedené na konci článku.
1. Inštalácia LXD
В Ubuntu 20.04 LXD už nie je možné nainštalovať ako deb balík, iba cez snap:
$ snap install lxd
Po inštalácii je potrebné vykonať inicializáciu:
$ lxd init
Jediný parameter, ktorý mením, je storage bakend - Používam dir ako ten najjednoduchší. Keďže nepoužívam obrázky a kópie, upozornenia v dokumentáciu Nestrašia ma:
Podobne aj backend adresára treba považovať za poslednú možnosť.
Podporuje všetky hlavné funkcie LXD, ale je strašne pomalý a neefektívny, pretože nemôže fungovať
okamžité kópie alebo snímky, a preto potrebuje zakaždým skopírovať celé úložisko inštancie.
2. Nastavenie profilu LXD
Profily v LXD — ide o súbory parametrov aplikovaných na niekoľko kontajnerov. Pre moje potreby mi stačí jediný štandardne vytvorený profil default s nasledujúcimi zmenami:
$ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 — aby aplikácie v kontajneroch mohli interagovať s hostiteľským serverom X11;
$ lxc profile set default environment.DISPLAY :0 - tak, že environmentálna premenná DISPLAY bola správne nainštalovaná v kontajneroch;
Vytvorenie kontajnera na základe obrázka images:ubuntu/20.04:
$ lxc launch images:ubuntu/20.04 dev1
Preferujem obrázky z úložiska https://images.linuxcontainers.org, keďže majú menej predinštalovaného softvéru. Z tohto dôvodu som pridal predponu images: k názvu obrázka. Vytvorenie kontajnera na základe obrázka z úložiska Ubuntu je možné vykonať takto: $ lxc launch ubuntu/20.04 dev1.
Prístup ku koreňovému obalu kontajnera:
$ lxc exec dev1 -- bash
Nainštalujem Firefox a VS Code (z repozitára podľa návodu):
Okná aplikácie sa zobrazia na hostiteľovi, ale budú sa spúšťať vo vnútri kontajnera – podobne ako pri posielaní grafiky pomocou ssh.
Spustené kontajnery nevypínam manuálne, pretože v tom nevidím zmysel - obmedzujem sa na zatváranie okien spustených aplikácií.
5. záver
Na vývoj radšej nepoužívam hostiteľský OS, pretože by to vyžadovalo inštaláciu vývojových nástrojov, ladenie verzií knižníc, konfiguráciu systémových komponentov špecifickým spôsobom a iné manipulácie. To všetko môže viesť k neočakávanému správaniu v inom nevývojovom softvéri alebo dokonca v celom OS. Napríklad zmeny v konfigurácii OpenSSL môžu spôsobiť, že operačný systém sa prestane správne spúšťať.
Skúšal som rôzne nástroje na izoláciu vývojových prostredí:
virtuálne stroje (KVM, VirtualBox atď.) sú najviditeľnejšou možnosťou, ale spotrebúvajú podstatne viac zdrojov, hoci neexistujú žiadne iné možnosti vývoja pod Windows (ak je hostiteľom Linux);
cloudové vývojové nástroje bežiace na lokálnom stroji (Cloud9 v kontajneri alebo virtuálnom stroji, Eclipse Che atď.) - nie sú vyvinuté pre tento režim prevádzky, vyžadujú dodatočnú konfiguráciu a údržbu, najlepšie je použiť ich na určený účel účel - v cloude;
Docker kontajnery sú zase určené na niečo iné, podľa mňa nie sú príliš vhodné na rýchle prototypovanie pomocou softvéru, ktorý ešte nie je zabalený v samostatných kontajneroch.
Zvolený prístup mi imponuje svojou jednoduchosťou a nízkou bariérou vstupu. V samotných kontajneroch môžete použiť prístupy špecifické pre daný projekt: inštalovať a konfigurovať všetko manuálne, alebo využiť automatizáciu (Puppet, Ansible atď.), dokonca nasadiť Infraštruktúra založená na dockeroch. Kontajnery LXD používam aj na spustenie špecifického softvéru, ktorý buď vyžaduje inštaláciu veľkého množstva závislostí alebo inú verziu OS - v tomto prípade si môžete vytvoriť kontajner s požadovanou verziou OS, napr. $ lxc launch images:ubuntu/16.04 dev16.
Je dôležité si uvedomiť, že pokiaľ ide o izoláciu, kontajnerizácia má v porovnaní s virtualizáciou väčšiu útočnú plochu – hostiteľ a kontajner zdieľajú jedno jadro, čo je zraniteľnosť, ktorá umožňuje malvéru uniknúť z kontajnera. Pri experimentovaní s pochybným softvérom je lepšie použiť vhodnejšie izolačné mechanizmy.