Jestem zupełnie nowy w Dockerze i próbuję dokładnie zrozumieć, czym jest obraz Dockera . Każda definicja obrazu Dockera używa terminu „warstwa”, ale wydaje się, że nie definiuje, co oznacza warstwa .
Z oficjalnej dokumentacji Dockera :
Widzieliśmy już, że obrazy platformy Docker są szablonami tylko do odczytu, z których uruchamiane są kontenery platformy Docker. Każdy obraz składa się z serii warstw. Docker wykorzystuje systemy plików unii do łączenia tych warstw w jeden obraz. Unijne systemy plików umożliwiają przezroczyste nakładanie plików i katalogów oddzielnych systemów plików, zwanych gałęziami, tworząc jeden spójny system plików.
Więc pytam, czym jest warstwa (dokładnie); czy ktoś może podać kilka konkretnych ich przykładów? Jak te warstwy „łączą się ze sobą”, tworząc obraz?
https://labs.ctl.io/caching-docker-images/
) jest uszkodzony. Czy ktoś ma sugestie dotyczące wymiany?Obraz kontenera Dockera jest tworzony przy użyciu pliku dockerfile . Każda linia w pliku dokowanym utworzy warstwę. Rozważmy następujący przykład fikcyjny:
Spowoduje to utworzenie ostatecznego obrazu, w którym całkowita liczba warstw będzie wynosić X + 3
źródło
Mają dla mnie największy sens na przykładzie ...
Badanie warstw własnej kompilacji za pomocą narzędzia Docker diff
Weźmy wymyślony przykład Dockerfile:
Każde z tych
dd
poleceń wyprowadza plik 1M na dysk. Zbudujmy obraz z dodatkową flagą, aby zapisać tymczasowe kontenery:Na wyjściu zobaczysz, że każde z uruchomionych poleceń odbywa się w tymczasowym kontenerze, który teraz przechowujemy, zamiast automatycznie usuwać:
Jeśli uruchomisz
docker diff
na każdym z tych identyfikatorów kontenerów, zobaczysz, jakie pliki zostały utworzone w tych kontenerach:Każda linia z prefiksem
A
oznacza dodanie pliku,C
symbol oznacza zmianę w istniejącym pliku, aD
symbol oznacza usunięcie.Oto część TL; DR
Każda z powyższych różnic w systemie plików kontenera trafia do jednej „warstwy”, która jest składana, gdy obraz jest uruchamiany jako kontener. Cały plik znajduje się w każdej warstwie, gdy następuje dodanie lub zmiana, więc każde z tych
chmod
poleceń, pomimo zmiany tylko bitu uprawnień, powoduje skopiowanie całego pliku do następnej warstwy. Usunięty / dane / jeden plik nadal znajduje się na poprzednich warstwach, w rzeczywistości 3 razy, i zostanie skopiowany przez sieć i zapisany na dysku po pobraniu obrazu.Badanie istniejących obrazów
Za pomocą polecenia można zobaczyć polecenia związane z tworzeniem warstw istniejącego obrazu
docker history
. Możesz także uruchomićdocker image inspect
na obrazie i zobaczyć listę warstw w sekcji RootFS.Oto historia powyższego obrazu:
Najnowsze warstwy są wymienione u góry. Warto zauważyć, że na dole znajdują się dwie warstwy, które są dość stare. Pochodzą z samego obrazu busybox. Tworząc jeden obraz, dziedziczysz wszystkie warstwy obrazu określone w
FROM
linii. Dodawane są również warstwy w celu zmiany metadanych obrazu, takich jakCMD
linia. Ledwo zajmują miejsce i służą raczej do rejestrowania ustawień dotyczących uruchomionego obrazu.Dlaczego warstwy?
Warstwy mają kilka zalet. Po pierwsze, są niezmienne. Po utworzeniu ta warstwa zidentyfikowana przez skrót sha256 nigdy się nie zmieni. Ta niezmienność pozwala obrazom na bezpieczne budowanie i rozwidlenie się. Jeśli dwa pliki dokowane mają ten sam początkowy zestaw wierszy i są zbudowane na tym samym serwerze, będą współdzielić ten sam zestaw początkowych warstw, oszczędzając miejsce na dysku. Oznacza to również, że jeśli przebudujesz obraz, a tylko kilka ostatnich wierszy pliku Dockerfile ulegnie zmianom, tylko te warstwy będą musiały zostać odbudowane, a reszta może zostać ponownie wykorzystana z pamięci podręcznej warstw. Może to bardzo przyspieszyć odbudowę obrazów Dockera.
Wewnątrz kontenera widzisz system plików obrazu, ale ten system plików nie jest kopiowany. Oprócz tych warstw obrazu kontener montuje własną warstwę systemu plików do odczytu i zapisu. Każde odczytanie pliku przechodzi przez warstwy, aż trafi na warstwę, która oznaczyła plik do usunięcia, ma kopię pliku w tej warstwie lub podczas odczytu skończą się warstwy do przeszukania. Każdy zapis powoduje zmianę w warstwie odczytu i zapisu specyficznej dla kontenera.
Zmniejszenie wzdęcia warstwy
Jedną z wad warstw jest tworzenie obrazów, które powielają pliki lub wysyłają pliki, które są usuwane w późniejszej warstwie. Rozwiązaniem jest często połączenie wielu poleceń w jedno
RUN
polecenie. Szczególnie podczas modyfikowania istniejących plików lub usuwania plików chcesz, aby te kroki były wykonywane w tym samym poleceniu, w którym zostały utworzone po raz pierwszy. Przepisanie powyższego pliku Dockerfile wyglądałoby tak:A jeśli porównasz otrzymane obrazy:
Po prostu scalając razem kilka linii w wymyślonym przykładzie, otrzymaliśmy tę samą wynikową zawartość w naszym obrazie i zmniejszyliśmy nasz obraz z 5 MB do tylko 1 MB pliku, który widzisz na ostatecznym obrazie.
źródło
Od czasu Dockera v1.10, wraz z wprowadzeniem magazynu adresowalnego treści, pojęcie „warstwy” stało się zupełnie inne. Warstwy nie mają pojęcia obrazu ani przynależności do obrazu, stają się jedynie zbiorami plików i katalogów, które można udostępniać między obrazami. Warstwy i obrazy zostały rozdzielone.
Na przykład, na lokalnie zbudowany wizerunek z obrazu bazowego, powiedzmy,
ubuntu:14.04
Thedocker history
komenda daje łańcuch obrazu, ale niektóre z identyfikatorami obraz zostanie pokazany jako „brakujący”, ponieważ historia build nie jest już załadowany. Warstwy, które składają się na te obrazy, można znaleźć pod adresemZawartość warstwy jest przechowywana,
/var/lib/docker/aufs/diff
jeśli wybrano sterownik pamięci masowejaufs
. Ale warstwy są nazywane z losowo generowanym identyfikatorem pamięci podręcznej, wydaje się, że połączenie między warstwą a jej identyfikatorem pamięci podręcznej jest znane tylko silnikowi Docker ze względów bezpieczeństwa. Wciąż szukam sposobu, aby się tego dowiedziećTen blog dostarczył wielu informacji.
źródło
Zgodnie ze specyfikacją obrazu Dockera za pośrednictwem The Moby Project :
Zasadniczo warstwa to po prostu zestaw zmian wprowadzonych w systemie plików.
źródło
"Each [Docker] layer is a set of filesystem changes."
(Zakładając, że to prawda). Z jakiegoś powodu nie zrozumiałem tego fundamentalnego punktu, czytając wiele innych dokumentów / blogi / pytania + odpowiedzi / itp. i podejrzewam, że ograniczenie było ich, a nie moje. Niezależnie od tego, brawo Aditya za dotarcie do sedna sprawy.Myślę, że oficjalny dokument zawiera dość szczegółowe wyjaśnienie: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ .
(źródło: docker.com )
Obraz składa się z wielu warstw, które zwykle są generowane z Dockerfile, każda linia w Dockerfile tworzy nową warstwę, a wynikiem jest obraz, który jest oznaczony przez formularz
repo:tag
, npubuntu:15.04
.Aby uzyskać więcej informacji, przeczytaj powyższe oficjalne dokumenty.
źródło
Dziękuję @David Castillo za przydatne informacje . Myślę, że warstwa jest binarną zmianą lub instrukcją obrazu, którą można łatwo wykonać lub cofnąć. Są wykonywane krok po kroku, czyli tak samo, jak warstwa na warstwie, więc nazwaliśmy „warstwą”.
Aby uzyskać więcej informacji, możesz zobaczyć „historię Dockera” w następujący sposób:
źródło
Osobiście rozumiem, że możemy porównać warstwę dockera z zatwierdzeniem na githubie. Dla twojego podstawowego obrazu (twojego nowego głównego repozytorium), wykonujesz kilka zatwierdzeń, każde zatwierdzenie zmienia twój status główny, to samo w dockerze, każda warstwa wykonuje jakąś operację w oparciu o poprzednią warstwę pośrednią. A potem ta warstwa staje się nową warstwą pośrednią do następnej warstwy.
źródło
Kiedyś myślałem, że są jak różnice na poprzednich warstwach. Po przeczytaniu niektórych odpowiedzi tutaj nie byłem taki pewien; są one opisywane jako zestawy zmian w systemie plików . Napisałem kilka plików Dockerfile, aby pokazać, że są bardziej podobne do różnic, tj. Naprawdę zależą od poprzednich warstw.
Biorąc pod uwagę te dwa pliki Dockerfiles
i
można by oczekiwać tego samego zestawu warstw, gdyby dotyczyły tylko zmian w systemie plików, ale tak nie jest:
i
Możesz zobaczyć, jak, nawet jeśli zmiany w systemie plików są takie same w obu przypadkach, kolejność ma znaczenie.
źródło