‫W porządku, w tym wykładzie porozmawiamy o warstwach obrazu.
‫Jest to więc podstawowa koncepcja działania Dockera. Używa czegoś, co nazywa się unijnym
‫systemem plików, aby przedstawić serię zmian systemu plików jako rzeczywisty system plików.
‫Zamierzamy zagłębić się w historię i sprawdzić komendy i zobaczyć, jak możemy ich użyć, aby
‫zrozumieć, z czego faktycznie składa się obraz. Dowiemy się trochę o koncepcji kopiowania na
‫piśmie, w jaki sposób kontener działa jako dodatkowa warstwa na obrazie.
‫Co mam na myśli przez warstwy obrazu?
‫Jest całkowicie przezroczysty dla ciebie, kiedy używasz Dockera, ale kiedy zaczynasz kopać w pewne polecenia,
‫takie jak polecenie historii, inspekcja i zatwierdzenie, zaczynasz mieć poczucie, że obraz
‫nie jest jakąś dużą plamą danych, które przychodzi i idzie w jednym wielkim kawałku.
‫Dobrze?
‫Jeśli zauważysz, że faktycznie robiliśmy Dockera, w pewnych momentach możesz zobaczyć słowa, które
‫wskazują, że jest coś, co już masz, tak jakbyś już zbezcześcił część tego,
‫i wszystko sprowadzało się do tego, że obrazy są zaprojektowane przy użyciu koncepcja systemu plików unii tworzenia
‫warstw na temat zmian.
‫Gdybyśmy mogli szybko spojrzeć na to, co mamy w Dockerze ... w obrazach Dockera ...
‫Jakiś czas temu bawiliśmy się z tagami za pomocą Nginx. Dobrze? Pamiętamy, że identyfikator obrazu
‫Nginx jest taki sam i mamy różne tagi dla tej samej nazwy obrazu.
‫Zróbmy więc szybką historię dokowania na najnowszym nginx.
‫Na co ja tu patrzę?
‫Nie jest to lista rzeczy, które faktycznie miały miejsce w kontenerze, ponieważ dotyczą one obrazu.
‫Jest to w rzeczywistości historia warstw obrazu.
‫Każdy obraz zaczyna się od samego początku z pustą warstwą znaną jako scratch.
‫Następnie każdy zestaw zmian, które następują po tym w systemie plików, na obrazie, to kolejna warstwa.
‫Możesz mieć jedną warstwę, możesz mieć dziesiątki warstw, a niektóre warstwy mogą nie zmieniać
‫rozmiaru pliku.
‫Zauważysz tutaj, że faktycznie mamy tutaj zmianę, która była po prostu zmianą metadanych o tym,
‫które polecenie będziemy uruchamiać. Omówimy to trochę, kiedy przejdziemy przez
‫Dockerfile.
‫Ale na razie możesz zobaczyć, że ta dodała ogromną liczbę plików, która wynosiła 123 MB.
‫Potem dokonaliśmy zmiany tutaj i zmiany tutaj i zdaję sobie sprawę, że z
‫powodu Dockerfiles są to po prostu informacje o metadanych Dockerfile.
‫Gdy idziesz w górę, mamy trochę więcej zmian danych.
‫Zobaczysz, że jest to zupełnie inne na innym obrazie.
‫Jeśli przejdziemy do historii mysql w doku, ma on zupełnie inny zestaw warstw obrazu.
‫Pozwól, że trochę ci to narysuję i może to ci pomoże.
‫Gdy rozpoczynamy tworzenie obrazu, gdy
‫tworzyliśmy nowy obraz, zaczynamy od jednej warstwy. Każda warstwa otrzymuje swój własny unikalny SHA, który pomaga systemowi zidentyfikować, czy ta
‫warstwa rzeczywiście jest taka sama jak inna warstwa.
‫Powiedzmy, że na początku jednego z twoich możesz mieć Ubuntu na samym dole.
‫To pierwsza warstwa na twoim wizerunku.
‫Następnie tworzysz plik Dockerfile, który dodaje trochę więcej plików i jest to kolejna warstwa na
‫wierzchu tego obrazu. Może używamy Apt do tego.
‫Następnie w pliku Dockerfile dokonujesz zmiany zmiennej środowiskowej. To razem jest twoim obrazem.
‫DOBRZE?
‫Możesz mieć inny obraz, który zaczyna się od debiana: jessie, a następnie na tym obrazie
‫możesz również użyć Apt
‫do zainstalowania pewnych rzeczy, powiedzmy MySQL. Możesz skopiować niektóre pliki, możesz otworzyć port.
‫Tak więc każda z tych zmian, które zwykle robisz w pliku Dockerfile, możesz również wykonać za
‫pomocą polecenia docker commit, za które za chwilę się wymeldujemy.
‫To także kolejny obraz i wszystkie są ze sobą powiązane.
‫Co się stanie, jeśli mam inny obraz, który również używa tej samej wersji jessie?
‫Ten obraz może mieć własne zmiany na samej
‫warstwie, którą mam w pamięci podręcznej. W tym miejscu podstawowa koncepcja pamięci podręcznej warstw
‫obrazu oszczędza nam mnóstwo czasu i przestrzeni. Ponieważ nie musimy pobierać warstw, które już
‫mamy, i pamiętaj, że używają unikalnego SHA dla każdej warstwy, więc gwarantuje to
‫dokładnie taką warstwę, jakiej potrzebuje. Wie, jak dopasować je między Docker Hub i naszą lokalną pamięcią podręczną. Gdy wprowadzamy zmiany
‫w naszych obrazach, tworzą one kolejne warstwy.
‫Jeśli zdecydujemy, że chcemy, aby ten sam obraz był podstawowym obrazem dla większej liczby warstw, to przechowywany
‫jest tylko jeden egzemplarz każdej warstwy.
‫W tym systemie naprawdę jedną z największych korzyści jest to, że nigdy nie przechowujemy tych samych danych obrazu więcej niż
‫jeden raz w naszym systemie plików.
‫Oznacza to również, że podczas przesyłania i pobierania nie musimy przesyłać
‫i pobierać
‫tych samych warstw, które mamy już po drugiej stronie. Jeśli miałbyś mieć swój własny obraz i
‫to było niestandardowe, że zrobiłeś sam siebie, a potem dodałeś, powiedzmy, serwer Apache na wierzchu, jako kolejną warstwę
‫w twoim pliku Dockerfile, a następnie otworzysz port 80. Na samym końcu kazałeś mu kopiować kod źródłowy, ale tak naprawdę skończyło się na
‫dwóch różnych plikach Docker dla dwóch różnych stron internetowych, a każda linia w
‫Dockerfiles była taka sama z wyjątkiem tego ostatniego trochę, gdzie skopiowałeś Witrynę A do obrazu, a następnie
‫do strony B, otrzymasz dwa obrazy. Pokażemy to za chwilę. Tworzy jeden obraz i
‫tworzy jeden obraz, ale jedyne pliki, które są faktycznie przechowywane, to ta, ta,
‫ta warstwa, a następnie ta mała warstwa, a następnie ta mała warstwa.
‫Więc nigdy nie przechowujemy całego stosu warstw obrazu więcej niż jeden raz, jeśli to naprawdę te same warstwy.
‫Jak to działa z pojemnikami?
‫Jeśli masz swój obraz, załóżmy, że mamy obraz Apache i zdecydowaliśmy się uruchomić z niego kontener, a
‫wszystko, co robi Docker, to tworzy nową warstwę do odczytu / zapisu dla tego kontenera
‫na szczycie tego obrazu Apache. Kiedy przeglądamy system plików i te rzeczy, wszystkie
‫kontenery i obrazy wyglądają po prostu jak zwykły system plików, ale pod sterownikiem pamięci masowej używanym przez Docker
‫jest w rzeczywistości nakładanie warstw, jak w stosie naleśników, wszystkie te zmiany
‫na jeden na drugim.
‫Więc jeśli uruchomiłbym dwa pojemniki jednocześnie z tego samego obrazu Apache, pojemnik 1 i pojemnik 2 byłyby wyświetlane tylko
‫pod względem przestrzeni plików, to tylko różnicowanie między tym, co się stało na tym
‫działającym pojemniku na żywo i czym dzieje się na obrazie podstawowym, który jest tylko do odczytu.
‫Gdy używasz kontenerów i zmieniasz pliki, które przechodzą przez obrazek, załóżmy,
‫że uruchomiłem kontener 3, a ja faktycznie wszedłem i zmieniłem plik, który był na tym obrazie w uruchomionym
‫kontenerze ...
‫jest to znane jako kopiowanie przy zapisie.
‫To co robi, to system plików wyjmie ten plik z obrazu i skopiuje go do tego różnicującego ...
‫tu na górze... i zapisz kopię tego pliku w warstwie kontenera.
‫Teraz kontener jest tak naprawdę tylko działającym procesem i plikami,
‫które różnią się od nich na obrazie Apache.
‫Jeśli wrócimy do naszej listy obrazów i ponownie przyjrzymy się tym komendom, spojrzymy na
‫dolną i zobaczymy, jak daty są różne? Możemy zobaczyć, jak ten obraz został zmieniony w Docker
‫Hub i był aktualizowany w czasie, że zmiany te nie zostały zmienione
‫w najniższej warstwie w ciągu czterech tygodni, a następnie ostatnie zmiany miały miejsce w ciągu ostatnich
‫dwóch tygodni.
‫A tak przy okazji, nie martw się o brakującą część.
‫To właściwie tylko mylące znaczenie w interfejsie Docker.
‫Nie oznacza to, że coś jest nie tak lub jest źle skonfigurowane. Co to znaczy, że tak naprawdę ten obraz mysql
‫właśnie tutaj jest tym identyfikatorem obrazu.
‫Pozostałe warstwy na obrazie nie są w rzeczywistości obrazami.
‫Są tylko warstwami wewnątrz tego
‫obrazu, więc nie muszą mieć tam własnego identyfikatora obrazu.
‫Osobiście uważam, że w interfejsie jest to trochę mylące, ale tak to napisali.
‫Teraz, gdy mamy już wrażenie polecenia historii, aby
‫pokazać nam, z jakiego obrazu może powstać, użyjmy polecenia inspect.
‫To, co to robi, daje nam wszystkie szczegóły dotyczące obrazu.
‫Jest to w zasadzie metadane. Pamiętasz, kiedy rozmawialiśmy o tym, że
‫obraz składa się z dwóch części, plików binarnych
‫i ich zależności, a następnie metadanych dotyczących tego obrazu? Cóż, inspekcja oddaje Ci metadane.
‫Oprócz podstawowych informacji, takich jak identyfikator obrazu i jego znaczniki, można uzyskać wszystkie szczegóły dotyczące tego, w jaki sposób ten
‫obraz ma być uruchamiany.
‫W rzeczywistości ma opcję ujawnienia tych dwóch portów wewnątrz obrazu, aby wiedzieć, kiedy chcesz go
‫uruchomić, które porty należy otworzyć w hoście Docker, jeśli chcesz akceptować połączenia.
‫Możesz zobaczyć, że zmienne środowiskowe zostały przekazane, w tym wersja
‫Nginx, która działa i ścieżka. Możesz zobaczyć polecenie, które będzie uruchamiane po domyślnym
‫uruchomieniu obrazu.
‫Ponownie, wiele z tych rzeczy może zostać zmienionych tak jak wcześniej z poleceniem uruchomienia
‫kontenera dokera.
‫Ale pokazują nam one wszystkie domyślne ustawienia i kilka innych interesujących informacji, takich jak
‫autor, i na dole, że jest to architektura AMD64, która w zasadzie jest normalna dla wszystkich normalnych
‫komputerów PC i Mac.
‫W rzeczywistości nie mamy zbyt wiele 32-bitowych maszyn, więc jest to tylko standardowa 64-bitowa
‫architektura Intela i została zaprojektowana do działania na systemie Linux.
‫Dobra, krótka recenzja.
‫Dlatego nauczyliśmy się dużo o obrazach i sposobie ich tworzenia, i dowiadujemy się,
‫że w rzeczywistości nie są tak skomplikowane. Naprawdę, to tylko seria zmian w systemie plików i metadanych na temat tych zmian.
‫Dowiedziałeś się, że każda warstwa ma swoją własną unikalną tożsamość jako SHA.
‫Są one przechowywane tylko raz w każdym systemie, więc w przypadku każdego demona Docker każda warstwa jest reprezentowana tylko
‫raz w systemie plików.
‫To daje nam dużo oszczędności w przestrzeni, a także czas transferu w przesyłaniu obrazów
‫pomiędzy rejestrami, jak Docker Hub. I tak naprawdę, kiedy
‫uruchamiasz kontener, jest to tylko jedna warstwa zmian nad istniejącym obrazem.
‫Więc w rzeczywistości jest zwykle bardzo mały. Dowiedzieliśmy się o historii i sprawdzaliśmy polecenia oraz jak
‫mogą nas nauczyć, co dzieje się wewnątrz obrazu i jak zostało wykonane.