Co Docker dodaje do lxc-tools (narzędzia LXC w przestrzeni użytkownika)?

398

Jeśli spojrzysz na funkcje Dockera, większość z nich jest już udostępniana przez LXC.

Co więc dodaje Docker? Dlaczego miałbym używać Dockera zamiast zwykłego LXC?

Flimm
źródło

Odpowiedzi:

550

Z Docker FAQ :

Docker nie zastępuje lxc. „lxc” odnosi się do możliwości jądra Linuksa (w szczególności przestrzeni nazw i grup kontrolnych), które umożliwiają między sobą procesy piaskownicowe i kontrolowanie ich alokacji zasobów.

Oprócz niskiego poziomu funkcji jądra, Docker oferuje narzędzie wysokiego poziomu z kilkoma potężnymi funkcjami:

  • Przenośne wdrażanie na różnych komputerach.Docker definiuje format pakowania aplikacji i wszystkich jej zależności w jeden obiekt, który można przenieść na dowolną maszynę obsługującą okno dokowane i wykonać tam z gwarancją, że środowisko wykonawcze narażone na działanie aplikacji będzie takie samo. Lxc implementuje sandboxing procesu, który jest ważnym warunkiem wstępnym dla przenośnego wdrożenia, ale sam ten nie wystarczy dla przenośnego wdrożenia. Jeśli przesłałeś mi kopię aplikacji zainstalowanej w niestandardowej konfiguracji lxc, prawie na pewno nie działałaby na moim komputerze tak, jak na twojej, ponieważ jest powiązana z konkretną konfiguracją twojego komputera: sieć, pamięć masowa, logowanie, dystrybucja, itp. Docker definiuje abstrakcję dla tych ustawień specyficznych dla komputera, aby dokładnie ten sam kontener dokowania mógł działać - bez zmian - na wielu różnych komputerach,

  • Zorientowany na aplikacje. Docker jest zoptymalizowany pod kątem wdrażania aplikacji , w przeciwieństwie do maszyn. Znajduje to odzwierciedlenie w interfejsie API, interfejsie użytkownika, filozofii projektowania i dokumentacji. Natomiast skrypty pomocnicze lxc koncentrują się na kontenerach jako lekkich maszynach - w zasadzie serwerów, które uruchamiają się szybciej i wymagają mniej pamięci RAM. Uważamy, że pojemniki to coś więcej niż tylko to.

  • Automatyczna kompilacja . Docker zawiera narzędzie dla programistów do automatycznego składania kontenera na podstawie kodu źródłowego, z pełną kontrolą nad zależnościami aplikacji, narzędziami do tworzenia, pakowaniem itp. Mogą swobodnie korzystać z pakietów make, maven, chef, puppet, salt, debian, rpms, source tarballi lub dowolna ich kombinacja, niezależnie od konfiguracji maszyn .

  • Wersjonowanie. Docker zawiera podobne do git możliwości śledzenia kolejnych wersji kontenera, sprawdzania różnic między wersjami, zatwierdzania nowych wersji, wycofywania itp. Historia obejmuje również sposób montażu kontenera i przez kogo, dzięki czemu można uzyskać pełną identyfikowalność z serwera produkcyjnego aż do głównego dewelopera. Docker implementuje także przyrostowe wysyłanie i pobieranie, podobne do „git pull”, więc nowe wersje kontenera można przenosić, wysyłając tylko pliki różnic.

  • Ponowne użycie komponentu. Każdy kontener może być używany jako „obraz podstawowy” do tworzenia bardziej wyspecjalizowanych komponentów. Można to zrobić ręcznie lub jako część automatycznej kompilacji. Na przykład możesz przygotować idealne środowisko Pythona i użyć go jako podstawy dla 10 różnych aplikacji. Twoja idealna konfiguracja postgresql może być ponownie wykorzystana do wszystkich twoich przyszłych projektów. I tak dalej.

  • Dzielenie się. Docker ma dostęp do rejestru publicznego ( https://registry.hub.docker.com/ ), w którym tysiące ludzi przesłało przydatne kontenery: od redis, couchdb, postgres, przez bouncerów IRC, przez serwery aplikacji do railsów, po hadoop, po podstawowe obrazy różne dystrybucje. Rejestr zawiera również oficjalną „standardową bibliotekę” przydatnych kontenerów obsługiwanych przez zespół dokerów. Sam rejestr jest typu open source, więc każdy może wdrożyć własny rejestr do przechowywania i przesyłania prywatnych kontenerów, na przykład na potrzeby wewnętrznych serwerów.

  • Ekosystem narzędzi. Docker definiuje interfejs API do automatyzacji i dostosowywania tworzenia i wdrażania kontenerów. Istnieje ogromna liczba narzędzi integrujących się z dokerem w celu rozszerzenia jego możliwości. Wdrożenie podobne do PaaS (Dokku, Deis, Flynn), wielowęzłowa orkiestracja (maestro, sól, mesos, openstack nova), kokpity menedżerskie (docker-ui, openstack horizon, stocznia), zarządzanie konfiguracją (szef kuchni, marionetka), ciągła integracja (jenkins, strider, travis) itp. Docker szybko staje się standardem dla narzędzi opartych na pojemnikach.

Mam nadzieję, że to pomoże!

Solomon Hykes
źródło
3
Kiedy mówisz „dowolny kontener może być użyty jako obraz podstawowy”, zakładam, że masz na myśli kontener Docker, a nie kontener LXC utworzony niezależnie od Docker. O ile mi wiadomo, nie można utworzyć kontenera Docker od zera, zawsze musi on dziedziczyć z innego kontenera Docker (powiązane pytanie: stackoverflow.com/questions/18274088/... ).
Flimm,
18
Możesz łatwo utworzyć nowy kontener z dowolnego archiwum tar za pomocą „importu dokera”. Na przykład: „debootstrap raring ./rootfs; tar -C ./rootfs -c. | Docker import flimm / mybase”.
Solomon Hykes,
3
czy jest to nadal prawdą teraz, gdy Docker ma libcontainer (że nie jest zamiennikiem)?
Garet Claborn
3
@GaretClaborn tak, ponieważ libcontainer jest tylko ich własną biblioteką umożliwiającą dostęp do przestrzeni nazw i grup, wszystko, co powiedział Salomon, nadal obowiązuje.
John Morales
10
Kontener systemu Linux jest wynikiem ograniczenia i izolacji procesu przy użyciu zestawu funkcji systemu Linux: chroot, cgroups i przestrzeni nazw. LXC to narzędzie przestrzeni użytkownika, które manipuluje tymi udogodnieniami. libcontainer jest alternatywą dla LXC, która manipuluje tymi samymi obiektami. Docker domyślnie używa libcontainer, ale zamiast tego może używać LXC. To powiedziawszy, Docker to (znacznie) więcej niż warstwa kompatybilności na libcontainer / LXC; dodaje dodatkowe funkcje wymienione przez inne odpowiedzi.
user100464
71

Rzućmy okiem na listę funkcji technicznych Dockera i sprawdź, które są dostarczane przez LXC, a które nie.

Funkcje:

1) Izolacja systemu plików : każdy kontener procesu działa w całkowicie oddzielnym głównym systemie plików.

