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;
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ů):
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.