Izolácia vývojových prostredí pomocou kontajnerov LXD

Pripravím prístup k organizácii lokálnych izolovaných vývojových prostredí na svojom pracovnom stanici. Prístup bol vyvinutý pod vplyvom nasledujúcich faktorov:

  • pre rôzne jazyky sú potrebné rôzne IDE a toolchainy;
  • v rôznych projektoch môžu byť použité rôzne verzie toolchainov a knižníc.

Prístup spočíva v tom, že vyvíjam v LXD kontajneroch spustených lokálne na laptopu alebo pracovnej stanici s presmerovaním grafického výstupu na hosť.

Konfigurácia na príklade Ubuntu 20.04.

Úvahy o možnostiach a dôvodoch sú uvedené na konci článku.

1. Inštalácia LXD

V Ubuntu 20.04 LXD už nie je dostupný na inštaláciu ako deb balík, iba cez snap:

$ snap install lxd

Po inštalácii je potrebné vykonať inicializáciu:

$ lxd init

Jedinečný parameter, ktorý mením, je storage backend — používam dir ako najjednoduchší. Keďže snímky a kópie nepoužívam, varovania v dokumenácie ma neodrádzajú:

Podobne sa adresárový backend považuje za poslednú možnosť.
Podporuje všetky hlavné funkcie LXD, ale je hrozne pomalý a neefektívny, pretože nemôže vykonávať
okamžité kópie alebo snímky, a preto musí zakaždým kópiu celého úložiska inštancie.

2. Nastavenie profilu LXD

Profily v LXD — to sú súbory parametrov aplikované na niekoľko kontajnerov. Pre moje potreby mi stačí jediné predvolené vytvorené profily 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 hosťujúcim X11 serverom;
  • $ lxc profile set default environment.DISPLAY :0 — aby bola premenná prostredia DISPLAY v kontajneroch nastavená správne;
  • $ lxc profile set default raw.idmap "both 1000 1000" — pre správne mapovanie identifikátorov.

3. Vytvorenie a nastavenie kontajnera

Vytvorenie kontajnera na báze obrazu images:ubuntu\/20.04:

$ lxc launch images:ubuntu\/20.04 dev1

Preferujem obrazy z repozitára https://images.linuxcontainers.org, pretože majú menej predinštalovaného softvéru. Z tohto dôvodu som pridal prefix images: k názvu obrazu. Vytvorenie kontajnera na báze obrazu z repozitára Ubuntu možno vykonať nasledujúcim spôsobom: $ lxc launch ubuntu\/20.04 dev1.

Prístup k root shellu kontajnera:

$ lxc exec dev1 -- bash

Nainštalujem Firefox a VS Code (z repozitára podľa inštrukcií):

$ apt update
$ apt install curl gpg firefox

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list

$ apt update
$ apt install code

Zapnem kontajner pre prehľadnosť

poweroff

Bonus! Celkom jednoducho sa dá preniesť GPU do kontajnera, aby aplikácie spustené v ňom mohli využiť grafickú kartu. Na to je potrebné:

  • pridať zariadenie $ lxc config device add dev1 mygpu gpu;
  • nainštalovať ovládače videokarty do kontajnera – tie isté, ktoré sú nainštalované na hostiteľovi.

4. Používanie kontajnera

Ak kontajner ešte nie je spustený, je potrebné ho spustiť:

lxc start dev1

Spustenie VS Code ako neprivilegovaného používateľa ubuntu:

lxc exec dev1 -- sudo --login --user ubuntu code

Spustenie Firefoxu:

lxc exec dev1 -- sudo --login --user ubuntu firefox

Okna aplikácií sa budú zobrazovať na hostiteľovi, ale budú bežať vo vnútri kontajnera – podobne ako prenášanie grafiky pomocou ssh.

Neprestavujem spustené kontajnery ručne, pretože v tom nevidím zvláštny zmysel – obmedzujem sa na zatvorenie okien spustených aplikácií.

5. Záver

Preferujem nepoužívať hostiteľský OS na vývoj, pretože by to vyžadovalo inštaláciu vývojových nástrojov, ladených verzií knižníc, nastavovanie systémových komponentov špecifickým spôsobom a ďalšie manipulácie. To všetko môže viesť k neočakávanému správaniu ostatného softvéru, nesúvisiaceho s vývojom, a môže dokonca spôsobiť problémy celému OS. Napríklad zmeny v konfigurácii OpenSSL môžu spôsobiť, že OS sa prestane správne spúšťať.

Skúšal som rôzne prostriedky na izoláciu vývojového prostredia:

  • virtuálne stroje (KVM, VirtualBox a pod.) – najzrejmejší variant, ale vyžaduje výrazne viac zdrojov, hoci pri vývoji pod Windows (ak je hostiteľ Linux) nie sú iné možnosti;
  • nástroje cloudového vývoja spustené na lokálnom stroji (Cloud9 v kontajneri alebo virtuálnom stroji, Eclipse Che a pod.) – nie sú vyvíjané na takýto režim, vyžadujú ďalšie nastavenie a údržbu, najlepšie ich používať na účel – v cloude;
  • Docker kontajnery sú, podľa môjho názoru, určené na niečo iné; nie sú najvhodnejšie na rýchle prototypovanie s použitím softvéru, ktorý ešte nie je zabalený do samostatných kontajnerov.

Zvolený prístup sa mi páči svojou jednoduchosťou a nízkym prahom vstupu. V rámcoch kontajnerov je možné aplikovať špecifické prístupy pre projekty: inštalovať a nastavovať všetko ručne alebo použiť automatizáciu (Puppet, Ansible atď.), ba dokonca rozvíjať infrastruktúru na báze Docker.Kontajnery LXD používam aj na spúšťanie špecifického softvéru, ktorý si vyžaduje inštaláciu veľkého množstva závislostí alebo inú verziu OS; v tomto prípade je možné vytvoriť kontajner s požadovanou verziou OS, napríklad $ lxc launch images:ubuntu/16.04 dev16.

Je dôležité pamätať na to, že z hľadiska izolácie má kontajnerizácia väčšiu útočnú plochu v porovnaní s virtualizáciou — hostiteľ a kontajner zdieľajú jedno jadro, jeho zraniteľnosť môže umožniť škodlivému softvéru uniknúť z kontajnera. Na experimenty so sporným softvérom je lepšie používať vhodnejšie mechanizmy izolácie.

Užitočné odkazy

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster