Multipass - Ubuntu server ca mediu de dev local
Un orchestrator de mașini virtuale, optimizat pe Ubuntu linux, portabil și simplu
Când dezvolți pagini web dinamice, sau servicii web: API, RPC, ai nevoie de un server. Fie Apache, Nginx sau un alt server local care să expună protocoalele de internet: IP, tcp și http. De asemenea în majoritatea cazurilor ai nevoie și de un server de baze de date cum este MySQL sau MSSQL.
Pentru a-ți face viața mai ușoară, ca programator, ideal e să ai un pachet care le oferă pe toate. Iar platforma care rulează acest pachet să-ți ofere opțiuni de configurare pentru porturi, resurse și versiuni. Este totodată important să fie disponibilă pe mai multe sisteme de operare, pentru că unii programatori preferă Windows alții preferă MacOS.
Nu o să înșir aici toate soluțiile disponibile însă acestea se înscriu în trei mari categorii: native, mașini virtuale și containere. Multipass se înscrie în categoria mașinilor virtuale, însă spre deosebire de Virtual Box, multipass este optimizat să ruleze Ubuntu linux. Eu îl văd ca un WSL care îl poți rula și pe Mac și pe Linux.
Alternativă la WSL pe Mac
Recunosc că sunt un fan al WSL. Linux este o platformă foarte bună pentru dezvoltare web, și devreme ce aplicațiile pe care le dezvolt rulează pe servere linux prefer să folosesc același sistem de operare și local.
Însă o mare parte din timp folosesc un laptop Macbook. Docker și brew sunt de foarte mare ajutor pe MacOS, însă nu toate proiectele sunt pe docker, iar unele dintre ele au instrucțiuni de setup doar pentru linux. În consecință este necesar să le fac setup cu brew. De asemenea configurările de sistem pentru unele proiecte și porturile configurate pe docker sunt aceleași, fiind necesară schimbarea porturilor dacă vrei să le rulezi în paralel.
Aici intervine necesitatea de simplificare - să nu fie necesar să schimb porturi dacă vreau să rulez același stack de docker de exemplu dar pe un runtime diferit (php8.1 sau php8.3), să por rula comenzi pe sistem - symfony local:proxy start
care pornește serverul de proxy deja inclus cu framework-ul Symfony, fără să instalez pachete lipsă din php sau să pot asigna mai multe domenii la un stack, fără să fie nevoie de un container de nginx dedicat de proxy.
Multipass suportă cloud-init, așadar poți instala toate pachetele necesare odată cu pornirea mașinii virtuale. Apoi fiecare mașină lansată de multipass primește un ip separat, ceea ce face mai ușoară asignarea unui domeniu prin /etc/hosts.
Interfață din linia de comandă este foarte intuitivă și suportă shared folders:
multipass launch --name ubuntu22
multipass mount $HOME/projects/myproject ubuntu22:/var/www/myproject
Sau comanda transfer
pentru a copia fișiere pe mașina virtuală. Folosind —cpus
sau —memory
putem specifica resursele alocate instanței:
multipass launch docker --name docker-dev --cpus 4 --memory 8G --disk 25G --bridged
Pentru a folosi un fișier cloud-init de inițializare:
multipass launch --name custom --cloud-init custom-cloud-init.yml
Pros/Cons față de VirtualBox și Docker
Multipass este gândit ca un utilitar pentru a lansa medii de dezvoltare, așadar nu beneficiază de unele caracteristici cum ar fi exportul/importul de mașini virtuale între sisteme diferite. Este posibil transferul unui VM între sisteme Ubuntu, folosind utilitarul snap.
Așadar este necesar ca pachetele și configurația pentru virtuală să fie specificate printr-un fișier de inițializare, pentru a avea portabilitate. Avantajul este că având un cloud-init poate fi folosit și pe infrastructura din cloud pentru a inițializa același mediu pentru aplicații.
De asemenea distribuțiile pe care le suportă multipass sunt bazate pe Ubuntu server, așadar pachetele pentru interfața desktop nu sunt instalate implicit. Pentru a te conecta la o sesiune desktop este necesar să instalezi aceste pachete și să te conectezi prin RDP (Microsoft Remote Desktop sau Remmina).
Spre deosebire de docker, utilitarul multipass nu cere drepturi de ”root” pentru a rula, și poate fi o soluție când pachetele sau aplicațiile pe care vrei să le rulezi provin din surse externe (untrusted). Dar dacă ai nevoie de un repository sau un hub pentru a stoca imagini, multipass nu este o alternativă.
Eu folosesc utilitarul împreună cu docker. Am un docker stack pe proiect însă acesta este configurat doar pentru serviciile externe: baza de date sau coada de mesaje. Pentru a rula proiectul, cum ar fi proxy sau instalarea dependințelor rulez câteva comenzi specifice. Multipass elimină diferența dintre WSL și MacOS făcând setup-ul la fel pe cele două sisteme de operare.
Referințe: