Představím vám přístup k organizaci lokálních izolovaných vývojových prostředí na mém pracovním stanovišti. Tento přístup byl vyvinut na základě následujících faktorů:
- pro různé jazyky jsou potřeba různé IDE a nástrojové řetězce;
- v různých projektech mohou být použity různé verze nástrojových řetězců a knihoven.
Přístup spočívá v tom, že vývoj probíhá uvnitř LXD kontejnerů spuštěných lokálně na notebooku nebo pracovním stanovišti s přesměrováním grafického výstupu na hostitele.
Konfigurace na příkladu Ubuntu 20.04.
Úvahy o možnostech a důvodech jsou uvedeny na konci článku.
1. Instalace LXD
V Ubuntu 20.04 LXD již není k dispozici pro instalaci jako deb balíček, pouze prostřednictvím snap:
$ snap install lxdPo instalaci je třeba provést inicializaci:
$ lxd initJediný parametr, který měním, je backend pro ukládání — používám dir jako nejjednodušší. Protože nevyužívám snapshoty ani kopie, tak mě varování v nelekají:
Podobně je tento adresářový backend považován za poslední možnost.
Podporuje všechny hlavní funkce LXD, ale je hrozně pomalý a neefektivní, protože nemůže provádět
okamžité kopie nebo snapshoty a musí tak zkopírovat celou skladovací část instance pokaždé.
2. Nastavení profilu LXD
— to jsou sady parametrů aplikované na několik kontejnerů. Pro mé potřeby mi stačí jediný výchozí 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 interagovat s hostitelským X11 serverem;$ lxc profile set default environment.DISPLAY :0— aby proměnná prostředíDISPLAYv kontejnerech byla nastavena správně;$ lxc profile set default raw.idmap "both 1000 1000"— pro správné .
3. Vytvoření a nastavení kontejneru
Vytvoření kontejneru na základě obrazu images:ubuntu\/20.04:
$ lxc launch images:ubuntu\/20.04 dev1Preferuji obrazy z repozitáře , protože obsahují méně předinstalovaného softwaru. Z tohoto důvodu jsem přidal prefix images: k názvu obrazu. Vytvoření kontejneru na základě obrazu z repozitáře Ubuntu lze provést následujícím způsobem: $ lxc launch ubuntu\/20.04 dev1.
Přístup k rootovému shellu kontejneru:
$ lxc exec dev1 -- bashNainstaluji Firefox a VS Code (z repozitáře ):
$ 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 codeZapnu kontejner pro přehlednost
poweroffBonus! Je poměrně jednoduché prohodit GPU do kontejneru, aby aplikace, které v něm běží, mohly využívat grafickou kartu. K tomu je třeba:
- přidat zařízení
$ lxc config device add dev1 mygpu gpu; - nainstalovat v kontejneru ovladače grafické karty — stejné, které jsou nainstalovány na hostiteli.
4. Použití kontejneru
Pokud kontejner ještě není spuštěn, je potřeba jej spustit:
lxc start dev1Spuštění VS Code jako neprivilegovaného uživatele ubuntu:
lxc exec dev1 -- sudo --login --user ubuntu codeSpuštění Firefoxu:
lxc exec dev1 -- sudo --login --user ubuntu firefoxOkna aplikací se budou zobrazovat na hostiteli, ale budou se provádět uvnitř kontejneru — podobně jako překrutí grafiky přes ssh.
Nechozím ukládat spuštěné kontejnery ručně, protože v tom nevidím zvláštní smysl — omezuji se na zavření oken spuštěných aplikací.
5. Závěr
Dávám přednost tomu, abych pro vývoj nepoužíval hostitelský operační systém, protože by to vyžadovalo instalaci vývojových nástrojů, ladicích verzí knihoven, specifické konfigurace komponent systému a další manipulace. Vše to může vést k neočekávanému chování ostatního, s vývojem nesouvisejícího softwaru, a dokonce i celého operačního systému. Například změny v konfiguraci OpenSSL mohou způsobit, že operační systém přestane fungovat správně.
Zkoušel jsem různé nástroje pro izolaci vývojových prostředí:
- virtuální stroje (KVM, VirtualBox atd.) — nejzřejmější variant, ale spotřebovává výrazně více zdrojů, i když pro vývoj na Windows (pokud je host Linux) neexistují žádné jiné alternativy;
- nástroje cloudového vývoje spuštěné na místním stroji (Cloud9 v kontejneru nebo virtuálním stroji, Eclipse Che atd.) — nejsou vyvinuty pro tento režim práce, vyžadují další nastavení a údržbu, je nejlepší je používat podle jejich určení — v cloudu;
- Docker kontejnery jsou opět určeny pro něco jiného, podle mého názoru se v nich moc pohodlně neprototypuje s tím softwarem, který ještě není zabalen do samostatných kontejnerů.
Zvolený přístup se mi líbí svojí jednoduchostí a nízkou překážkou pro vstup. V samotných kontejnerech lze aplikovat specifické přístupy projektů: instalovat a konfigurovat vše ručně, nebo využít automatizaci (Puppet, Ansible apod.), dokonce i rozvíjet . Používám LXD kontejnery také pro spuštění specifického softwaru, který buď vyžaduje instalaci velkého množství závislostí, nebo jinou verzi operačního systému — v tomto případě mohu vytvořit kontejner s požadovanou verzí OS, například $ lxc launch images:ubuntu/16.04 dev16.
Je důležité mít na paměti, že z pohledu izolace má kontejnorizace větší útočnou plochu ve srovnání s virtualizací — hostitel a kontejner sdílejí jedno jádro, jehož zranitelnost může umožnit škodlivému softwaru uniknout z kontejneru. Pro experimenty s pochybným softwarem je lepší použít vhodnější izolační mechanismy.
Užitečné odkazy
- Obsáhlý článek na Habr
- , je důležité neplést LXD s LXC — to jsou různé, ale vzájemně propojené věci.
- — v tomto blogu je spousta užitečných praktických informací o LXD.
- — Microsoft pravidelně shromažďuje nové sestavení a poskytuje je se speciální licencí.
Zdroj: habr.com
