Porozmawialiśmy sobie o tym, jak w bardzo ogólnym ujęciu działają kontenery, ale platforma to nie tylko Docker Engine. Oczywiście jest on niezbędny, bo wszystko wybudowane jest dookoła niego, ale jest tam parę innych ciekawych rzeczy, np. Rejestr. Docker Registry, bo o nim mowa może występować w dwóch odmianach – Publiczny i Prywatny. Można go tendencyjnie przyrównać do bazy danych, ale to nuda. Pomyślmy o Docker Registry jako bibliotece podzielonej na szafki, które w kontekście Dockera będą repozytoriami, na których układane są książki, czyli nasze obrazy kontenerów Docker. Biblioteka może być publiczna i zawierać strefę publiczną z książkami dostępnymi dla każdego. Możesz wypożyczyć książkę, możesz też jakąś napisać i wysłać ją do biblioteki – będzie dostępna dla wszystkich, ale Ty będziesz autorem i tylko Ty będziesz ją mógł zmienić, a wszyscy będą mieli do niej dostęp. Biblioteka ta może mieć również strefy prywatne, gdzie tylko Ty lub wyznaczeni przez ciebie ludzie będą mieli dostęp, będą mogli czytać i pisać książki.
Analogicznie jest z publicznym Docker Registry, nazywa się on Docker Hub, w 2016 roku w jego bazie znajdowało się prawie pół miliona obrazów kontenerów i dokonano ponad 6 miliardów ich ściągnięć, mówimy tutaj o repozytoriach publicznych, a są dostępne również prywatne… Docker Hub dostępny jest z chmury, jeżeli istnieje potrzeba zainstalowania Rejestru lokalnie w swoim Datacenter taka możliwość również istnieje, nazywa się to w wersji komercyjnej (płatnej) Docker Trusted Registry lub wersja społeczności (darmowa) Docker Untrusted Registry. Różnią się one kilkoma szczegółami, ale najważniejszym jest fakt wsparcia przez Docker Inc. dla wersji komercyjnej, natomiast jego brak dla opensource. Nieważne, którą wersję wybierzecie, aby uruchomić obraz Dockera będziecie musieli użyć komendy `docker pull`. Oznacza ona ni mniej, ni więcej ściągniecie z rejestru z wybranego repozytorium obrazu kontenera na nasz Hardware Land i udostępnienie go do Docker Engine w celu uruchomienia. Można również tworząc swój własny kontener za pomocą komendy `docker push` wrzucić go do rejestru wybranego repozytorium. Zatem traktujcie Docker Registry jako bazę, w której znajdują się gotowe do użycia kontenery, zarówno Wasze, jak i przygotowane przez społeczność. Warto w tym miejscu nadmienić, że Docker Registry nie jest jedyną opcją rejestru dla kontenerów, w zasadzie to jest ich dostępnych całkiem sporo – GitLab Container Registry czy też Artifactory to tylko flagowe przykłady. To ważne, bo może już macie rejestr kontenerów w organizacji, w oprogramowaniu takim jak np. GitLab, które używane zazwyczaj jako repozytorium kodu, a pozwala również na uruchomienie rejestru. Warto się rozejrzeć niż powoływać kolejne być może nie do końca potrzebne byty. Bo mistrz Miyagi przypomina, że najlepszą drogą do sukcesu jest prostota architektury i wykorzystanie już działających, znanych nam narzędzi.
Mamy silnik, mamy rejestr warto by w tym miejscu, zanim przejdziemy dalej wspomnieć odrobinkę o mechanizmie Docker Content Trust. Jest to, ogólnie rzecz ujmując, mechanizm weryfikacji pochodzenia kontenerów i sprawdzania ich zgodności. Zanim potencjalny autor wyśle do rejestru Dockera, weźmy dla przykładu Docker Hub, stworzony przez siebie kontener, jest on podpisywany kluczem prywatnym twórcy. Kiedy potencjalny konsument obrazu po raz pierwszy wykonuje pull kontenera, nawiązywana jest relacja zaufania i sprawdzenie jest, czy kontener ma prawidłowy podpis i czy jest tym, za co się podaje. Można to przyrównać do modelu relacji zaufania uzyskiwanej przy połączeniu SSH z tą tylko różnicą, że inicjacja bezpiecznego połączenia następuje przez SSH i użyciu kluczy PKI. Mechanizm ten zabezpiecza nas przede wszystkim przed atakiem typu man-in-the-middle, gdzie kontener wymieniany jest w locie i zamiast dostać to, o co prosiliśmy, dostajemy bombę. Tak dla porządku poza Docker Content Trust platforma daje nam możliwość dostępu definiowanego w formie roli (RBAC) integrację z AD/LDAP i SSO.
Skoro możecie sobie wyobrazić jak działa już uruchamianie kontenerów przy pomocy Docker Engine, jak działa mechanizm Docker Content Trust, który zabezpiecza nas przed ściągnięciem bubla z Docker Registry to czas odpowiedzieć sobie na pytanie, co się dzieje, gdy mamy więcej niż jeden serwer fizyczny/wirtualny z silnikiem Dockera na pokładzie… To ten moment, gdy środowisko Dockerowe wychodzi z naszego laptopa i ma się stać produkcją! Cóż, trzeba by się zastanowić jak sprawić, aby można było odpalać kontenery nie tylko na jednym węźle, nie? Trzeba pomyśleć o klastrze, o zestawie serwerów, które zapewnią nam swoistą nadmiarowość, pozwolą na skalowanie zasobów i uruchomienie dziesiątek, setek czy też tysięcy kontenerów. Tutaj z pomocą przychodzi nam Docker Swarm. Jest to system, który można przyrównać do serwera VMware vCenter (bez GUI, tylko konsola) zarządzającego grupą serwerów ESX, czyli w naszym przypadku Docker Engine. Oczywiście różnic jest więcej niż cech wspólnych, ale chodzi tutaj tylko i wyłącznie o idee działania. Docker Swarm daje nam:
Wysokopoziomowa architektura rozwiązania widoczna jest na schemacie poniżej:
Jak widzicie mamy tutaj trzy rodzaje bytów. Pierwszy to Manager jest to węzeł klastra odpowiedzialny za przydzielenie zadań dla węzłów typu Worker, ogólne zarządzanie klastrem i orkiestrację zadań, udostępniają one również endpoint dla API klastra. Klaster wymaga min. 3 węzłów typu Master, gdzie może paść maksymalnie jeden, a klaster będzie wciąż działał, lub 5 i wtedy uzyskujemy odporność na awarię dwóch węzłów naraz. Awaria klastra sprawi, że nie będzie on zarządzalny, ale serwisy uruchomione na nim będą dalej działać. Drugim typem węzłów są nody typu Worker, są to również instancję Docker Engine, których główną rolą jest uruchamianie kontenerów. Węzły typu Worker potrzebują minimum jednego noda typu Manager, aby działać. Kolejnym bytem jest Service czy nasz polski serwis… umożliwia on uruchamianie kontenerów na klastrze Swarm. Typ serwisu określamy sami, może to być dla przykładu web Frontend, baza danych itd. Definicja serwisu może zawierać informacje, jaki obraz kontenera ma być użyty, jak również i komendy, jakie mają zostać użyte wewnątrz już działającego klastra, możemy wybierać z następujących elementów i akcji:
Reasumując Docker Swarm jest trybem działania, w którym może działać wiele Docker Engine umożliwiającym powoływanie serwisów złożonych z replik, czyli zadań (tasków) reprezentowanych przez kontenery. Warto tutaj zauważyć, że kontener jest równy jednemu zadaniu. To bardzo ważna rzecz! Aktualnie przyzwyczajeni jesteśmy, że serwery świadczą więcej niż jedno zadanie – np. serwer www i baza danych na jednej VM/hoście fizycznym. Docker odchodzi od tego modelu… nie jest to zakazane, ale generalnie się tak nie robi. Jeden kontener, jedno zadanie. Oczywiście na jednym kontenerze może być obsługiwanych wielu użytkowników, ale z reguły jeden kontener realizuje tylko jedną funkcję.
Wydaje mi się, że istotną rzeczą w tym miejscu jest wspomnienie o tym, że Docker Swarm to nie jedyna opcja jako narzędzie do klastrowania i orkiestracji. Jesienią 2017 roku podczas DockerCon ogłoszono, że Docker Inc. będzie również oficjalnie wspierał dodatkowo, obok Swarma rozwiązanie nazywane Kubernetes… ale to już temat na zupełnie inną opowieść. Dla porządku nadmienię, że istnieją poza Swarmem i Kubernetesem jeszcze inne silniki do orkiestracji i klastrowania kontenerów takie jak np. Mesosphere czy też CoreOS Fleet. Skupmy się jednak na Docker Swarm, gdyż jest on dostępny od razu, w paczce wraz z Docker Engine – nic nie trzeba odinstalowywać, tylko uruchomić i zacząć używać. Na początek to i tak dużo, a z biegiem czasu można swobodnie zmienić orkiestrator lub skorzystać z PaaS takich jak Google Container Engine czy Amazon Elastic Container Service.
Artykuł został opublikowany na łamach IT Professional.