Opowiem o podejściu do organizacji lokalnych, izolowanych środowisk deweloperskich na mojej stacji roboczej. Podejście zostało opracowane pod wpływem następujących czynników:
- dla różnych języków potrzebne są różne IDE i zestawy narzędzi;
- w różnych projektach mogą być używane różne wersje zestawów narzędzi i bibliotek.
Podejście polega na prowadzeniu rozwój wewnątrz kontenerów LXD uruchomionych lokalnie na laptopie lub stacji roboczej z przekierowaniem wyjścia graficznego do hosta.
Konfiguracja na przykładzie Ubuntu 20.04.
Rozważania na temat wariantów i powodów zostały przedstawione na końcu artykułu.
1. Instalacja LXD
W Ubuntu 20.04 LXD nie jest już dostępny do instalacji jako pakiet deb, tylko przez snap:
$ snap install lxdPo instalacji należy wykonać inicjalizację:
$ lxd initJedynym parametrem, który zmieniam, jest storage backend — używam dir jako najprostszej opcji. Ponieważ nie używam migawek ani kopii, ostrzeżenia w mnie nie przerażają:
Podobnie, backend katalogu należy traktować jako ostateczną opcję.
Obsługuje wszystkie główne funkcje LXD, ale jest strasznie wolny i nieskuteczny, ponieważ nie może wykonywać
natychmiastowych kopii ani migawek, w związku z czym musi kopiować całą przestrzeń dyskową instancji za każdym razem.
2. Ustawianie profilu LXD
to zestawy parametrów stosowanych do kilku kontenerów. Dla moich potrzeb wystarczy mi jeden stworzony domyślnie profil default z następującymi zmianami:
$ lxc profile device add default X0 disk source=\/tmp\/.X11-unix\/X0 path=\/tmp\/.X11-unix\/X0— aby aplikacje w kontenerach mogły współpracować z hostowym serwerem X11;$ lxc profile set default environment.DISPLAY :0— aby zmienna środowiskowaDISPLAYw kontenerach była ustawiona poprawnie;$ lxc profile set default raw.idmap "both 1000 1000"— dla prawidłowego .
3. Tworzenie i konfiguracja kontenera
Tworzenie kontenera na podstawie obrazu images:ubuntu\/20.04:
$ lxc launch images:ubuntu\/20.04 dev1Preferuję obrazy z repozytorium, ponieważ mają mniej wstępnie zainstalowanego oprogramowania. Z tego powodu dodałem prefiks images: do nazwy obrazu. Utworzenie kontenera na podstawie obrazu z repozytorium Ubuntu można wykonać w następujący sposób: $ lxc launch ubuntu\/20.04 dev1 Dostęp do powłoki roota kontenera:.
$ lxc exec dev1 -- bash
Zainstaluję Firefox i VS Code (z repozytoriumzgodnie z instrukcją ):
$ 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 codeWłączę kontener dla przejrzystości
poweroffBonus! Zaskakująco łatwo jest przekazać GPU do kontenera, aby aplikacje uruchomione wewnątrz mogły korzystać z karty graficznej. Wymaga to:
- dodać urządzenie
$ lxc config device add dev1 mygpu gpu; - zainstalować w kontenerze sterowniki karty graficznej — te same, które są zainstalowane na hoście.
4. Użycie kontenera
Jeśli kontener jeszcze nie działa, należy go uruchomić:
lxc start dev1Uruchamianie VS Code jako nieuprzywilejowany użytkownik ubuntu:
lxc exec dev1 -- sudo --login --user ubuntu codeUruchamianie Firefox:
lxc exec dev1 -- sudo --login --user ubuntu firefoxOkna aplikacji wyświetlą się na hoście, ale będą wykonywane wewnątrz kontenera — podobnie jak przekazywanie grafiki za pomocą ssh.
Nie wyłączam ręcznie uruchomionych kontenerów, ponieważ nie widzę w tym sensu — ograniczam się do zamykania okien uruchomionych aplikacji.
5. Podsumowanie
Preferuję nie używać systemu operacyjnego hosta do programowania, ponieważ wymagałoby to instalacji narzędzi deweloperskich, wersji debugujących bibliotek, konfigurowania komponentów systemu w specyficzny sposób oraz innych manipulacji. Wszystko to może prowadzić do niespodziewanego zachowania pozostałego, niezwiązanego z programowaniem oprogramowania, a nawet całego systemu operacyjnego. Na przykład zmiany w konfiguracji OpenSSL mogą spowodować, że system operacyjny przestanie poprawnie się uruchamiać.
Wypróbowałem różne narzędzia do izolacji środowisk deweloperskich:
- maszyny wirtualne (KVM, VirtualBox itd.) — najbardziej oczywisty wybór, ale zużywają znacznie więcej zasobów, chociaż dla programowania pod Windows (jeśli host to Linux) nie ma innych opcji;
- narzędzia do programowania w chmurze uruchamiane na lokalnej maszynie (Cloud9 w kontenerze lub maszynie wirtualnej, Eclipse Che itd.) — nie są one projektowane do takiego trybu pracy, wymagają dodatkowej konfiguracji i obsługi, najlepiej używać ich zgodnie z przeznaczeniem — w chmurze;
- Kontenery Docker znowu są przeznaczone do innych celów; moim zdaniem nie są one zbyt wygodne do szybkiego prototypowania z użyciem oprogramowania, które nie zostało jeszcze spakowane w osobne kontenery.
Wybrana metoda podoba mi się ze względu na swoją prostotę i niski próg wejścia. W samych kontenerach można stosować specyficzne dla projektów podejścia: instalować i konfigurować wszystko ręcznie lub stosować automatyzację (Puppet, Ansible itp.), a nawet rozwijać Używam kontenerów LXD również do uruchamiania specyficznego oprogramowania, które wymaga zainstalowania dużej liczby zależności lub innej wersji systemu operacyjnego — w takim przypadku można stworzyć kontener z wymaganą wersją systemu operacyjnego, na przykład $ lxc launch images:ubuntu/16.04 dev16.
Ważne jest, aby pamiętać, że pod względem izolacji konteneryzacja ma większą powierzchnię ataku w porównaniu do wirtualizacji — host i kontener dzielą jedno jądro, a jego podatność może pozwolić złośliwemu oprogramowaniu na ucieczkę z kontenera. Do eksperymentów z wątpliwym oprogramowaniem lepiej używać bardziej odpowiednich mechanizmów izolacji.
Przydatne linki
- Zwięzły artykuł na Habrze
- , ważne jest, aby nie mylić LXD z LXC — to różne, ale powiązane rzeczy.
- — ten blog zawiera mnóstwo przydatnych informacji praktycznych na temat LXD.
- — Microsoft okresowo przygotowuje nowe wydania i udostępnia je z specjalną licencją.
Źródło: habr.com
