Słyszałem o Dockerze kilka dni temu i chciałem się z nim zapoznać.
Ale tak naprawdę nie wiem, jaki jest cel tego „pojemnika”?
Co to jest pojemnik?
Czy może zastąpić maszynę wirtualną przeznaczoną do rozwoju?
Jaki jest cel, w prostych słowach, używania Dockera w firmach? Główna zaleta?
Odpowiedzi:
VM: używając oprogramowania VM, na przykład Ubuntu można zainstalować w systemie Windows. I oboje biegaliby w tym samym czasie. To tak, jakby budować komputer PC z jego podstawowymi komponentami, takimi jak procesor, pamięć RAM, dyski, karty sieciowe itp., W systemie operacyjnym i składać je tak, aby działały tak, jakby to był prawdziwy komputer. W ten sposób komputer wirtualny staje się „gościem” w rzeczywistym komputerze PC, który wraz z systemem operacyjnym nazywany jest hostem.
Kontener: jest taki sam jak powyżej, ale zamiast używać całego systemu operacyjnego, ograniczył „niepotrzebne” komponenty wirtualnego systemu operacyjnego, aby utworzyć jego minimalną wersję. Doprowadziło to do powstania LXC (Linux Containers), który jest szybszy niż VM Machines.
Docker: kontener docker, w przeciwieństwie do maszyny wirtualnej i kontenera, nie wymaga ani nie zawiera oddzielnego systemu operacyjnego. Zamiast tego opiera się na funkcjonalności jądra Linuksa i wykorzystuje izolację zasobów.
Cel Dockera: jego głównym celem jest automatyzacja wdrażania aplikacji w kontenerach oprogramowania oraz automatyzacja wirtualizacji na poziomie systemu operacyjnego w systemie Linux. Jest lżejszy niż standardowe pojemniki i można go założyć w kilka sekund.
(Zwróć uwagę, że w przypadku Dockera nie jest wymagany system operacyjny gościa)
źródło
[Uwaga: ta odpowiedź skupia się na kontenerach Linuksa i może nie mieć pełnego zastosowania do innych systemów operacyjnych. ]
To aplikacja : kontener to sposób na uruchamianie aplikacji, które są odizolowane od siebie. Zamiast wirtualizować sprzęt w celu obsługi wielu systemów operacyjnych, kontenery polegają na wirtualizacji systemu operacyjnego w celu uruchamiania wielu aplikacji. Oznacza to, że możesz uruchomić więcej kontenerów na tym samym sprzęcie niż maszyny wirtualne, ponieważ masz tylko jedną uruchomioną kopię systemu operacyjnego i nie musisz wstępnie przydzielać rdzeni pamięci i procesora dla każdego wystąpienia aplikacji. Podobnie jak każda inna aplikacja, gdy kontener potrzebuje procesora lub pamięci, przydziela je, a następnie zwalnia po zakończeniu, umożliwiając innym aplikacjom korzystanie z tych samych ograniczonych zasobów później.
Wykorzystują przestrzenie nazw jądra : każdy kontener domyślnie otrzyma środowisko, w którym znajdują się następujące przestrzenie nazw:
/
w kontenerze będzie się różnić od tego/
na hoście.Każda z tych przestrzeni nazw zapobiega również zobaczeniu przez kontener elementów, takich jak system plików lub procesy na hoście lub w innych kontenerach, chyba że jawnie usuniesz tę izolację.
I inne narzędzia bezpieczeństwa Linuksa : Kontenery wykorzystują również inne funkcje bezpieczeństwa, takie jak SELinux, AppArmor, Capabilities i Seccomp, aby ograniczyć użytkownikom wewnątrz kontenera, w tym użytkownikowi root, możliwość ucieczki z kontenera lub negatywnego wpływu na hosta.
Pakuj aplikacje z ich zależnościami w celu zapewnienia przenośności : Pakowanie aplikacji do kontenera obejmuje złożenie nie tylko samej aplikacji, ale wszystkich zależności potrzebnych do uruchomienia tej aplikacji w przenośny obraz. Ten obraz jest podstawowym systemem plików używanym do tworzenia kontenera. Ponieważ izolujemy tylko aplikację, ten system plików nie zawiera jądra ani innych narzędzi systemu operacyjnego potrzebnych do wirtualizacji całego systemu operacyjnego. Dlatego obraz kontenera powinien być znacznie mniejszy niż obraz równoważnej maszyny wirtualnej, co przyspieszy wdrażanie go w węzłach w sieci. W rezultacie kontenery stały się popularną opcją wdrażania aplikacji w chmurze i zdalnych centrach danych.
To zależy : jeśli w Twoim środowisku programistycznym działa Linux i albo nie potrzebujesz dostępu do urządzeń sprzętowych, albo dopuszczalny jest bezpośredni dostęp do sprzętu fizycznego, migracja do kontenera Linuksa jest dość prosta. Idealnym celem dla kontenera docker są aplikacje, takie jak internetowe API (np. Aplikacja REST), do których uzyskujesz dostęp przez sieć.
Dev lub Ops : Docker jest zwykle wprowadzany do środowiska w jednej z dwóch ścieżek. Programiści szukający sposobu na szybsze tworzenie i testowanie lokalnych aplikacji oraz operacje, które chcą wykonywać więcej zadań na mniejszym sprzęcie, niż byłoby to możliwe w przypadku maszyn wirtualnych.
Lub Devops : jednym z idealnych celów jest natychmiastowe wykorzystanie platformy Docker z poziomu narzędzia do wdrażania CI / CD, skompilowanie aplikacji i natychmiastowe zbudowanie obrazu, który jest wdrażany w celu programowania, CI, produkcji itp. Kontenery często skracają czas potrzebny na przeniesienie aplikacji. od zaewidencjonowania kodu do momentu udostępnienia go do testów, co zwiększa wydajność programistów. Po prawidłowym zaprojektowaniu ten sam obraz, który został przetestowany i zatwierdzony przez programistów i narzędzia CI, może zostać wdrożony w środowisku produkcyjnym. Ponieważ ten obraz zawiera wszystkie zależności aplikacji, ryzyko zepsucia się czegoś w środowisku produkcyjnym, które działało podczas programowania, jest znacznie zmniejszone.
Skalowalność : ostatnią kluczową zaletą kontenerów, o której wspomnę, jest to, że są zaprojektowane z myślą o skalowalności poziomej. Gdy masz aplikacje bezstanowe pod dużym obciążeniem, kontenery są znacznie łatwiejsze i szybsze do skalowania ze względu na ich mniejszy rozmiar obrazu i mniejsze obciążenie. Z tego powodu kontenery są używane przez wiele większych firm internetowych, takich jak Google i Netflix.
źródło
Te same pytania uderzyły mnie w głowę kilka dni temu i to, co znalazłem po tym, jak się w to wdrożyłem, zrozumiem w bardzo prostych słowach.
Weźmy przykład, że rozwijamy aplikację przy użyciu usług nodeJs, MongoDB, Redis, RabbitMQ itp. [Możesz pomyśleć o innych usługach].
Teraz, jeśli zapomnimy o istnieniu dockera lub innych alternatywach aplikacji kontenerowych, traktujemy te następujące rzeczy jako problemy w procesie tworzenia i wysyłki aplikacji.
Zgodność usług (nodeJs, mongoDB, Redis, RabbitMQ itp.) Z systemem operacyjnym (nawet po znalezieniu kompatybilnych wersji z systemem operacyjnym, jeśli coś nieoczekiwanego wydarzy się w związku z wersjami, musimy ponownie sprawdzić zgodność i to naprawić).
Jeśli dwa komponenty systemu wymagają biblioteki / zależności z różnymi wersjami w aplikacji w systemie operacyjnym (To wymaga za każdym razem ponownego uruchomienia w przypadku nieoczekiwanego zachowania aplikacji z powodu problemu z biblioteką i wersją zależności).
Co najważniejsze, jeśli nowa osoba dołącza do zespołu, bardzo trudno jest skonfigurować nowe środowisko, osoba musi postępować zgodnie z dużym zestawem instrukcji i uruchamiać setki poleceń, aby ostatecznie skonfigurować środowisko. A to wymaga czasu i wysiłku.
Ludzie muszą upewnić się, że używają odpowiedniej wersji systemu operacyjnego i sprawdzić zgodność usług z systemem operacyjnym, a każdy programista musi to przestrzegać za każdym razem podczas konfiguracji.
Mamy również inne środowisko, takie jak programowanie, testowanie i produkcja Jeśli jeden programista czuje się komfortowo używając jednego systemu operacyjnego, a drugi czuje się dobrze z innym systemem W tym przypadku nie możemy zagwarantować, że nasza aplikacja będzie zachowywać się w ten sam sposób w tych dwóch różnych sytuacjach .
Wszystko to utrudnia nam życie w procesie opracowywania , testowania i dostarczania aplikacji.
Potrzebujemy więc czegoś, co rozwiązuje problem ze zgodnością i pozwala nam wprowadzać zmiany i modyfikacje w dowolnym komponencie systemu bez wpływu na inne komponenty.
Jak docker rozwiązuje powyższe problemy-
Możemy uruchomić każdy komponent usługi (nodeJs, MongoDB, Redis, RabbitMQ) w różnych kontenerach z własnymi zależnościami i bibliotekami w tym samym systemie operacyjnym, ale w różnych środowiskach.
Musimy tylko raz uruchomić konfigurację dockera, a wszyscy programiści naszego zespołu mogą zacząć od prostego polecenia docker run, zaoszczędziliśmy tutaj dużo czasu i wysiłku :) .
Mam nadzieję, że to byłoby pomocne.
źródło
Postaram się udzielić możliwie najprostszych odpowiedzi:
Co to jest pojemnik?
Mówiąc najprościej: pakiet zawierający oprogramowanie . Dokładniej, aplikacja i wszystkie jej zależności w pakiecie. Zwykłe, niezadokeryzowane środowisko aplikacji jest podłączane bezpośrednio do systemu operacyjnego, podczas gdy kontener Dockera jest warstwą abstrakcji systemu operacyjnego.
Kontener różni się od obrazu tym, że jest to instancja obrazu w czasie wykonywania - podobnie jak obiekty są instancjami klas w środowisku wykonawczym, jeśli znasz OOP.
Zarówno maszyny wirtualne, jak i kontenery Docker są technikami wirtualizacji, ponieważ zapewniają abstrakcję na szczycie infrastruktury systemowej.
Maszyna wirtualna obsługuje pełny system operacyjny „gościa” z wirtualnym dostępem do zasobów hosta za pośrednictwem hiperwizora. Oznacza to, że maszyna wirtualna często dostarcza środowisku więcej zasobów, niż faktycznie potrzebuje. Ogólnie rzecz biorąc, maszyny wirtualne zapewniają środowisku więcej zasobów niż większość aplikacji potrzebuje. Dlatego pojemniki są lżejszą techniką. Obaj rozwiązują różne problemy.
Konteneryzacja idzie w parze z mikrousługami. Mniejsze usługi, które składają się na większą aplikację, są często testowane i uruchamiane w kontenerach Docker. Ułatwia to ciągłe testowanie.
Ponadto, ponieważ kontenery Docker są tylko do odczytu, wymuszają kluczową zasadę DevOps: usługi produkcyjne powinny pozostać niezmienione
Kilka ogólnych korzyści z ich używania:
źródło