Software Development

Docker dla programistów, co to jest?

Styczeń 19, 2016 5
Podziel się:

Docker to narzędzie szturmem zdobywające popularność na serwerach, szczególnie w środowiskach chmurowych, gdzie z powodzeniem wspiera lub czasem nawet zastępuje klasyczną wirtualizację oferowaną przez rozwiązania typu VMware lub XEN.

Zdecydowaną przewagą Docker’a nad wirtualizacją jest możliwość uruchomienia aplikacji w wydzielonym kontenerze, ale bez konieczności emulowania całej warstwy sprzętowej i systemu operacyjnego. Docker uruchamia w kontenerze tylko i wyłącznie proces(y) aplikacji i nic więcej. Efektem jest większa efektywność wykorzystania zasobów sprzętowych, co przy rozproszonych aplikacjach instalowanych do tej pory na kilkunastu bądź kilkudziesięciu wirtualnych maszynach przynosi konkretne oszczędności.

Ale czym tak naprawdę jest Docker i w jaki sposób mogą go wykorzystać programiści?

Jak już wspomniałem wcześniej – Docker zastępuje wirtualizację przez stosowanie czegoś co nazywa się konteneryzacją. 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. Każdy kontener posiada wydzielony obszar pamięci, odrębny interface sieciowy z własnym prywatnym adresem IP oraz wydzielony obszar na dysku, na którym znajduje się zainstalowany obraz systemu operacyjnego i wszystkich zależności / bibliotek potrzebnych do działania aplikacji.

Jeśli przykładowo uruchamiamy aplikację Java na Apache Tomcat, to obraz kontenera zawiera zainstalowany system operacyjny (pewnie jakieś Ubuntu lub CentOS), zainstalowaną maszynę Java oraz Apache Tomcat i paczkę WAR z aplikacją. Jedynym uruchomionym procesem staje się wtedy wirtualna maszyna Javy z Tomcat’em i naszą aplikacją.

Kontenery Docker’a działają niezależnie od siebie i do chwili, w której świadomie wskażemy zależność pomiędzy nimi, nic o sobie nie wiedzą. 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.

Więc gdzie tu korzyści dla programistów ?

Ja widzę 2 ogromne korzyści: pierwszą jest łatwość tworzenia środowisk deweloperskich, drugą równie ważną jest uproszczenie procesów dostarczania gotowych aplikacji na docelowe środowiska.

Zmorą każdego programisty jest tworzenie środowiska deweloperskiego na potrzeby każdego kolejnego projektu. Wiadomo, że każdy projekt będzie działać na innej bazie danych, innym kontenerze aplikacji z inną listą dodatkowych usług, które do czasu pojawienia się narzędzi typu Vagrant instalowane były bezpośrednio na laptopie programisty. Utrzymanie kilku środowisk dla wielu projektów bywało niemożliwe. Vagrant w pewien sposób rozwiązuje ten problem przez tworzenie wirtualnego środowiska instalowanego za pomocą odpowiednich skryptów, ale to rozwiązanie nie rozwiązuje wszystkich problemów: nadal sami musimy napisać sobie skrypty instalujące wszystkie zależności, no i potrzebny jest mocny sprzęt żeby udźwignął pełne środowisko w trybie wirtualizacji. Kilka takich środowisk na laptopie może też skutecznie zająć całą przestrzeń dyskową.

Z pomocą przychodzi Docker, który pozwala zbudować środowisko deweloperskie bez wirtualizacji i przy odrobinie szczęścia bez większego wysiłku związanego z instalacją oprogramowania. Docker pozwala wykorzystywać gotowe obrazy zainstalowanych systemów, aplikacji i baz danych, które zostały wczeniej przygotowane i umieszczone w publicznym rejestrze. Rejestr jest dostępny za darmo i zawiera obrazy oficjalnie budowane przez opiekunów / twórców konkretnych rozwiązań: https://hub.docker.com/explore/. Dzięki temu, jeśli chcemy używać PostgreSQL, Redis czy RubyOnRails albo Wildfly, jest duża szansa na to, że gotowy obraz będziemy mogli pobrać z repozytorium i nie tracić czasu na jego przygotowanie. Jeśli jednak nie znajdziemy tego czego szukamy, to zawsze możemy zbudować własny obraz bazując na jednym z bardziej generycznych zawierających tylko zainstalowany system operacyjny (Ubuntu, Fedora, itp…) lub zainstalowane środowisko uruchomieniowe (Java, Python czy ASP.NET).

