Docker - co to jest i do czego mi to potrzebne?

in #polish6 years ago (edited)

Cześć, witajcie!

Jak już wcześniej postanowiłem postaram się pisać coś w wolnym czasie. Dziś padło na Dockera - narzędzie dla mnie totalnie tajemnicze na początku rozwoju mojej kariery zawodowej. Jednak z czasem stał się on moim nieodłącznym towarzyszem pracy. Postaram się wyjaśnić dlaczego.

Czym jest Docker?

Najłatwiej powiedzieć, że jest on narzędziem do wirtualizacji ale byłoby to powiedziane zupełnie na wyrost. Jest to narzędzie, które pozwala zapakować aplikację do tzw. kontenera i wygodnie uruchomić jako proces niezależny od naszego systemu operacyjnego. Na pierwszy rzut oka można stwierdzić, że to samo można osiągnąć stawiając maszynę wirtualną w stylu VMWare i tam uruchamiać swoją aplikację. Różnica polega na tym, że Docker potrafi korzystać z jądra swojego hosta i mieć dostęp "na zewnątrz", a wirtualna maszyna wymaga dodatkowej konfiguracji i współdzielenia zasobów, co znacząco utrudnia proces tworzenia aplikacji. Oczywiście nie wszystkie systemy są tak otwarte by Docker mógł korzystać z ich dobrodziejstw (macOS w szczególności...), dlatego w niektórych przypadkach jest stosowana faktyczna wirtualizacja - bardziej jako środek konieczny aniżeli coś, co mogłoby ułatwić pracę.

Wszystko fajnie, ale co to jest ten kontener? 

Żeby odpowiedzieć na to pytanie trzeba poznać odpowiedź na pytanie: czym ogólnie jest konteneryzacja?
Konteneryzacja polega na tym, że umożliwia uruchomienie wskazanych procesów aplikacji w wydzielonych kontenerach, które z punktu widzenia aplikacji są odrębnymi instancjami środowiska uruchomieniowego.  Jeśli przykładowo chcemy dla naszej aplikacji uruchomić bazę danych, to jest taka możliwość i polega to na tym, że uruchamiamy kolejny kontener z bazą i tworzymy połączenie sieciowe pomiędzy kontenerami. 

W takim podejściu można zauważyć dwie podstawowe korzyści dla programisty. Pierwszą jest łatwość tworzenia środowisk deweloperskich i ich przenośność między maszynami z różnymi systemami operacyjnymi. Dla bardzo skomplikowanych projektów odwzorowanie środowiska produkcyjnego na maszynie lokalnej może być dla programisty drogą przez mękę. Dzięki kontenerom budujemy środowisko praktycznie jeden-do-jednego z tym docelowym. Druga korzyść odnosi się właśnie do tego produkcyjnego - dzięki uprzednio przygotowanym plikom definiującym zależności z aplikacji w kontenerze - w łatwy sposób dokonujemy deployu gotowej aplikacji na serwery docelowe. 

Nie było czegoś takiego wcześniej?

Deweloperzy w różnoraki sposób radzili sobie z prowadzeniem kilku projektów na swoich maszynach. Najczęściej było to - po prostu - instalowanie zależności aplikacji w swoim systemie operacyjnym. Z czasem jednak utrzymywanie kilku dużych projektów na komputerze dewelopera bywało niemożliwe. Co jeśli drugi projekt na tym samym komputerze "gryzie się" z zależnościami z tego pierwszego? Tutaj wkracza wirtualizacja, z najczęściej używanym przed paru laty narzędziem, Vagrantem. Vagrant rozwiązywał problem tworząc maszynę wirtualną per projekt bezpośrednio na komputerze programisty. Jednak nie rozwiązywał on wszystkich problemów. Owszem, mieliśmy do dyspozycji odizolowane środowisko dla naszej aplikacji, ale wszystkie skrypty konfigurujące oraz instalujące zależności musieliśmy napisać sami. Maszyny Vagranta zjadały również masę zasobów i potrzebowały dość mocnego sprzętu aby udźwignąć kilka różnych projektów. W konsekwencji posiadając kilka środowisk mogliśmy skutecznie zająć całą przestrzeń dyskową na naszej maszynie.