Dostarczone ze zwykłym LXC.

2) Izolacja zasobów : zasoby systemowe, takie jak jednostka centralna i pamięć, mogą być przydzielane inaczej do każdego kontenera procesu, przy użyciu grup cgroups.

Dostarczone ze zwykłym LXC.

3) Izolacja sieci : każdy kontener procesu działa we własnej sieciowej przestrzeni nazw z własnym interfejsem wirtualnym i adresem IP.

Dostarczone ze zwykłym LXC.

4) Kopiowanie przy zapisie : główne systemy plików są tworzone przy użyciu kopiowania przy zapisie, co sprawia, że ​​wdrażanie jest niezwykle szybkie, tanie w pamięci i tanie na dysku.

Zapewnia to AUFS, unijny system plików, od którego zależy Docker. Możesz samodzielnie skonfigurować AUFS przy pomocy LXC, ale Docker używa go jako standardu.

5) Logowanie : standardowe strumienie (stdout / stderr / stdin) każdego kontenera procesowego są gromadzone i rejestrowane w celu pobrania w czasie rzeczywistym lub partii.

Docker to zapewnia.

6) Zarządzanie zmianami zmianami: zmiany w systemie plików kontenera można przypisać do nowego obrazu i wykorzystać ponownie, aby utworzyć więcej kontenerów. Nie wymaga szablonowania ani ręcznej konfiguracji.

„Konfiguracja szablonów lub konfiguracja ręczna” to odniesienie do LXC, w którym należy dowiedzieć się o obu tych rzeczach. Docker pozwala traktować kontenery w sposób, w jaki jesteś przyzwyczajony do traktowania maszyn wirtualnych, bez wiedzy o konfiguracji LXC.

