Izolacija razvojnih okruženja sa LXD kontejnerima

Govorit ću o pristupu organiziranju lokalnog izoliranog razvojnog okruženja na mojoj radnoj stanici. Pristup je razvijen pod uticajem sledećih faktora:

  • Različiti jezici zahtijevaju različite IDE i alate;
  • Različiti projekti mogu koristiti različite verzije alatnih lanaca i biblioteka.

Pristup je da se razvije unutar LXD kontejnera koji rade lokalno na laptopu ili radnoj stanici sa grafičkim izlazom preusmjerenim na host.

Primjer konfiguracije Ubuntu 20.04.

Razmišljanja o opcijama i razlozima data su na kraju članka.

1. LXD instalacija

В Ubuntu 20.04 LXD više nije dostupan za instalaciju kao deb paket, samo preko snap:

$ snap install lxd

Nakon instalacije potrebno je izvršiti inicijalizaciju:

$ lxd init

Jedini parametar koji mijenjam je storage bakend - Ja koristim dir kao najjednostavniji. S obzirom da ne koristim slike i kopije, upozorenja u dokumentaciju Oni me ne plase:

Slično, backend direktorija treba smatrati krajnjom opcijom.
Podržava sve glavne LXD karakteristike, ali je užasno spor i neefikasan jer ne može raditi
trenutne kopije ili snimke i tako mora svaki put kopirati cjelokupnu pohranu instance.

2. Podešavanje LXD profila

Profili u LXD — ovo su skupovi parametara koji se primjenjuju na nekoliko kontejnera. Za moje potrebe dovoljan mi je jedini profil kreiran po defaultu default sa sljedećim promjenama:

  • $ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 — tako da aplikacije u kontejnerima mogu komunicirati sa hostom X11 serverom;
  • $ lxc profile set default environment.DISPLAY :0 - tako da varijabla sredine DISPLAY pravilno instaliran u kontejnere;
  • $ lxc profile set default raw.idmap "both 1000 1000" - za ispravno mapiranje identifikatora.

3. Kreiranje i postavljanje kontejnera

Kreiranje kontejnera na osnovu slike images:ubuntu/20.04:

$ lxc launch images:ubuntu/20.04 dev1

Više volim slike iz spremišta https://images.linuxcontainers.org, jer imaju manje unaprijed instaliranog softvera. Iz tog razloga sam dodao prefiks images: na naziv slike. Kreiranje kontejnera na osnovu slike iz Ubuntu spremišta može se uraditi na sljedeći način: $ lxc launch ubuntu/20.04 dev1.

Pristup korijenskoj ljusci kontejnera:

$ lxc exec dev1 -- bash

Instalirat ću Firefox i VS Code (iz spremišta prema uputama):

$ 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

Uključiću kontejner radi jasnoće.

poweroff

Bonus! Prilično je lako baciti GPU u kontejner tako da aplikacije koje se pokreću u njemu mogu koristiti grafičku karticu. Za ovo vam je potrebno:

  • dodati uređaj $ lxc config device add dev1 mygpu gpu;
  • instalirajte drajvere video kartice u kontejner - iste one koji su instalirani na hostu.

4. Korištenje kontejnera

Ako kontejner još nije pokrenut, morate ga pokrenuti:

lxc start dev1

Pokretanje VS koda kao nekorijenski korisnik ubuntu:

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

Pokrenite Firefox:

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

Prozori aplikacije će biti prikazani na hostu, ali će se izvršavati unutar kontejnera - slično prosljeđivanju grafike pomoću ssh-a.

Ne gasim ručno pokrenute kontejnere, jer ne vidim puno smisla u tome - ograničavam se na zatvaranje prozora pokrenutih aplikacija.

5. Zaključak

Više volim da ne koristim host OS za razvoj, jer bi to zahtijevalo instaliranje razvojnih alata, otklanjanje grešaka verzija biblioteka, konfiguriranje sistemskih komponenti na specifičan način i druge manipulacije. Sve ovo može dovesti do neočekivanog ponašanja u drugom softveru koji nije za razvoj, ili čak u cijelom OS-u. Na primjer, promjene u OpenSSL konfiguraciji mogu uzrokovati da se OS prestane ispravno pokretati.

Probao sam različite alate za izolaciju razvojnih okruženja:

  • virtuelne mašine (KVM, VirtualBox itd.) su najočiglednija opcija, ali troše znatno više resursa, iako nema drugih opcija za razvoj pod Windowsom (ako je host Linux);
  • Alati za razvoj oblaka koji rade na lokalnoj mašini (Cloud9 u kontejneru ili virtuelnoj mašini, Eclipse Che, itd.) - nisu razvijeni za ovaj način rada, zahtevaju dodatnu konfiguraciju i održavanje, najbolje ih je koristiti za predviđenu upotrebu svrha - u oblaku;
  • Docker kontejneri su opet namijenjeni nečemu drugom, po mom mišljenju nisu baš zgodni za brzo prototipiranje pomoću softvera koji još nije upakovan u posebne kontejnere.

Odabrani pristup me impresionira svojom jednostavnošću i niskom barijerom za ulazak. U samim kontejnerima možete koristiti pristupe specifične za projekt: instalirati i konfigurirati sve ručno, ili koristiti automatizaciju (Puppet, Ansible, itd.), čak i implementirati Infrastruktura zasnovana na Dockeru. Također koristim LXD kontejnere za pokretanje specifičnog softvera koji zahtijeva instaliranje velikog broja ovisnosti ili drugu verziju OS-a - u ovom slučaju možete kreirati kontejner sa željenom verzijom OS-a, na primjer $ lxc launch images:ubuntu/16.04 dev16.

Važno je zapamtiti da u smislu izolacije, kontejnerizacija ima veću površinu napada u odnosu na virtuelizaciju - host i kontejner dijele jedno jezgro, ranjivost u kojoj može dozvoliti zlonamjernom softveru da pobjegne iz kontejnera. Kada eksperimentišete sa sumnjivim softverom, bolje je koristiti prikladnije mehanizme izolacije.

korisni linkovi

izvor: www.habr.com

Dodajte komentar