Widać więc wyraźnie, że środowisko deweloperskie można zbudować z gotowych obrazów zawierających zainstalowane kontenery i usługi. Mechanizm budowana obrazów kontenerów możemy wykorzystać w drugą stronę i dostarczać nasze konkretne aplikacje w postaci obrazów. Bez względu na technologię wykorzystaną w aplikacji, obraz kontenera będzie dostarczany w identyczny sposób co upraszcza procedury instalacyjne. W zasadzie każda instalacja może ograniczyć się do pobrania wskazanych obrazów na środowisko docelowe i ich uruchomienie. Administratorzy środowisk nie muszą być nawet do końca świadomi co uruchamiają, a przy odrobinie szczęścia sam proces dostarczania aplikacji może zostać zautomatyzowany przez odpowiednie narzędzia.

Na koniec najważniejsze: Docker działa tylko na jądrze Linux i pozwala uruchamiać tylko aplikacje przeznaczone dla Linux’a, ale dla wszystkich użytkowników Windows i Mac jest przygotowane narzędzie Docker Toolbox, które pozwala zainstalować Docker’a w minimalnej maszynie wirtualnej pod kontrolą VirtualBox’a.

Jeśli ktoś chciałby spróbować Docker’a bez instalacji, jest taka możliwość: wszyscy najważniejsi dostawcy chmury publicznej oferują już gotowe maszyny wirtualne z preinstalowanym Docker’em. Amazon AWS, Azure i DigitalOcean są tego najlepszym przykładem.

Tyle słowem wstępu o Dockerze, mam nadzieję że tym wpisem otworzę pewien cykl wprowadzający w arkana konteneryzacji. W następnych wpisach postaram się opisać instalacje, tworzenie obrazów Docker’a oraz budowanie środowiska deweloperskiego.

4.9 / 5
Wojciech Paciorkowski
Autor: Wojciech Paciorkowski
Programista Java, architekt EAI, zwolennik open-source i współdzielenia się wiedzą. Fanatycznie zgłębia nowe technologie i dzieli się wrażeniami z kolegami. Prywatnie mąż, ojciec i fotograf amator. Aparat zarasta kurzem, rower gnije w garażu. Jedynie gitara czasem dostaje w kość. Relaksują go dobre książki, filmy i seriale zwłaszcza o tematyce sci-fi.

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

komentarze(5)

avatar'
Robert
8 kwietnia 2016 Odpowiedz

Świetny artykuł. Gratuluję.

avatar'
Marcif
14 kwietnia 2016 Odpowiedz

Po zamknięciu kontenera zniknęła mi zawartość bazy mysql. Czy to normalne zachowanie?

    avatar'
    Wojtek
    19 kwietnia 2016 Odpowiedz

    Jeśli katalog z danymi mysql nie był zamontowany w zewnętrznym kontenerze lub katalogu, to jest to normalne zachowanie. https://docs.docker.com/engine/userguide/containers/dockervolumes/

avatar'
Tomasz
29 marca 2019 Odpowiedz

Przystępny i sporo wyjaśniający artykuł dla mnie, jako osoby rozpoczynającej zgłębianie zagadnień wirtualizacji i konteneryzacji.

avatar'
Dawid
31 maja 2019 Odpowiedz

Szkoda tylko, że na Windowsie proces konteneryzacji jest utrudniony przez VirtualBoxa i wszystko i tak jest emulowane. Czekam na Dockera pod Windowsem a tymczasem na Dockerze Toolbox pracuję nad pracą inżynierską z zakresu sieci neuronowych i technologii TensorFlow, polecam narzędzie i pozdrawiam użytkowników .

Zostaw komentarz