7) Interaktywna powłoka : doker może przydzielić pseudo-tty i dołączyć do standardowego wejścia dowolnego kontenera, na przykład w celu uruchomienia interaktywnej powłoki.

LXC już to zapewnia.


Dopiero zacząłem uczyć się o LXC i Dockerze, więc chętnie przyjmę wszelkie poprawki lub lepsze odpowiedzi.

Flimm
źródło
35
IMHO, ta odpowiedź nie ma sensu. Docker nie „zapewnia” tych funkcji; sprawia, że ​​są niezwykle łatwe w użyciu. Jeśli chcemy być nieostrożni, możemy powiedzieć, że LXC nie zapewnia izolacji: zapewniają to przestrzenie nazw , a LXC jest tylko narzędziem przeznaczonym dla użytkowników, aby ułatwić ich użycie niż w przypadku podstawowego unsharenarzędzia (lub bezpośrednio clone()wywołania systemowego). Podobnie Docker ułatwia korzystanie z tych rzeczy (i zapewnia wiele innych funkcji na stole, takich jak możliwość pchania / ciągnięcia obrazów). Mój 2c.
jpetazzo
6
@jpetazzo: LXC jest naprawdę dość łatwe, w jaki sposób Docker ułatwia (oprócz dodawania innych funkcji, takich jak wypychanie i ciągnięcie obrazów)?
Flimm,
31
@Flimm: Podoba mi się porównanie w numerze 16 Admin Magazine , str. 34: Docker łączy LXC z kilkoma innymi technologiami wspierającymi i otacza go łatwym w użyciu interfejsem wiersza poleceń. Korzystanie z pojemników jest trochę jak próbuje użyć Git z zaledwie komend jak update-indexi read-treebez znanych narzędzi, takich jak add, commiti merge. Docker zapewnia tę warstwę „porcelany” nad „hydrauliką” LXC, umożliwiając pracę z koncepcjami wyższego poziomu i martwienie się o szczegóły niskiego poziomu.
0xC0000022L
4
Przeprowadziłem testy porównawcze UnixBench w kontenerze dokującym i kontenerze LXC, działającym w tym samym systemie operacyjnym, a LXC osiągnął doskonałe wyniki. Będąc dokerem opartym na LXC, jestem bardzo zaskoczony moimi wynikami.
gextra
7
Wydaje mi się, że wolniejsza wydajność Dockera była związana z dyskowymi I / O, dlatego może być spowodowana przyjęciem AUFS.
gextra
16

Powyższy post i odpowiedzi szybko stają się przestarzałe, ponieważ rozwój LXD nadal ulepsza LXC . Tak, wiem, że Docker też nie stał w miejscu.

LXD implementuje teraz repozytorium dla obrazów kontenerów LXC, z których użytkownik może pchać / wyciągać, aby przyczynić się do lub użyć ponownie.

Interfejs REST LXD dla LXC umożliwia teraz zarówno lokalne, jak i zdalne tworzenie / wdrażanie / zarządzanie kontenerami LXC przy użyciu bardzo prostej składni poleceń.

Kluczowe cechy LXD to:

  • Bezpieczne z założenia (nieuprzywilejowane kontenery, ograniczenia zasobów i wiele innych)
  • Skalowalny (od pojemników na laptopie do tysięcy węzłów obliczeniowych)
  • Intuicyjny (prosty, przejrzysty interfejs API i wyraźny interfejs wiersza poleceń)
  • Oparte na obrazach (nie ma już szablonów dystrybucji, tylko dobre, zaufane obrazy) Migracja na żywo

Dostępna jest teraz wtyczka NCLXD dla OpenStack umożliwiająca OpenStack wykorzystywać LXD do wdrażania / zarządzania kontenerami wirtualnymi w OpenStack zamiast używania KVM, vmware itp.

Jednak NCLXD umożliwia także chmurę hybrydową mieszanki tradycyjnych maszyn wirtualnych HW i maszyn wirtualnych LXC.

Wtyczka OpenStack nclxd lista obsługiwanych funkcji obejmuje:

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

Do czasu wydania Ubuntu 16.04 w kwietniu 2016 r. Pojawią się dodatkowe fajne funkcje, takie jak obsługa urządzeń blokowych, obsługa migracji na żywo .

bmullan
źródło
4

