Przygody z dockerem #1: Instalacja i podstawy
Każda osoba, która pracuje z wieloma projektami, które mogą wymagać pewnych subtelnych różnic w konfiguracji środowiska, na pewno spotkała się z potrzebą zarządzania zmian w jego ustawieniach. Instalacja wszystkich bibliotek i serwerów bezpośrednio na maszynie deweloperskiej to proszenie się o kłopoty. Wirtualizacja rozwiązuje ten problem, ale wprowadza inne.
W tym wpisie przybliżę alternatywne rozwiązanie, które wolne jest od problemów wirtualizacji - Docker. Przedstawię ideę oraz pokażę jak zainstalować te narzędzie na systemie Ubuntu. Na razie skupię się na samym wprowadzeniu teoretycznym, na praktykę przyjdzie czas. :)
Motywacja
Każdy programista, który pracuje nad wieloma nietrywialnymi projektami, boryka się z problemem utrzymania środowiska deweloperskiego dla każdego z tych przedsięwzięć.
Dla przykładu: Rozwijamy trzy projekty. Jeden to stary i prawie nierozwijalny kod spaghetti, który oczekuje plików w zadrutowanych lokalizacjach systemu operacyjnego. Do tego wymaga tylko PHP 5.2 i włączonej listy egzotycznych rozszerzeń. Drugi projekt, to świeżynka, który wymaga PHP w wersji PHP 5.6 i wymaga bazy PostgreSQL. Trzeci to stary dobry Drupal, do którego potrzebujemy bazy danych MySQL, serwera memcache i PHP w wersji 5.4.
Jak przełączać się między tymi projektami, bez żonglerki konfiguracji, instalowania wymaganych pakietów i pamiętania co tak naprawdę było potrzebne? Co jeżeli potrzebujemy środowisk tylko na moment, tylko wtedy gdy zaglądamy do starej aplikacji tylko w ramach walki ze zgłoszonymi błędy?
Na ratunek tutaj przychodzi wirtualizacja. Dzięki np. projektowi Virtualbox możemy utworzyć dedykowane maszyny dla każdego z tych projektów i cieszyć się z rozwiązania problemu. Każdy ma do wyboru kilka dobrych rozwiązań: Virtualbox, VMWare, użytkownicy iRzeczy mają do wyboru Parallels, a Microsoft dostarcza VirtualPC.
Niestety, te rozwiązania nie są idealne - przede wszystkim wydajność pozostawia dużo do życzenia, zwłaszcza w ramach operacji wejścia-wyjścia.
Co możemy z tym fantem zrobić? Jest kilka alternatyw, a w tym wpisie skupię się na Dockerze, szybkiej i lekkiemu rozwiązaniu dostarczającemu para-wirtualizację, w zasadzie szczątkowym narzutem na wydajności.
Docker - co to właściwie jest?
Docker do działania wykorzystuje mechanizm izolacji procesów, które dostarcza jądro linuksa (kontenery linuksowe - lxc) i dodaje do tego nisko poziomowego zestawu narzędzi, wysoko poziomowy interfejs, który w łatwy sposób pozwalaja na uruchamianie i dystrybucję aplikacji na wielu różnych maszynach.
Może to brzmieć trochę skomplikowanie, ale naprawdę nie jest :) Jak to w systemach linuksowych bywa, ten interfejs ma formę tekstową (CLI) - więc jeśli jesteś uzależniony od klikania myszką - to nie dla Ciebie :).
Ok, ale co czynni te narzędzie czyni te narzędzie innymi?
-
Wykorzystanie kontenerów linuksowych do uruchamiania procesów niezależnie od systemu bazowego (w piaskownicy). Nowsze wersje Dockera (> 0.9) mogą wykorzystywać inny mechanizm, ale nie spotkałem się z potrzebą badania tego tematu.
-
Kontenery - w uproszczeniu jest to mechanizm pakowania aplikacji wraz z jej zależnościami w jedną paczkę, którą można dystrybuować pomiędzy maszynami. Dla przykładu, konterer może zawierać system bazowy Ubuntu 14.04, stos LAMP oraz pliki niezbędne do uruchomienia naszego kochanego Drupala.
-
Wykorzystanie systemu plików działającym w trybie Copy-on-Write. Oznacza to, że kiedy tworzymy nowe kontenery, nie kopiujemy ich całej struktury, tylko to będzie modyfikowane. Docker dba, by dodatkowe miejsce na dysku było wykorzystane tylko wtedy, gdy cokolwiek jest modyfikowane. Dzięki temu tworzenie kontenera to kwestia sekund!
-
Kontenery można łączyć ze sobą - oznacza to że bazując na kontenerze Drupala, można utworzyć swój własny, który będzie zawierał to samo co oryginalny, wraz ze szczyptą własnych dodatków.
Ważną rzeczą jest fakt, że kontener nie jest odpowiednikiem maszyny wirtualnej, to tylko paczka z plikami, niezbędnymi do wykonania aplikacji. Kiedy uruchamiamy kontener, jądro linuksa separuje aplikację w nim wykonywaną - dzięki temu może ona działać z zupełnie innej konfiguracji, niż nasz system bazowy. Jedyny koszt, jaki ponosimy z tego tytułu jest tylko koszt samej uruchomionej aplikacji, i oczywiście miejsce na dysku które zajmują biblioteki. Co ważne, nie wykonujemy drugiego systemu operacyjnego i maszyny wirtualnej - jedynie samą aplikację i jej bezpośrednie zależności.
Oznacza to, że np. w przypadku Drupala, ponosimy koszt tylko z powodu uruchomionego serwera WWW i MySQL, które działają sobie w kontenerze. W każdym momencie kontener można zatrzymać, a jeśli go już nie potrzebujemy - usunąć. Te podejście ma również swoje ograniczenia - w kontenerach uruchamiamy stos bazujący na Linuksie. Do wykonywania aplikacji z innych systemów operacyjnych pozostaje nam pełna wirtualizacja.
W mojej dziennej praktyce, rozwiązanie takie wspaniale się sprawdza, i zastąpiło podejście Vagrant + Virtualbox. Problemy które miałem z tym tandemem odeszły do niechlubnej przeszłości - dla moich celów docker działa nieporównywalnie lepiej.
Instalacja
Zakładając że używamy jednej z popularnych dystrybucji Linuxa, instalacja jest banalnie prosta. Twórcy dockera dostarczają skrypt, który zajmie się konfiguracją oraz instalacją wszystkich zależności.
sudo -s apt-get install wget wget -qO- https://get.docker.com/ | sh
Wykonanie powyższych komend, doda repozytorium dockera do listy repozytoriów systemowych oraz ściągnie i zainstaluje najnowszą stabilną wersję dockera. Podstawowym interfejsem z lini poleceń jest polecenie docker. By móc wykonywać je bez konieczności posiadania uprawnień superużytkownika, musimy wykonywać następujące polecenie:
sudo usermod -aG docker [nazwa twojego uzytkownika]
I na tym kończy się proces instalacyjny.
Niestety, instalacja w systemach innych niż Linux nie jest taka przyjemna i wymaga dodatkowych kroków. Zainteresowanych odsyłam do dokumentacji projektu.
Co dalej
Ten wpis zawierał pobieżny opis idei, która stoi za dockerem. W następnych częściach tego cyklu pokażę jak wykorzystać te narzędzie w praktyce oraz inne aspekty związane z pracą z tą zabawką.
Źródła
- Strona projektu: http://docker.org
- AUFS: domyślny system plików dla Dockera: http://aufs.sourceforge.net/
z ambitnymi ludźmi i projektami