VM czy Docker?

Jak zrozumieć, że potrzebujesz Dockera, a nie VM? Musisz określić, co dokładnie chcesz wyizolować. Jeśli chcesz wyizolować system z gwarantowanymi zasobami i wirtualnym sprzętem, wybór powinien paść na maszynę wirtualną. Jeśli potrzebujesz odizolować działające aplikacje jako oddzielne procesy systemowe, będziesz potrzebować Dockera.

Jaka jest więc różnica między kontenerami Docker a maszynami wirtualnymi?

Maszyna wirtualna (VM) to wirtualny komputer ze wszystkimi urządzeniami wirtualnymi i wirtualnym dyskiem twardym, na którym instalowany jest nowy niezależny system operacyjny wraz ze sterownikami urządzeń wirtualnych, zarządzaniem pamięcią i innymi komponentami. Oznacza to, że otrzymujemy abstrakcję fizycznego sprzętu, która pozwala na uruchomienie wielu komputerów wirtualnych na jednym komputerze.
Zainstalowana maszyna wirtualna może zajmować miejsce na dysku na różne sposoby:

  • stałe miejsce na dysku twardym, które umożliwia szybszy dostęp do wirtualnego dysku twardego i pozwala uniknąć fragmentacji plików;
  • dynamiczna alokacja pamięci. Podczas instalowania dodatkowych aplikacji pamięć będzie dla nich przydzielana dynamicznie, aż do osiągnięcia maksymalnej przydzielonej jej ilości.

Im więcej maszyn wirtualnych na serwerze, tym więcej miejsca zajmują, a także wymagają stałego wsparcia środowiska wymaganego do działania Twojej aplikacji.

Doker to oprogramowanie do budowania aplikacji w oparciu o kontenery. Kontenery i maszyny wirtualne mają podobne zalety, ale działają inaczej. Kontenery zajmują mniej miejsca, bo nadużywać więcej współdzielonych zasobów systemu hosta niż VM, ponieważ w przeciwieństwie do VM zapewnia wirtualizację na poziomie systemu operacyjnego, a nie sprzętu. Takie podejście zapewnia mniejsze zużycie pamięci, szybsze wdrażanie i łatwiejsze skalowanie.

Kontener zapewnia wydajniejszy mechanizm enkapsulacji aplikacji, udostępniając niezbędne interfejsy do systemu hosta. Ta funkcja umożliwia kontenerom współdzielenie rdzenia systemu, gdzie każdy z kontenerów działa jako oddzielny proces głównego systemu operacyjnego, który ma własny zestaw obszarów pamięci (własną wirtualną przestrzeń adresową). Ponieważ wirtualna przestrzeń adresowa każdego kontenera jest jego własną, dane należące do różnych obszarów pamięci nie mogą być zmieniane.
Natywnym systemem operacyjnym dla Dockera jest Linux (Docker może być również używany w systemach Windows i MacOS), wykorzystuje swoje główne zalety, które pozwalają mu na zorganizowanie podzielonego jądra. Uruchomienie kontenerów Docker w systemie Windows odbędzie się wewnątrz maszyny wirtualnej z systemem Linux. kontenery współdzielą system operacyjny systemu hosta, a głównym systemem operacyjnym dla nich jest Linux.

Kontener – jak to działa?

pojemnik jest abstrakcją na poziomie aplikacji, która łączy kod i zależności. Kontenery są zawsze tworzone z obrazów, dodając zapisywalną warstwę wierzchnią i inicjując różne parametry. Ponieważ kontener ma własną warstwę zapisu i wszystkie zmiany są przechowywane w tej warstwie, wiele kontenerów może dzielić dostęp do tego samego obrazu wzorcowego.

Każdy kontener można skonfigurować za pomocą pliku w projekcie docker-compose zawartym w głównym rozwiązaniu, docker-compose.yml. Można tam ustawić różne parametry takie jak nazwa kontenera, porty, identyfikatory, limity zasobów, zależności pomiędzy innymi kontenerami. Jeśli nie określisz nazwy kontenera w ustawieniach, to Docker za każdym razem utworzy nowy kontener, losowo przypisując mu nazwę.

Kiedy kontener jest uruchamiany z obrazu, Docker montuje system plików do odczytu/zapisu na dowolnej warstwie poniżej. To tutaj będą uruchamiane wszystkie procesy, które chcemy uruchomić w naszym kontenerze Docker.

Kiedy Docker po raz pierwszy uruchamia kontener, początkowa warstwa odczytu/zapisu jest pusta. Kiedy pojawiają się zmiany, są one stosowane do tej warstwy; na przykład, jeśli chcesz zmodyfikować plik, plik ten zostanie skopiowany z warstwy tylko do odczytu poniżej do warstwy do odczytu i zapisu.
Wersja pliku tylko do odczytu nadal będzie istnieć, ale jest teraz ukryta pod kopią. Woluminy służą do przechowywania danych, niezależnie od cyklu życia kontenera. Woluminy są inicjowane podczas tworzenia kontenera.

W jaki sposób obraz jest powiązany z kontenerem?

Obraz - główny element każdego pojemnika. Obraz jest tworzony z pliku Dockerfile dodanego do projektu i jest zbiorem systemów plików (warstw) ułożonych jeden na drugim i zgrupowanych razem, dostępnych tylko do odczytu; maksymalna liczba warstw to 127.

Sercem każdego obrazu jest obraz bazowy, który jest określony przez polecenie FROM — punkt wejścia podczas generowania obrazu Dockerfile. Każda warstwa jest warstwą tylko do odczytu i jest reprezentowana przez pojedyncze polecenie modyfikujące system plików, zapisane w pliku Dockerfile.
Aby połączyć te warstwy w jeden obraz, Docker wykorzystuje zaawansowany wielowarstwowy system plików Union (AuFS jest zbudowany na bazie UnionFS), umożliwiając przezroczyste nakładanie się różnych plików i katalogów z różnych warstw plików, tworząc powiązany system plików.

Warstwy zawierają metadane, które umożliwiają przechowywanie powiązanych informacji o każdej warstwie w czasie wykonywania i kompilacji. Każda warstwa zawiera łącze do następnej warstwy, jeśli warstwa nie ma łącza, jest to najwyższa warstwa na obrazie.

Dockerfile może zawierać polecenia takie jak:

  • OD - punkt wejścia w tworzenie obrazu;
  • KONSERWATOR - imię i nazwisko właściciela obrazu;
  • RUN - wykonanie polecenia podczas składania obrazu;
  • ADD – kopiowanie pliku hosta do nowego obrazu, jeśli podasz plik URL, Docker pobierze go do wskazanego katalogu;
  • ENV - zmienne środowiskowe;
  • CMD - rozpoczyna tworzenie nowego kontenera na podstawie obrazu;
  • ENTRYPOINT - Polecenie jest wykonywane po uruchomieniu kontenera.
  • WORKDIR to katalog roboczy do wykonywania polecenia CMD.
  • USER — ustawia identyfikator UID kontenera utworzonego z obrazu.
  • VOLUME — montuje katalog hosta w kontenerze.
  • EXPOSE to zestaw portów nasłuchiwanych w kontenerze.

Jak działa UnionFS?

ZwiązekFS — system plików stosu usług (FS) dla systemów Linux i FreeBSD. Ten FS implementuje mechanizm kopiowania przy zapisie (Copy-On-Write, COW). Jednostką roboczą UnionFS jest warstwa, każdą warstwę należy traktować jako osobny pełnoprawny system plików z hierarchią katalogów od samego katalogu głównego. UnionFS tworzy montowanie unii dla innych systemów plików i umożliwia przejrzyste łączenie plików i katalogów z różnych systemów plików (zwanych gałęziami) w jeden połączony system plików, w sposób przejrzysty dla użytkownika.

Zawartość katalogów z tymi samymi ścieżkami zostanie wyświetlona razem w jednym połączonym katalogu (w tej samej przestrzeni nazw) wynikowego systemu plików.

UnionFS łączy warstwy w oparciu o następujące zasady:

  • jedna z warstw staje się warstwą najwyższego poziomu, druga i kolejne warstwy stają się warstwami niższego poziomu;
  • obiekty warstwy są dostępne dla użytkownika „od góry do dołu”, tj. jeśli żądany obiekt znajduje się w „górnej” warstwie, jest zwracany niezależnie od obecności obiektu o tej samej nazwie w „dolnej” warstwie; w przeciwnym razie zwracany jest obiekt warstwy „dolnej”; jeśli żądanego obiektu nie ma ani tam, ani tam, zwracany jest błąd „Brak takiego pliku lub katalogu”;
  • warstwa robocza jest warstwą „górną”, to znaczy wszystkie działania użytkownika mające na celu zmianę danych są odzwierciedlane tylko na warstwie najwyższego poziomu, bez wpływu na zawartość warstw niższego poziomu.

Docker to najpopularniejsza technologia wykorzystania kontenerów w pracy z aplikacjami. Stał się standardem w tej dziedzinie, opierając się na cgroups i przestrzeniach nazw dostarczonych przez jądro Linuksa.

Docker pozwala nam szybko wdrażać aplikacje i optymalnie wykorzystywać system plików, dzieląc jądro systemu operacyjnego między wszystkie kontenery, działające jako osobne procesy systemu operacyjnego.

Źródło: www.habr.com

Dodaj komentarz