Czy kontenery mogą być bardzo „lekkie”, a jednocześnie zapewnić pełną izolację, np. systemu plików czy środowiska sieciowego? Czy wdrażanie oprogramowanie w kontenerach faktycznie jest łatwiejsze niż uruchomienie pełnego środowiska? To typowe zagadnienie rozważane przed wyborem jednego z tych dwóch systemów wirtualizacji.

Projekt Docker początkowo korzystał z kodu Linux Containers (LXC). Z czasem jednak wybrano inne oprogramowanie – runC – cześniej znane jako libcontainer. Działa ono w tym samym systemie – jako tzw. host – co umożliwia współdzielenie wielu zasobów systemu operacyjnego.

Kontenery korzystają z części wspólnej systemu operacyjnego

runC wykorzystuje także system plików AuFS i zarządza komunikacją sieciową kontenerów. AuFS to warstwowy system plików, w którym część przeznaczona tylko do odczytu i część do zapisu mogą być ze sobą połączone. Dzięki temu część wspólna systemu operacyjnego zostaje oznaczona jako „tylko do odczytu” i może być używana przez wszystkie kontenery. Jednocześnie każdy z kontenerów otrzymuje swój obszar, w którym może zapisywać pliki.

Jako przykład rozważmy obraz kontenera o wielkości 2GB. W przypadku maszyn wirtualnych potrzebne byłyby 2GB pomnożone przez liczbę maszyn do utworzenia. W przypadku Dockera i AuFS, większość z tych 2GB mogłoby być współdzielone między wszystkimi kontenerami niezależnie od ich liczby. Do ich utworzenia potrzebna byłaby więc przestrzeń niewiele większa niż 2GB. Zakładając oczywiście, że wszystkie kontenery korzystałyby z tego samego obrazu systemu operacyjnego.

Kontenery to niższy poziom izolacji

Pełna maszyna wirtualna otrzymuje swój własny zestaw zasobów i tylko znikoma część jest współdzielona. Izolacja dokonywana jest na wyższym poziomie. Jest to jednak okupione większym narzutem i stosunkowo dużymi wymaganiami dotyczącymi zasobów. Tymczasem Docker charakteryzuje się mniejszą izolacją, ale kontenery są lżejsze ponieważ wymagają mniej zasobów. Dzięki temu można łatwo i szybko uruchamiać setki kontenerów. W przypadku maszyn wirtualnych nie da się tego zrobić bez solidnej infrastruktury IT. W pełni wirtualny systemy zwykle potrzebuje kilku minut na uruchomienie. Kontenery startują w ciągu kilku sekund, a nawet szybciej.

Każdy z tych opisanych wyżej typów wirtualizacji ma zalety i wady. Aby mieć pełną izolację i gwarancję zasobów, trzeba wybrać maszyny wirtualne. Jeśli potrzebna jest tylko izolacja procesów i uruchomienie dużej ich liczby na średnio wydajnej maszynie, rozsądnym wyborem jest Docker, a nie tworzenie znacznie „cięższych” maszyn wirtualnych.

Utworzenie środowiska produkcyjnego w oparciu o Dockera

Nawet jeśli korzysta się z takich narzędzi, jak Chef czy Puppet, zawsze konieczne jest aktualizowanie systemu operacyjnego i innych elementów, które zmieniają się, w zależności od środowiska czy maszyny, na której działają. Docker daje możliwość zapisania systemu operacyjnego w specjalnym pliku obrazu (wraz z takimi zasobami, jak dev, qa, prod). Można go łatwo przenieść na inną maszynę z Dockerem. Podobne operacje można wykonać z użyciem innych narzędzi, ale nie jest to już takie proste i szybkie.

Kontenery nadają się świetnie do przeprowadzania testów. Powiedzmy, że trzeba przeprowadzić tysiące testów, w których potrzebne będzie połączenie z bazą danych. Każdy test ma być przeprowadzany na świeżej kopii bazy danych i mieć możliwość zapisywania lub zmiany danych. W klasycznym podejściu po każdym teście należałoby zresetować bazę danych z użyciem odpowiedniego skryptu lub narzędzi takich jak Flyway. Takie operacje są bardzo czasochłonne i wymuszają przeprowadzanie testów szeregowo.

Z użyciem Dockera można utworzyć obraz bazy danych i dla każdego testu uruchomić jej oddzielną kopię, a wszystkie testy przeprowadzić równolegle. Każdy bowiem będzie korzystać z własnej migawki bazy danych. Ponieważ testy mogą być przeprowadzane równolegle na jednej maszynie, znacznie szybciej można je ukończyć. W maszynach wirtualnych byłoby to nieporównanie trudniejsze.

Aplikacje wdrażane w formie mikrousług

W porównaniu do maszyn wirtualnych Docker umożliwia nie tylko większe współdzielenie zasobów, ale jest też świetnym systemem do tworzenia paczek z oprogramowaniem. Stanowią one element mikrousług. Dzięki upakowaniu aplikacji w kontenerze odpada szereg problemów z zarządzaniem zmianami. Możliwe jest to dzięki systemowi plików AuFS i rejestrowi. W środowisku Docker nie występuje spadek wydajności aplikacji. Tak przygotowane aplikacje czy nawet złożone systemy można bardzo łatwo reprodukować.

W pierwszej kolejności zapisywany jest podstawowy obraz systemu operacyjnego. Zmiany, które w nim zachodzą, są następnie zatwierdzane przez Dockera. Tworzy on dodatkowy plik obrazu. Ten plik zawiera tylko zmiany, które zaszły w stosunku do podstawowego obrazu. Do uruchomienia środowiska z dodatkowego obrazu, potrzebny jest obraz podstawowy. Odbywa się to z wykorzystaniem warstwowego systemu plików, który nakłada na siebie obrazy (podstawowy znajduje się pod spodem). AuFS łączy różne obrazy i w ten sposób powstaje finalny obraz, który można uruchomić. Można dodawać kolejne obrazy (warstwy), a Docker będzie nadal zapisywać tylko zmiany.

Podziel się na:
  • Facebook
  • Google Bookmarks
  • LinkedIn