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;
  • $ lxc profile set default raw.idmap "both 1000 1000" - za správne mapovanie identifikátorov.

3. Vytvorenie a nastavenie kontajnera

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):

$ 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

Pre prehľadnosť priložím nádobu.

poweroff

Bonus! Je celkom jednoduché hodiť GPU do kontajnera, aby aplikácie spustené v ňom mohli využívať grafickú kartu. K tomu potrebujete:

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

4. Pomocou nádoby

Ak kontajner ešte nebeží, musíte ho spustiť:

lxc start dev1

Spustenie kódu VS ako používateľa bez oprávnenia root ubuntu:

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

Spustite Firefox:

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

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.

Užitočné odkazy

Zdroj: hab.com

Pridať komentár