Docker natomiast potrafi zrobić to samo jednak bez wyżerania sporej części zasobów komputera. Możemy zbudować własny obraz bazując na dowolnej dystrybucji Linuxa lub skorzystać z dziesiątek tysięcy gotowych obrazów zawierających bazy danych, interpretery bądź gotowe aplikacje. Dostępne są one w rejestrze, zazwyczaj budowane i rozwijane przez twórców danego rozwiązania. Istnieje duża szansa, że nie będziemy musieli przygotowywać obrazu dla, na przykład, bazy danych MySQL albo interpretera PHP, bo takowe już istnieją.

To jak tego używasz w codziennej pracy?

Z opisu widać, że środowisko do pracy mogę złożyć z "klocków" zawierających poszczególne obrazy dla potrzebnych rozwiązań. Docker najlepiej i najwydajniej działa z dystrybucjami Linuxa ze względu na ich otwartość. Jeśli chodzi o resztę systemów - do uruchomienia natywnie Dockera na Windowsie wymagana jest wersja 10 Pro. Dla pozostałych wersji istnieje jeszcze narzędzie Docker Toolbox, jednak nie jestem pewien czy na chwilę obecną jest jeszcze wspierane. Uruchamia ono Dockera razem z minimalną maszyną wirtualną obsługiwaną przez VirtualBox. Co z macOS? Tam sprawa jest trochę bardziej skomplikowana - od ostatniej wersji systemu Docker jest dostępny w wersji native OSX ale z zeznań znajomych pracujących na komputerach z jabłuszkiem działa on różnie. Jest wiele sposobów jak przyśpieszyć pracę kontenerów na tych systemach, jednak nie o tym jest ten post.  W następnym poście postaram się pokazać przykłady użycia Dockera do ustawienia sobie  środowiska do nauki oraz pokażę podstawy docker-compose - narzędzia do definiowania i uruchamiania wielu kontenerów naraz. Postaram się żeby znalazł się tutaj już jutro.

Pozdrawiam,

A. 

Sort:  

Bez dockera to jak bez ręki :)

Jeśli mogę mieć sugestię - lepiej sprawdza się używanie polskich tagów z przedrostkiem pl-: https://steemweb.pl/categories. Tutaj sugerowałbym tagi #pl-artykuly oraz #pl-programowanie. Z jednej strony tekst trafi do większego grona osób polskojęzycznych, a z drugiej nie wyświetli się odbiorcom angielskojęzycznym, którzy raczej nie są zainteresowani tekstem po polsku.

Dzięki wielkie za podpowiedź, pisząc następnego posta zastosuję się do tych rad :)

Właściwie to tagi można edytować (oprócz pierwszego), więc nawet w tym poście można już to zrobić ;)

Zrobione :)

Co do OSX to nie jest to jeszcze natywna obsluga Dockera, ale jedynie natywnego hypervisora OSX (xhyve) w ktorym nadal odpala sie mini distro Linux-a jako maszyna wirtualna. Poki co jest to jedyne rozwiazanie, nie jest idealne ale dziala wystarczajaco dobrze, zeby dalo sie uzywac. ;-)

Dzięki za rozjaśnienie tematu, ja nie pracowałem na OSX ponad 1,5 roku. Wcześniej korzystało się tam z Toolboxa, przynajmniej tak robili kumple z (byłej) pracy :)

Zastanawiam się czy Docker czy LXC. Używałem tego drugiego i są różnice spore, ale nie wiem czy nie na plus - bo ostatecznie pracuje się jak na VMce (ale kontener), a nie na czymś tymczasowym na AUFS, które znika po restarcie serwera i w ogóle trzeba kombinować

Na Linuxie oba rozwiązania powinny działać podobnie. Ja jestem osobiście za Dockerem - dobre community, spory rejestr gotowych obrazów - dlatego gorąco go polecam :)

Congratulations @artsz! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Congratulations @artsz! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

You got your First payout

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!