różnica między grupami cgroup i przestrzeniami nazw

85

Niedawno zacząłem uczyć się dockera i wygląda na to, że większość ciężkiej pracy jest wykonywana przez jądro linuxa, używając przestrzeni nazw i cgroups.

Kilka rzeczy, które uważam za mylące, to:

  1. Jaka jest różnica między przestrzenią nazw a cgroup? Jakie są różne przypadki użycia, do których się odnoszą?

  2. Co Docker zaimplementował na szczycie tych, aby zyskać popularność?

  3. Chciałbym poznać wewnętrzne cechy tych funkcji i poznać sposób ich implementacji.

InsatiableTraveller
źródło

Odpowiedzi:

108

Właściwe linki dla tych dwóch pojęć zostały poprawione w PR 14307 :

Pod maską Docker jest zbudowany na następujących komponentach:

W cgroups i namespacesmożliwości Linuksa

Z:

  • cgroup : Grupy kontrolne zapewniają mechanizm agregowania / dzielenia zestawów zadań i wszystkich ich przyszłych dzieci na hierarchiczne grupy o wyspecjalizowanym zachowaniu.
  • przestrzeń nazw : otacza globalny zasób systemowy abstrakcją, która sprawia, że ​​procesy w przestrzeni nazw wydają się mieć własne, izolowane wystąpienie zasobu globalnego.

W skrócie:

  • Cgroups = ogranicza, ile możesz użyć;
  • namespaces = ogranicza to, co możesz zobaczyć (i dlatego użyj)

Zobacz więcej w „ Anatomia kontenera: przestrzenie nazw, grupy cgroup i magia niektórych systemów plików ” autorstwa Jérôme Petazzoni .

Cgroups obejmują pomiary i ograniczanie zasobów:

  • pamięć
  • procesor
  • blok we / wy
  • sieć

Przestrzenie nazw zapewniają procesom własny widok systemu

Wiele przestrzeni nazw:

  • pid
  • netto
  • mnt
  • uts
  • ipc
  • user: userns kończy się wersja eksperymentalna w dockerze 1.10
    (remapowanie katalogu głównego kontenera na użytkownika nieuprzywilejowanego dla instancji demona jest w toku: PR 12648 : zobacz projekt )
VonC
źródło
Dzięki. Jest chrootoparty na jakiejś przestrzeni nazw? Czy chrootmożna zastąpić jakąś przestrzenią nazw?
Tim
1
Nie, chroot nie jest oparty na przestrzeni nazw: zobacz itnext.io/… . Jednak ponad trzy lata później pamiętaj, że nowy Docker (19.03, wciąż w wersji beta) może działać jako rootless: github.com/moby/moby/blob/… . I może udostępniać zasoby w przestrzeni nazw hosta: github.com/moby/moby/pull/38913
VonC
Czy chrootmożna zastąpić jakąś przestrzenią nazw?
Tim
1
@Tim Not natywnie. Może z pivot_root? ( unix.stackexchange.com/a/456777/7490 ) Zobacz także github.com/vincentbernat/jchroot
VonC
1
twitter.com/b0rk/status/1225445956734390273 do ilustracji kontenera
VonC,
2

Cgroups (grupy kontrolne) zarządzają zasobami.
Określa, ile zasobów maszyny hosta ma być przekazanych kontenerom.

na przykład: - definiujemy zasoby w pliku yaml docker-compose do tworzenia usług takich jak:

zasoby:
  limity:
    cpus: „0,1” (100 milikorów)
    pamięć: 50 M.

Tutaj, w tym przykładzie, wyraźnie prosimy grupy cgroup o przydzielenie tych zasobów do konkretnego kontenera.


Przestrzenie nazw : zapewnia izolację procesów, pełną izolację kontenerów, oddzielny system plików.


Istnieje 6 typów przestrzeni nazw:
1. mount ns - dla systemu plików.
2. UTS (Unique time sharing) ns - który sprawdza różne nazwy hostów uruchomionych kontenerów
3. IPC ns - komunikacja międzyprocesowa
4. Sieć ns - dba o przydzielenie różnych adresów IP do różnych kontenerów
5. PID ns - izolacja identyfikatora procesu
6. użytkownik ns - inna nazwa użytkownika (UID)

Mahima Mangal
źródło