Mam nadzieję, że wiesz co to wirtualizacja, bo będę w przykładach dużo porównywał do maszyn wirtualnych. W wielkim skrócie maszyna wirtualna umożliwia Ci odpalenie wirtualnego systemu na Twoim systemie. Wygląda to tak, że masz np windowsa, a w aplikacji np virtualbox masz ubuntu. Nie chce mi się i nie jestem specjalistą od wskazywania jak działa samo dzielenie zasobów procesora, ramu itd pomiędzy systemem gospodarza a maszyna wirtualną, jak jesteś ciekawy to poczytaj o wirtualizacji i maszynach wirtualnych na necie.
0. Odpowiadając na pytanie docker to taka maszyna wirtualna tylko po pierwsze o wiele lżejsza - więcej wykorzystuje zasobów gospodarza a mniej tworzy swoich w porównaniu do wirutalnej maszyny:
Objawia się to m.in. tym, że domyślny use case dockera to system, z którym rozmawiasz przez konsole. A wirtualna maszyna ma pulpit i wszystkie te bajery.
Podsumowując docker pozwala stworzyć wirtualne środowisko małym kosztem. Po co coś takiego? Wyobraź sobie, że tworzysz jakąś dużą aplikację i najpierw pracujesz sam. Wszystko jest ok. Potem przychodzi ktoś drugi do pomocy i za pierwszym razem głowicie się, czemu u Ciebie coś działa a u niego nie. Po tysiącach przekleństw i pytań przeglądniętych na stacku przypominasz sobie, że 2 miesiące temu jak zaczynałes prace to zainstalowałeś i skonfigurowałeś taki jeden program. Instalujecie go więc u Twojego kolegi, ale dalej nie działa. Po kolejnych przekleństwach stwierdzacie, że może to przez to, że Ty pracujesz na windowsie7 a on na 10-tce. Kolega więc na swojej 10-tce stawia wirtualnego windowsa 7. Konfigurujecie wszystko od nowa. Wreszcie udaje się. Możecie teraz pracować razem. Za tydzień okazuje się, że potrzebujecie jeszcze więcej programistów. Przychodzą kolejni. Wiadomo już mniej więcej jak konfigurować środowisko, żeby wszystko działało, ale zajmuje to sporo czasu. Kolejnym krokiem jest wprowadzenie odpowiednich konfiguracji na maszynie wirtualnej i zapisanie jej stanu, tak żeby każda kolejna osoba miała już gotową konfigurację.
Generalnie w tym miejscu osiągneliśmy już całkiem dobry punkt, każda kolejna osoba przychodzi i dostaje gotową konfiguracje. Ale wyobraź sobie teraz, że trzeba przetestować Twoją aplikację na kilku różnych środowiskach. Np chcesz mieć pewność, że jak podmienisz jedną bibliotekę na starszą to wszystko będzie działać, albo jak zmienisz system. Stawianie wielu wirutalnych maszyn jest długie i wymagające sprzętowo i tu przychodzi z pomocą docker. Czyli taka mini wirtualna maszyna.
Docker operuje na kilku pojęciach, m.in. obraz i kontener. Obraz to taki jakby zapisany stan środowiska, za pomocą którego można odpalać wiele środowisk, które po odpaleniu staną się kontenerami i wszelkie zmiany na nich nie będą wpływać na źródło czyli obraz. Jest to właśnie to o czym mówiłem wcześniej. Gotowa wirtualna maszyna do sklonowania, tylko o wiele prościej i szybciej. Docker jest zrobiony właśnie pod to, żeby często stawiać oddzielne kontenery ze zbudowanych obrazów i jest to bardzo szybkie. Przez to wcześniejsza zabawa na kontenerze nie wpłynie na działanie późniejszej, bo jak chcesz zrobić coś innego to stawiasz nowy kontener.
Wygląda to tak, że piszesz sobie wymagania w dockerfile'u. Coś w stylu: system ubuntu 16.04, zainstalowane takie pakiety itd. Z tego dockerfile'a docker zbuduje Ci obraz, dzięki któremu masz pewność, że kontener z niego wygenerowany zawsze będzie taki sam. Przerzucanie takich obrazów jest o tyle ułatwione, że wystarczy komuś podesłać dockerfile (najczęściej kilka linijek tekstu), a on sobie już sam zbuduje obraz u siebie i odpali kontener. Kolosalna różnica w porównaniu do przenoszenia wielu GB całej wirtualnej maszyny.
1. Jeśli robisz wszystko lokalnie samemu to nie ma dużego sensu zabawa w dockery. Zalety jakie daje docker web developerce:
-pewność, że przy pracy na wielu komputerach z wieloma osobami zawsze będzie działać czyli taka odporność na różnice środowiskowe
-izolacja - na dockerze jawnie ustawiasz które porty pozwalasz itd, jeśli np ktoś Ci zawirusuje serwer na dockerze przez apke to po pierwsze do niczego się nie dobierze, bo na dokerze nic nie ma poza aplikacją a po drugie niszczysz kontener, stawiasz od nowa z tego samego obrazu, i odpalasz apke; to tyle, w przypadku prywatnego komputera może być troszke gorzej przy zainfekowaniu serwera
-prędkość postawienia nowego środowiska, np pada sprzęt - postawienie apki na nowym w dockerze zajmie krocej niż stawianie wirtualnej maszyny
2. Niestety nic nie polece. Jeśli znasz angielski to znajdziesz multum różnych artykułów, blogów, filmików itd o dockerze. Po polsku nie szukałem to nie wiem.
3. Chyba już odpowiedziałem. Dodam np, że sprawdza się bardzo dobrze przy systemach rozproszonych, gdzie musimy mieć to samo środowisko w wielu miejscach. Widzałem też kilka tutoriali z wykorzystaniem dockera w hackowaniu. Po pierwsze jest bezpieczny, bo jak coś sobie ściągniesz niefajnego to usuwasz kontener i elo, a po drugie czasem potrzebujesz kali linuxa tylko po to, żeby jedną komende odpalić. Troche kiepsko byłoby stawiać sobie cały system tylko w tym celu :P. A docker zrobi to raz dwa.
4. Czytaj tutoriale i eksperymentuj, nie wiem co więcej mogę polecić.