Izolace vývojových prostředí pomocí kontejnerů LXD

Budu mluvit o přístupu k organizaci místních izolovaných vývojových prostředí na mé pracovní stanici. Tento přístup byl vyvinut pod vlivem následujících faktorů:

  • Různé jazyky vyžadují různá IDE a toolchainy;
  • Různé projekty mohou používat různé verze toolchainů a knihoven.

Přístup spočívá ve vývoji uvnitř kontejnerů LXD běžících lokálně na notebooku nebo pracovní stanici s grafickým výstupem přesměrovaným na hostitele.

Příklad konfigurace ubuntu 20.04.

Úvahy o možnostech a důvodech jsou uvedeny na konci článku.

1. Instalace LXD

В ubuntu 20.04 LXD již není k dispozici pro instalaci jako deb balíček, pouze přes snap:

$ snap install lxd

Po instalaci je potřeba provést inicializaci:

$ lxd init

Jediný parametr, který měním, je storage bakend - Používám dir jako ten nejjednodušší. Protože nepoužívám obrázky a kopie, varování v dokumentace Neděsí mě:

Podobně je třeba zvážit backend adresáře jako poslední možnost.
Podporuje všechny hlavní funkce LXD, ale je strašně pomalý a neefektivní, protože nemůže fungovat
okamžité kopie nebo snímky, a tak potřebuje pokaždé zkopírovat celé úložiště instance.

2. Nastavení profilu LXD

Profily v LXD — toto jsou sady parametrů aplikované na několik kontejnerů. Pro mé potřeby mi stačí jediný defaultně vytvořený profil default s následujícími změnami:

  • $ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 — aby aplikace v kontejnerech mohly komunikovat s hostitelským serverem X11;
  • $ lxc profile set default environment.DISPLAY :0 - tak, že proměnná prostředí DISPLAY byl správně nainstalován v kontejnerech;
  • $ lxc profile set default raw.idmap "both 1000 1000" - za správné mapování identifikátorů.

3. Vytvoření a nastavení kontejneru

Vytvoření kontejneru na základě obrázku images:ubuntu/20.04:

$ lxc launch images:ubuntu/20.04 dev1

Preferuji obrázky z úložiště https://images.linuxcontainers.org, protože mají méně předinstalovaného softwaru. Z tohoto důvodu jsem přidal předponu images: k názvu obrázku. Vytvoření kontejneru na základě obrázku z úložiště Ubuntu lze provést následovně: $ lxc launch ubuntu/20.04 dev1.

Přístup ke kořenovému shellu kontejneru:

$ lxc exec dev1 -- bash

Nainstaluji Firefox a VS Code (z repozitáře podle pokynů):

$ 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

Pro přehlednost přiložím kontejner.

poweroff

Bonus! Je docela snadné hodit GPU do kontejneru, aby aplikace v něm běžící mohly používat grafickou kartu. K tomu potřebujete:

  • přidat zařízení $ lxc config device add dev1 mygpu gpu;
  • nainstalujte ovladače grafické karty do kontejneru - stejné, jaké jsou nainstalovány na hostiteli.

4. Použití nádoby

Pokud kontejner ještě neběží, musíte jej spustit:

lxc start dev1

Spuštění kódu VS jako uživatel bez oprávnění root ubuntu:

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

Spusťte Firefox:

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

Okna aplikace se zobrazí na hostiteli, ale budou se spouštět uvnitř kontejneru – podobně jako předávání grafiky pomocí ssh.

Spuštěné kontejnery nevypínám ručně, protože v tom nevidím moc smysl – omezuji se na zavírání oken běžících aplikací.

5. Závěr

Raději nepoužívám hostitelský OS pro vývoj, protože by to vyžadovalo instalaci vývojových nástrojů, ladění verzí knihoven, konfiguraci systémových komponent specifickým způsobem a další manipulace. To vše může vést k neočekávanému chování v jiném nevývojovém softwaru, nebo dokonce v celém OS. Například změny v konfiguraci OpenSSL mohou způsobit, že se OS přestane správně spouštět.

Vyzkoušel jsem různé nástroje k izolaci vývojových prostředí:

  • virtuální stroje (KVM, VirtualBox atd.) jsou nejzřejmější možností, ale spotřebovávají podstatně více zdrojů, ačkoli neexistují žádné jiné možnosti pro vývoj pod Windows (pokud je hostitelem Linux);
  • cloudové vývojové nástroje běžící na lokálním stroji (Cloud9 v kontejneru nebo virtuálním stroji, Eclipse Che atd.) - nejsou vyvíjeny pro tento režim provozu, vyžadují dodatečnou konfiguraci a údržbu, nejlépe je použít pro zamýšlený účel - v cloudu;
  • Docker kontejnery jsou zase určeny k něčemu jinému, podle mého názoru nejsou příliš vhodné pro rychlé prototypování pomocí softwaru, který ještě není zabalen v samostatných kontejnerech.

Zvolený přístup mi imponuje svou jednoduchostí a nízkou bariérou vstupu. V samotných kontejnerech můžete použít přístupy specifické pro daný projekt: nainstalovat a nakonfigurovat vše ručně, nebo použít automatizaci (Puppet, Ansible atd.), dokonce nasadit Infrastruktura založená na dockeru. Také používám kontejnery LXD ke spouštění specifického softwaru, který buď vyžaduje instalaci velkého počtu závislostí nebo jinou verzi OS - v tomto případě můžete vytvořit kontejner s požadovanou verzí OS, například $ lxc launch images:ubuntu/16.04 dev16.

Je důležité si uvědomit, že pokud jde o izolaci, kontejnerizace má ve srovnání s virtualizací větší útočnou plochu – hostitel a kontejner sdílejí jedno jádro, což je zranitelnost, která může umožnit malwaru uniknout z kontejneru. Při experimentování s pochybným softwarem je lepší použít vhodnější izolační mechanismy.

Užitečné odkazy

Zdroj: www.habr.com

Přidat komentář