Docker, co to jest i jaki jest cel

111

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?

mfrachet
źródło

Odpowiedzi:

116

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. ggg

(Zwróć uwagę, że w przypadku Dockera nie jest wymagany system operacyjny gościa)

JerryGoyal
źródło
1
Próbowałem poszukać zasobów dotyczących przepływu pracy tworzenia i wdrażania platformy Docker, ale nie mogę znaleźć niczego. Podajmy na przykład środowisko lampp z laravel + angular4. Czy udostępniam określony plik kolegom z drużyny? Jak edytować źródło aplikacji (php html js / ts), jeśli umieszczę je w kontenerze? Czy nadal możemy używać git / svn w naszym kodzie źródłowym?
anaval
13
VM oznacza „maszynę wirtualną”. Nie ma potrzeby nazywać go „maszyną wirtualną”, ponieważ staje się wówczas „maszyną wirtualną”. :)
Dzhuneyt
32

[Uwaga: ta odpowiedź skupia się na kontenerach Linuksa i może nie mieć pełnego zastosowania do innych systemów operacyjnych. ]

Co to jest pojemnik?

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:

  • Mount: systemy plików, /w kontenerze będzie się różnić od tego /na hoście.
  • PID: identyfikator procesu, pid 1 w kontenerze to uruchomiona aplikacja, ten identyfikator będzie inny, gdy będzie wyświetlany na hoście.
  • Sieć: kontenery działają z własnym interfejsem sprzężenia zwrotnego (127.0.0.1) i domyślnie prywatnym adresem IP. Docker wykorzystuje technologie, takie jak sieci mostów linuksowych, do łączenia wielu kontenerów we własnej prywatnej sieci LAN.
  • IPC: komunikacja międzyprocesowa
  • UTS: obejmuje to nazwę hosta
  • Użytkownik: możesz opcjonalnie przesunąć wszystkie identyfikatory użytkowników, aby były przesunięte w stosunku do identyfikatorów hosta

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.

Czy może zastąpić maszynę wirtualną przeznaczoną do rozwoju?

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ć.

Jaki jest cel, w prostych słowach, używania Dockera w firmach? Główna zaleta ?

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.

BMitch
źródło
2
+1 Całkowicie zgadzam się z twoją odpowiedzią, zwłaszcza z częścią „czy może zastąpić maszyny wirtualne”. Widzę wiele komentarzy gdzie indziej podkreślających, że Docker nie jest maszyną wirtualną, ale z doświadczenia wynika, że ​​w wielu przypadkach działa równie dobrze lub jest nawet lepszą alternatywą. Co masz na myśli, mówiąc „możliwy jest bezpośredni dostęp do fizycznego sprzętu”?
Tyress
2
@tyress, jeśli Twoim hostem jest Linux, możesz montować urządzenia bezpośrednio w kontenerze Linux. Widziałem, jak to zrobiono z urządzeniami dźwiękowymi, ale wszystko w / dev można dodać. Pomija to pewną izolację kontenerów, ale ma sens w przypadku określonych zadań, takich jak aplikacje komputerowe.
BMitch
to jest niesamowite. Nie pomyślałem o tym.
Tyress
@BMitch: bardzo czysta i elegancka odpowiedź, dzięki !! Myślę, że mogę teraz wyobrazić sobie, czym jest kontener, ale byłoby wspaniale, gdybyś mógł zaktualizować swoją odpowiedź o powiązania kontenera z dockerem? Czy w porównaniu z kontenerem i maszyną wirtualną docker jest odpowiednikiem hiperwizora?
rahulaga_dev
1
Docker to narzędzie, które implementuje kontenery, wraz z pozostałymi potrzebnymi ekosystemami, takimi jak rejestr w docker hub i środowiskach desktopowych, które osadzają maszynę wirtualną do uruchamiania kontenerów Linux.
BMitch
6

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.

Dlaczego ktoś miałby myśleć o dockerze i kontenerach, skoro wszystko wydaje się w porządku przy obecnym procesie architektury i rozwoju aplikacji !!

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.

  1. 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ć).

  2. 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).

  3. 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.

  4. 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.

Teraz myślimy o dockerze, ponieważ jego celem jest konteneryzacja aplikacji i automatyzacja wdrażania aplikacji oraz ich bardzo łatwa wysyłka.

wprowadź opis obrazu tutaj

Jak docker rozwiązuje powyższe problemy-

  1. 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.

  2. 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 :) .

Więc kontenery są izolowane środowiska ze wszystkimi zależnościami i bibliotek pakiecie wraz z ich własnego procesu i sieciowych interfejsów oraz wierzchowców .

Wszystkie kontenery używają tych samych zasobów systemu operacyjnego, dlatego ich uruchomienie zajmuje mniej czasu i efektywnie wykorzystuje procesor przy mniejszych kosztach sprzętu.

Mam nadzieję, że to byłoby pomocne.

Siyaram Malav
źródło
2

Postaram się udzielić możliwie najprostszych odpowiedzi:

Ale tak naprawdę nie wiem, jaki jest cel tego „pojemnika”?

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.

Czy może zastąpić maszynę wirtualną przeznaczoną do rozwoju?

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.

Jaki jest cel, w prostych słowach, używania Dockera w firmach? Główna zaleta?

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:

  • Świetna izolacja usług
  • Doskonałe możliwości zarządzania, ponieważ kontenery zawierają wszystko, czego potrzebuje aplikacja
  • Hermetyzacja technologii wdrożeniowej (w kontenerach)
  • Efektywne wykorzystanie zasobów (dzięki niewielkiej wirtualizacji systemu operacyjnego) w porównaniu z maszynami wirtualnymi
  • Szybkie wdrożenie
Joel H.
źródło