Dokery używają obrazów składających się z warstw. Dodaje to wiele pod względem przenośności, udostępniania, wersjonowania i innych funkcji. Obrazy te są bardzo łatwe do przenoszenia lub przesyłania, a ponieważ są w warstwach, zmiany w kolejnych wersjach są dodawane w postaci warstw w stosunku do poprzednich warstw. Podczas wielokrotnego przenoszenia nie trzeba przenosić warstw podstawowych. Dokery mają kontenery, które uruchamiają te obrazy ze środowiskiem wykonawczym, dodają zmiany jako nowe warstwy, zapewniając łatwą kontrolę wersji.

Poza tym Docker Hub to dobry rejestr z tysiącami publicznych obrazów, w których można znaleźć obrazy z zainstalowanym systemem operacyjnym i innym oprogramowaniem. Dzięki temu możesz uzyskać całkiem dobry początek swojej aplikacji.

div
źródło
Kiedy mówisz „warstwy wbudowane” - co to znaczy - (A) Kopia warstw podstawowych, dostosowana i przypisana do warstwy „NOWE”. Czy warstwa podstawowa jest odłączona od następnej? (B) Warstwa (warstwy) podstawowa jest / są uwzględnione w warstwie „NOWE”, a także połączone. Tak więc zmiany w warstwie podstawowej są automatycznie odzwierciedlane w warstwie „NOWE”. Przepraszamy, jeśli żądane wyjaśnienie jest zbyt naiwne. :( Kapil
Kapil
Obrazy dokerów są wbudowane w warstwy. Mówiąc bardziej szczegółowo, wszystkie zmiany do momentu, w którym warstwa zostaje zatwierdzona, są obecne w warstwach obrazu wykonanych do tego momentu. Wszelkie późniejsze zmiany zostaną dodane do następnych i wyższych warstw. Nowa warstwa jest więc połączona z warstwą podstawową. Nie sądzę, że tę samą nową warstwę można dodać do innej warstwy podstawowej z dodatkowymi zmianami. Jeśli jednak wiele podmiotów chce zachować spójność i mieć te same warstwy podstawowe, wówczas tylko nowe warstwy muszą zostać przekazane tym jednostkom, aby osiągnąć ten sam stan.
dz.
Jednak nie jestem na bieżąco z aktualnymi zmianami w dokerze i mogą wystąpić zmiany w implementacji obrazu dokera, które nie zostały uwzględnione w powyższym komentarzu.
div
Mówiąc ściślej, warstwy są identyfikowane przez sygnaturę (chyba coś SHA), co oznacza, że ​​jeśli zmienisz warstwę, będzie to inna warstwa. @Kapil: Oznacza to, że chociaż jego zachowanie jest nieco bliższe opcji (B), w rzeczywistości nie można wprowadzać zmian w warstwie podstawowej. (lub dowolna warstwa, jeśli o to chodzi) Obraz jest zbudowany z listy warstw, każda zastosowana w kolejności; warstwy można wyczyścić (i myślę, że są one automatycznie usuwane przez samą dokerację), gdy nie są już potrzebne; tzn. gdy wszystkie obrazy odniesienia zostały usunięte.
codermonkeyfuel
@Kapil: Szczerze mówiąc, twoje pytanie prawdopodobnie najlepiej działałoby jako nowe pytanie, a nie jako komentarz do tego pytania, ponieważ jest przydatne dla ludzi, którzy mogą samodzielnie spojrzeć w górę. Jeśli chcesz zadać to pytanie jako nowe, ja również tam odpowiem.
codermonkeyfuel
0

Chcąc zachować ten bardziej szczegółowy, jest to już zadane i udzielone powyżej .

Cofam się jednak i odpowiadam nieco inaczej, sam silnik dokera dodaje orkiestrację jako jeden z jego dodatków i jest to część zakłócająca. Gdy zaczniesz uruchamiać aplikację jako kombinację kontenerów działających „gdzieś” w wielu silnikach kontenerów, staje się to naprawdę ekscytujące. Solidność, poziome skalowanie, pełna abstrakcja od podstawowego sprzętu, mógłbym kontynuować ...

To nie tylko Docker, który ci to daje, w rzeczywistości de facto standardem zarzadzania kontenerami jest Kubernetes, który ma wiele smaków, Docker, ale także OpenShift, SuSe, Azure, AWS ...

Następnie pod K8S znajdują się alternatywne silniki kontenerowe; interesującymi są Docker i CRIO - niedawno zbudowany, pozbawiony demonów, przeznaczony jako silnik kontenerowy specjalnie dla Kubernetes, ale niedojrzały. Sądzę, że konkurencja między nimi będzie długoterminowym wyborem dla silnika kontenerowego.

Will Rothwell
źródło