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