VM czy Docker?

Jak rozpoznać, że potrzebujesz Dockera, a nie VM? Musisz określić, co dokładnie chcesz izolować. Jeśli potrzebujesz wyizolować system z gwarantowanymi przypisanymi zasobami i wirtualnym sprzętem, powinieneś wybrać VM. Jeśli chcesz izolować działające aplikacje jako oddzielne procesy systemowe, potrzebujesz Dockera.

Czym różnią się kontenery Docker od VM?

Wirtualna maszyna (VM) to wirtualny komputer ze wszystkimi wirtualnymi urządzeniami i wirtualnym dyskiem twardym, na którym instalowany jest nowy, niezależny system operacyjny wraz z wirtualnymi sterownikami urządzeń, zarządzaniem pamięcią i innymi komponentami. Oznacza to, że otrzymujemy abstrakcję fizycznego sprzętu, która pozwala uruchamiać na jednym komputerze wiele wirtualnych komputerów.
Zainstalowana VM może zajmować różną ilość miejsca na dysku komputera:

  • stała ilość miejsca na dysku twardym, co pozwala na szybszy dostęp do wirtualnego dysku twardego i unika fragmentacji plików;
  • dynamiczne przydzielanie pamięci. Podczas instalacji dodatkowych aplikacji pamięć będzie dynamicznie przydzielana dla nich, aż osiągnie maksymalny wolumen, który jej przydzielono.

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

Docker to oprogramowanie do tworzenia aplikacji opartych na kontenerach. Kontenery i maszyn wirtualnych mają podobne zalety, ale działają inaczej. Kontenery zajmują mniej miejsca, ponieważ ponownie wykorzystują więcej wspólnych zasobów systemu gospodarza niż VM, ponieważ w przeciwieństwie do VM, zapewniają wirtualizację na poziomie systemu operacyjnego, a nie sprzętu. Takie podejście zapewnia mniejszy rozmiar zajmowanej pamięci, szybkie wdrażanie i łatwiejszą skalowalność.

Kontener zapewnia bardziej efektywny mechanizm enkapsulacji aplikacji, oferując niezbędne interfejsy systemu gospodarza. Ta możliwość pozwala kontenerom dzielić jądro systemu, gdzie każdy z kontenerów działa jako oddzielny proces głównego systemu operacyjnego, posiadający własny zestaw obszarów pamięci (własną przestrzeń adresową). Ponieważ przestrzeń adresowa każdego kontenera jest odrębna, dane należące do różnych obszarów pamięci nie mogą być zmieniane.
Natywnym systemem operacyjnym dla Dockera jest Linux (Docker można również używać na systemach Windows i MacOS), wykorzystuje on jego podstawowe zalety, które umożliwiają mu organizację podziału jądra. Uruchamianie kontenerów Docker w systemie Windows odbywa się wewnątrz maszyny wirtualnej z systemem Linux, ponieważ kontenery dzielą główny system operacyjny, a ich podstawowym systemem operacyjnym jest Linux.

Kontener — jak to działa?

Kontener — to abstrakcja na poziomie aplikacji, łącząca kod i zależności. Kontenery są zawsze tworzone z obrazów, dodając dostępny do zapisu górny warstwę i inicjalizując różne parametry. Ponieważ kontener ma własny warstwę do zapisu i wszystkie zmiany są w niej zachowywane, kilka kontenerów może współdzielić dostęp do tego samego podstawowego obrazu.

Każdy kontener można skonfigurować za pomocą pliku w projekcie docker-compose, włączonego w główne rozwiązanie — docker-compose.yml. Tam można określić różne parametry, takie jak nazwa kontenera, porty, identyfikatory, limity zasobów, zależności od innych kontenerów. Jeśli w ustawieniach nie określi się nazwy kontenera, Docker za każdym razem stworzy nowy kontener, nadając mu nazwę losowo.

Kiedy kontener jest uruchamiany z obrazu, Docker montuje system plików do odczytu i zapisu na dowolnych niższych warstwach. To tutaj będą wykonywane wszystkie procesy, które chcemy, aby nasz kontener Docker wykonywał.

Kiedy Docker po raz pierwszy uruchamia kontener, początkowa warstwa do odczytu i zapisu jest pusta. Kiedy zachodzą zmiany, są one stosowane do tej warstwy; na przykład, jeśli chcesz zmienić plik, ten plik zostanie skopiowany z warstwy tylko do odczytu niżej do warstwy do odczytu i zapisu.
Wersja pliku dostępna tylko do odczytu wciąż będzie istnieć, ale teraz jest ukryta pod kopią. Do przechowywania danych, niezależnie od cyklu życia kontenera, używane są wolumeny. Wolumeny są inicjowane przy tworzeniu kontenera.

