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

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 lxd

Po instalaci je třeba provést inicializaci:

$ lxd init

Jediný 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 dokumentaci 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

Profily v 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í DISPLAY v kontejnerech byla nastavena správně;
  • $ lxc profile set default raw.idmap "both 1000 1000" — pro správné mapování identifikátorů.

3. Vytvoření a nastavení kontejneru

Vytvoření kontejneru na základě obrazu images:ubuntu\/20.04:

$ lxc launch images:ubuntu\/20.04 dev1

Preferuji obrazy z repozitáře https://images.linuxcontainers.org, 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 -- 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

Zapnu kontejner pro přehlednost

poweroff

Bonus! 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 dev1

Spuštění VS Code jako neprivilegovaného uživatele ubuntu:

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

Spuštění Firefoxu:

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

Okna 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 infrastrukturu založenou na Dockeru. 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

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster