Dlaczego używamy obrazu podstawowego systemu operacyjnego z Dockerem, jeśli kontenery nie mają systemu operacyjnego gościa?

83

Właśnie zacząłem studiować Dockera i jest coś, co jest dla mnie dość mylące. Jak czytałem na stronie Dockera, pojemnik różni się od maszyny wirtualnej. Zrozumiałem, że kontener to tylko piaskownica, w której działa cały izolowany system plików.

Przeczytałem również, że w kontenerze nie jest zainstalowany system operacyjny gościa. Zamiast tego opiera się na jądrze systemu operacyjnego.

Wszystko w porządku. Jestem zdezorientowany, że istnieją obrazy Docker nazwane na cześć systemów operacyjnych. Widzimy obrazy takie jak Ubuntu, Debian, Fedora, CentOS i tak dalej.

Chodzi mi o to: czym tak naprawdę są te obrazy? Czym różni się tworzenie kontenera na podstawie obrazu Debiana od tworzenia maszyny wirtualnej i instalowania Debiana?

Myślałem, że w kontenerach nie ma zainstalowanego systemu operacyjnego gościa, ale podczas tworzenia obrazów opieramy je na obrazie nazwanym na podstawie jednego systemu operacyjnego.

Ponadto w przykładach, które widziałem, kiedy to robimy docker run ubuntu echo "hello world", wydaje się, że uruchamiamy maszynę Wirtualną za pomocą Ubuntu i uruchamiamy polecenie echo "hello world".

W ten sam sposób, kiedy to robimy docker run -it ubuntu /bin/bash, wydaje się, że uruchamiamy maszynę wirtualną z Ubuntu i uzyskujemy do niej dostęp za pomocą wiersza poleceń.

W każdym razie, o co chodzi z tymi obrazami po systemach operacyjnych? Czym różni się uruchamianie kontenera z jednym z tych obrazów i rozwijanie maszyny wirtualnej z odpowiednim systemem operacyjnym gościa?

Pomysł polega na tym, że po prostu udostępniamy jądro systemowi operacyjnemu hosta (w konsekwencji mamy dostęp do podstawowych zasobów sprzętowych komputera, bez potrzeby wirtualizacji sprzętu), ale nadal używamy plików i plików binarnych każdego innego systemu w kontenerach w celu do obsługi dowolnej aplikacji, którą chcemy uruchomić?

użytkownik1620696
źródło
2
Moim zdaniem twoje cele w wirtualizacji są kluczem. Jeśli potrzebujesz bibliotek, języków itp. W systemie operacyjnym, więc pojemniki systemu operacyjnego są odpowiednie do twoich potrzeb. Ale jeśli potrzebujesz tylko aplikacji jako komponentów, nie musisz używać systemu operacyjnego jako obrazu podstawowego. Myślę, że ten artykuł mógłby to jasno wyjaśnić blog.risingstack.com/…
metamorph

Odpowiedzi:

68

Ponieważ wszystkie dystrybucje Linuksa działają tak samo (tak, to trochę uproszczone) jądro Linuksa i różnią się tylko oprogramowaniem dla użytkowników, bardzo łatwo jest symulować inne środowisko dystrybucji - po prostu instalując to oprogramowanie i udając, że jest to inna dystrybucja. Mówiąc konkretnie, instalacja kontenera CentOS w systemie Ubuntu OS będzie oznaczać, że dostaniesz przestrzeń użytkownika z CentOS, wciąż działając z tym samym jądrem, nawet z inną instancją jądra.

Tak więc lekka wirtualizacja przypomina izolowanie przedziałów w tym samym systemie operacyjnym. Prawdziwa wirtualizacja Au contraire ma inny pełnoprawny system operacyjny w systemie operacyjnym hosta. Dlatego doker nie może uruchomić FreeBSD ani Windowsa w systemie Linux.

Jeśli byłoby to łatwiejsze, możesz pomyśleć, że docker jest rodzajem bardzo wyrafinowanego i zaawansowanego środowiska chroot.

Drookie
źródło
3
Właśnie dlatego mogę przechowywać mój skompilowany kod golang w pustym kontenerze Scratch - ponieważ skompilowany kod potrzebuje tylko jądra?
Francis Norton
Skąd więc system operacyjny gościa wie, jak używać jądra systemu hosta (i jak to zrobić)? AFAIK, bazy obrazów dokerów używają standardowych obrazów systemu operacyjnego. W twoim przykładzie nie jest tak, że istnieje niestandardowa kompilacja CentOS, która wie, że używa jądra rodzica? Czy jest to tak proste, jak sztuczka systemu plików (aufs), w której Docker przekierowuje odczytywanie gości ((CentOS)) z katalogu / boot do hosta (Ubuntu)? W takim przypadku gość (CentOS) zainstalowałby własną kopię / boot, ale nigdy nie zostałby odczytany?
James S
Podoba mi się twoje wyjaśnienie, ale jak w takim razie objaśniasz uruchamianie kontenerów Linux w systemie Windows? Czy Server 2016 i Windows 10 zawierają jądro Linuksa, aby umożliwić korzystanie z Dockera? Czy dlatego te wersje są konieczne?
duct_tape_coder
To jest prosta: oni merey uruchomić pod pełnoprawnym stosie wirtualizacji Hyper-V, wewnątrz native Linux VM: docs.microsoft.com/en-us/virtualization/windowscontainers/... .
drookie
1

Kontenery działają na pojedynczym jądrze. Innymi słowy, wszystkie kontenery mają pojedyncze jądro (Host OS). Natomiast hiperwizory mają wiele jąder. Każda maszyna wirtualna działa na innym jądrze.

A „docker run ubuntu” przypomina tworzenie środowiska chroot.

Shiv Sandhu
źródło