Jak obraz jest powiązany z kontenerem?

Obraz — podstawowy element każdego kontenera. Obraz jest tworzony z Dockerfile dodanego do projektu i stanowi zbiór systemów plików (warstw) nałożonych na siebie i grupowanych razem, dostępnych tylko do odczytu; maksymalna liczba warstw wynosi 127.

U podstaw każdego obrazu leży obraz bazowy, który jest określony poleceniem FROM — punktem wyjścia podczas formowania obrazu w Dockerfile. Każda warstwa jest warstwą tylko do odczytu i jest reprezentowana przez jedno polecenie, które modyfikuje system plików zapisany w Dockerfile.
Aby połączyć te warstwy w jeden obraz, Docker używa zaawansowanego systemu plików Union Layering (AuFS zbudowanego na bazie UnionFS), pozwalając różnym plikom i katalogom z różnych warstw plików na przezroczyste nakładanie się, tworząc połączony system plików.

Warstwy zawierają metadane, które pozwalają na zapisanie dodatkowych informacji o każdej warstwie w trakcie działania i budowy. Każda warstwa zawiera odnośnik do następnej warstwy, a jeśli warstwa nie ma odniesienia, to jest najwyższą warstwą w obrazie.

Dockerfile może zawierać takie polecenia jak:

  • FROM — punkt wyjścia podczas formowania obrazu;
  • MAINTAINER — imię właściciela obrazu;
  • RUN — wykonanie polecenia w trakcie budowy obrazu;
  • ADD — kopiowanie pliku z hosta do nowego obrazu, jeśli podano URL pliku, Docker pobierze go do wskazanej katalogu;
  • ENV — zmienne środowiskowe;
  • CMD — uruchamia tworzenie nowego kontenera na podstawie obrazu;
  • ENTRYPOINT — polecenie jest wykonywane przy uruchamianiu kontenera.
  • WORKDIR — katalog roboczy do wykonania polecenia CMD.
  • USER — ustawia UID dla tworzonego kontenera na podstawie obrazu.
  • VOLUME — montuje katalog hosta w kontenerze.
  • EXPOSE — zestaw portów nasłuchujących w kontenerze.

Jak działa UnionFS?

UnionFS — systemowa, stosowalna w plikach i systemie plików Linux oraz FreeBSD. Ten system plików implementuje mechanizm kopiowania przy zapisie (Copy-On-Write, COW). Jednostką roboczą UnionFS jest warstwa, którą należy traktować jako osobny, pełnoprawny system plików z hierarchią katalogów od samego korzenia. UnionFS tworzy połączenie montowania dla innych systemów plików i pozwala użytkownikowi na przezroczyste łączenie plików i katalogów z różnych systemów plików (nazywanych gałęziami) w jeden powiązany system plików.

Zawartość katalogów o tych samych ścieżkach będzie wyświetlana razem w jednym połączonym katalogu (w jednolitym przestrzeni nazw) uzyskanego systemu plików.

UnionFS łączy warstwy, kierując się następującymi zasadami:

  • jedna z warstw staje się warstwą najwyższego poziomu, druga i kolejne – warstwami niższego poziomu;
  • użytkownik ma dostęp do obiektów warstw «od góry do dołu», tzn. jeśli żądany obiekt znajduje się w «górnej» warstwie, to jest zwracany, niezależnie od obecności obiektu o tej samej nazwie w «niższej» warstwie; w przeciwnym razie zwracany jest obiekt «niższej» warstwy; jeśli żądany obiekt nie istnieje ani tam, ani tam, zwracany jest błąd «Nie ma takiego pliku ani katalogu»;
  • warstwą roboczą jest «górna», więc wszelkie działania użytkownika związane z modyfikacją danych odbijają się tylko na warstwie najwyższego poziomu, nie wpływając na zawartość warstw niższego poziomu.

Docker to najpopularniejsza technologia użycia kontenerów w pracy z aplikacjami. Stał się standardem w tej dziedzinie, opierając się na cgroups i przestrzeni nazw, zapewnianych przez jądro Linux.

Docker pozwala na szybkie uruchamianie aplikacji i maksymalne optymalizowanie wykorzystania systemu plików dzięki podziałowi jądra OS między wszystkimi kontenerami, działając jak osobne procesy OS.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster