Kontener dokera systemu operacyjnego: jaka jest zatem różnica z maszyną wirtualną?

10

Jaki jest sens używania systemu operacyjnego w kontenerze dokowanym?

W repozytorium dokerów znajduje się obraz dokera Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Myślałem, że Docker jest bardziej na poziomie „aplikacji”.

Jakie są zatem różnice między kontenerem dokującym Ubuntu a maszyną wirtualną Ubuntu? Jeśli masz cały system operacyjny w kontenerze dokowanym, to czy nie ma sensu używać Dockera?

Dzięki

Michał
źródło

Odpowiedzi:

11

Brakuje podstawowych koncepcji Dockera. To zupełnie inna sprawa.

Pierwszą rzeczą, którą musisz wiedzieć, jest filozofia Dockera: uruchom jeden proces izolowany w kontenerze. Nie uruchomisz systemu operacyjnego w kontenerze Docker, uruchomisz proces w kontenerze z zawartością głównego systemu plików w oparciu o wybraną przez ciebie dystrybucję linux. Ubuntu to wybór między innymi.

Teraz powinieneś się zastanowić, w jaki sposób można uruchomić proces w obrazie bazowym linuxa innym niż dystrybucja linuksowa, z którą działa twój host. Aby system operacyjny działał, potrzebujesz:

  • System plików rozruchowych: zawiera program ładujący i jądro, które po załadowaniu pozostanie w pamięci. Nie obchodzi nas to w przypadku kontenerów Docker, ponieważ jądro jest współdzielone z hostem i jest wspólną częścią wszystkich dystrybucji Linuksa.
  • Główny system plików: zawiera strukturę systemu plików. Może się różnić od jednej dystrybucji linuksa do drugiej. Jest tylko do odczytu, dopóki sekwencja rozruchowa nie zakończy się.

Docker używa UnionFS do zarządzania warstwami bloków dysku wewnątrz kontenera, aby można je było układać w stosy.

Za kulisami wykorzystuje podłączenie unii, które pozwala na podłączenie wielu systemów plików jednocześnie, wyglądając jak cały wirtualny. W rzeczywistości upuszcza podstawową warstwę obrazu jako tryb odczytu i zapisu na podstawowy system plików w trybie tylko do odczytu.

Tutaj masz stos bloków dyskowych ułożonych warstwami w taki sposób, że dystrybucja linuksowa, z której pochodzi obraz podstawowy, zawierałaby ten sam system plików po zainstalowaniu na prawdziwym hoście, ale tym razem znajduje się w kontenerze.

Ostatnią rzeczą, której teraz brakuje, jest: jak uruchomić tę rzecz w izolacji?

Odpowiedź brzmi: przestrzenie nazw. Nie będę tutaj wchodził w szczegóły, ponieważ odbiegałoby to nieco od pierwotnego pytania. Ale musisz wiedzieć, że od czasu jądra 2.4.19 z biegiem lat pojawiły się różnego rodzaju przestrzenie nazw. Obecnie dostępne są następujące przestrzenie nazw:

  • IPC: przestrzeń nazw IPC (komunikacja międzyprocesowa)
  • MNT: zamontuj przestrzeń nazw
  • NET: przestrzeń nazw sieci
  • PID: przestrzeń nazw pid
  • USER: przestrzeń nazw użytkownika (UID)
  • UTS: przestrzeń nazw UTS (nazwy hostów)

Przestrzenie nazw to izolowane struktury wewnątrz jądra, które umożliwiają uruchamianie procesów w określonym środowisku. Na przykład przestrzeń nazw MNT będzie kluczową funkcją umożliwiającą uruchomienie procesu w specyfiki systemu plików głównego obrazu podstawowego. Przestrzeń nazw NET będzie kolejną kluczową funkcją dla kontenera mającego określone interfejsy sieciowe w celu komunikacji z mostem dokującym itp.

Tak, tak, głównym celem tego wszystkiego jest uruchomienie aplikacji w izolacji, wysłanie jej z lokalnego środowiska do produkcji z łatwością w pudełku zwanym kontenerem.

Dobrym pomysłem byłoby przeczytanie dokumentacji dokera przed zagłębieniem się w nią.

Xavier Lucas
źródło
Dzięki, czy to oznacza, że ​​obraz „Ubuntu” taki jak ten: register.hub.docker.com/_/ubuntu sam w sobie nie ma „sensu” i służy jako podstawa dla bardziej zdefiniowanego kontenera, takiego jak „kontener nginx”? Nie wiem czy mam sens?
Michael
Tak Właśnie do tego służy. Z tego powodu zwykle słyszysz, jak ludzie nazywają je zdjęciami podstawowymi .
Xavier Lucas
Przejrzałem dokumentację i nie jestem pewien. Powiedzmy, że rozmiar obrazu ubuntu wynosi 140 Mb. Następnie inny obraz oparty na tym obrazie dodaje 10 Mb więcej. Jeśli uruchomię 2 kontenery z tego obrazu, czy każdy kontener będzie miał pojemność 150 MB i potrzebuję 300 MB miejsca na dysku LUB całkowity rozmiar pozostanie 150 MB? Dzięki
Michael
Wow, właśnie pobrałem oficjalny obraz Pythona, a rozmiar wirtualny to 802.4 MB. Pobieranie zajęło trochę czasu. Jeśli uruchomię z niego 10 pojemników, ile miejsca zajmą te pojemniki? Dzięki
Michael
2
@YAmikep Niektóre obrazy mogą być duże z powodu nieprawidłowego czyszczenia zależności. Jeśli uruchomisz 10 kontenerów z tym samym obrazem, nie oznacza to, że miejsce na dysku będzie 10 razy większe niż rozmiar obrazu. Raz ładujesz obraz, ale uruchamiasz go z wielu kontenerów. Docker używa kopiowania przy zapisie podczas uruchamiania wielu kontenerów z tego samego obrazu, co w zasadzie oznacza, że ​​będzie on współużytkować obraz między kontenerami i tworzy prywatną kopię pliku wewnątrz obrazu tylko wtedy, gdy kontener go doda / zmodyfikuje. Rzeczywisty użyty rozmiar jest powiązany z aktywnością wewnątrz kontenerów, a nie z iloma przebiegami.
Xavier Lucas