Korzystając z Dockera, zaczynamy od obrazu podstawowego. Uruchamiamy go, tworzymy zmiany, które są zapisywane w warstwach tworzących inny obraz.
Więc w końcu mam obraz dla mojej instancji PostgreSQL i obraz dla mojej aplikacji internetowej, zmiany, które wciąż się utrzymują.
Co to jest pojemnik?
źródło
Z mojego artykułu na temat automatyzacji wdrożeń dokerów :
Obrazy dokerów kontra kontenery
W Dockerland są obrazy i pojemniki . Oba są ściśle powiązane, ale odrębne. Dla mnie zrozumienie tej dychotomii ogromnie wyjaśniło Dockerowi.
Co to jest obraz?
Obraz jest obojętnym, niezmiennym plikiem, który jest zasadniczo migawką kontenera. Obrazy są tworzone za pomocą komendy build i po uruchomieniu z runem utworzą kontener . Obrazy są przechowywane w rejestrze Docker, takim jak register.hub.docker.com . Ponieważ mogą one stać się dość duże, obrazy są zaprojektowane tak, aby składały się z warstw innych obrazów, co pozwala na przesłanie minimalnej ilości danych podczas przesyłania obrazów przez sieć.
Lokalne obrazy można wyświetlić, uruchamiając
docker images
:Kilka rzeczy do zapamiętania:
-t
flagidocker build
polecenia lub zdocker tag
-ing istniejącego obrazu. Możesz oznaczać obrazy za pomocą nomenklatury, która ma dla ciebie sens, ale wiedz, że doker użyje tego znacznika jako lokalizacji rejestru wdocker push
lubdocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. W przypadkuubuntu
powyższego wnioskuje się, że REGISTRYHOSTregistry.hub.docker.com
. Więc jeśli planujesz przechowywać obraz wywoływanymy-application
w rejestrze wdocker.example.com
, powinieneś oznaczyć ten obrazdocker.example.com/my-application
.latest
Tag nie jest magiczne, to po prostu domyślny tag jeśli nie określisz znacznik.<none>
TAG i repozytorium. Łatwo o nich zapomnieć.Więcej informacji na temat obrazów można znaleźć w dokumentacji i glosariuszu Docker .
Co to jest pojemnik?
Aby użyć metafory programowania, jeśli obraz jest klasą, to kontener jest instancją klasy - obiektem wykonawczym. Mamy nadzieję, że kontenery używają Dockera; są lekkimi i przenośnymi obudowami środowiska, w którym można uruchamiać aplikacje.
Przeglądaj lokalne działające kontenery za pomocą
docker ps
:Tutaj uruchamiam dokowaną wersję rejestru rejestru, dzięki czemu mam prywatne miejsce do przechowywania moich zdjęć. Znów kilka rzeczy do zapamiętania:
docker ps
wyświetla tylko działające kontenery. Możesz wyświetlić wszystkie kontenery ( uruchomione lub zatrzymane ) za pomocądocker ps -a
.--name
flagi.Jak uniknąć gromadzenia obrazu i kontenera
Jedną z moich wczesnych frustracji związanych z Dockerem było pozornie ciągłe gromadzenie się nieoznaczonych obrazów i zatrzymanych pojemników . W kilku przypadkach takie nagromadzenie powodowało, że maksymalne dyski twarde spowalniały mój laptop lub wstrzymywały proces automatycznego budowania. Mów o „wszędzie kontenerach”!
Możemy usunąć wszystkie nieoznaczone obrazy, łącząc się
docker rmi
z ostatnimdangling=true
zapytaniem:docker images -q --filter "dangling=true" | xargs docker rmi
Docker nie będzie w stanie usunąć obrazów znajdujących się za istniejącymi kontenerami, więc może być konieczne usunięcie
docker rm
najpierw zatrzymanych kontenerów :Są to znane dolegliwości związane z Dockerem i mogą zostać uwzględnione w przyszłych wydaniach. Jednak dzięki jasnemu zrozumieniu obrazów i pojemników można uniknąć tych sytuacji za pomocą kilku praktyk:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.źródło
docker image prune
do czyszczenia zwisających obrazów. Przycinaj nieużywane obiekty Dockerdocker system prune
do czyszczenia WSZYSTKIEGOW prostych słowach.
Obrazy -
Pojemniki -
Inne ważne warunki, na które należy zwrócić uwagę:
Demon dokowania -
Klient Docker -
Docker Store -
Zdjęcie z tego posta na blogu jest warte tysiąca słów.
(W celu głębszego zrozumienia przeczytaj to .)
Podsumowanie:
docker run image_name:tag_name
) => Daje działający obraz tj. Kontener (edytowalny)źródło
Chociaż najłatwiej jest myśleć o pojemniku jako działającym obrazie, nie jest to jednak do końca dokładne.
Obraz jest tak naprawdę szablonem, który można przekształcić w pojemnik. Aby przekształcić obraz w kontener, silnik Docker bierze obraz, dodaje system plików do odczytu i zapisu na górze i inicjuje różne ustawienia, w tym porty sieciowe, nazwę kontenera, identyfikator i limity zasobów. Uruchamianie procesu pojemnik ma aktualnie wykonywanego, a pojemnik może być również zatrzymany (lub zakończony w terminologii dokowanym'S). Opuszczony kontener to nie to samo co obraz, ponieważ można go zrestartować i zachowa swoje ustawienia oraz wszelkie zmiany systemu plików.
źródło
docker create
.Może wyjaśnienie całego przepływu pracy może pomóc.
Wszystko zaczyna się od pliku Docker . Plik Docker to kod źródłowy obrazu.
Po utworzeniu pliku Docker budujesz go, aby utworzyć obraz kontenera. Obraz jest po prostu „skompilowaną wersją” „kodu źródłowego”, którym jest plik Docker.
Po uzyskaniu obrazu kontenera należy go ponownie rozpowszechnić za pomocą rejestru . Rejestr przypomina repozytorium Git - możesz wypychać i pobierać obrazy.
Następnie możesz użyć obrazu do uruchamiania kontenerów . Działający kontener jest pod wieloma względami bardzo podobny do maszyny wirtualnej (ale bez hiperwizora ).
źródło
Przepływ pracy
Oto pełny przepływ pracy pokazujący różne polecenia oraz powiązane z nimi dane wejściowe i wyjściowe. To powinno wyjaśnić związek między obrazem a pojemnikiem.
Aby wyświetlić listę obrazów, które można uruchomić, wykonaj:
Aby wyświetlić listę kontenerów, na których można wykonywać polecenia:
źródło
Nie mogłem zrozumieć koncepcji obrazu i warstwy, pomimo przeczytania wszystkich pytań tutaj, a potem natknąłem się na tę doskonałą dokumentację Dockera (duh!).
Przykład jest naprawdę kluczem do zrozumienia całej koncepcji. Jest to długi post, więc podsumowuję kluczowe kwestie, które należy naprawdę zrozumieć, aby uzyskać jasność.
Obraz : Obraz Dockera jest zbudowany z szeregu warstw tylko do odczytu
Warstwa : Każda warstwa reprezentuje instrukcję w pliku Docker obrazu.
Example
: Poniższy plik Docker zawiera cztery polecenia, z których każde tworzy warstwę.Co ważne , każda warstwa jest tylko zbiorem różnic w stosunku do warstwy przed nią.
Zrozumienie obrazów i kontenerów z perspektywy rozmiaru na dysku
Aby wyświetlić przybliżony rozmiar działającego kontenera, możesz użyć
docker ps -s
polecenia. Otrzymaszsize
ivirtual size
jako dwa wyjścia:Rozmiar: ilość danych (na dysku), która jest używana dla zapisywalnej warstwy każdego kontenera
Rozmiar wirtualny: ilość danych użytych do danych obrazu tylko do odczytu używanych przez kontener. Wiele kontenerów może współdzielić niektóre lub wszystkie dane obrazu tylko do odczytu. Dlatego nie są addytywne. Oznacza to, że nie można dodać wszystkich wirtualnych rozmiarów, aby obliczyć, jaki rozmiar na dysku jest używany przez obraz
Inną ważną koncepcją jest strategia kopiowania przy zapisie
Jeśli plik lub katalog istnieje w dolnej warstwie obrazu, a inna warstwa (w tym warstwa do zapisu) potrzebuje do niego dostępu do odczytu, po prostu korzysta z istniejącego pliku. Za pierwszym razem, gdy inna warstwa musi zmodyfikować plik (podczas budowania obrazu lub uruchamiania kontenera), plik jest kopiowany do tej warstwy i modyfikowany.
Mam nadzieję, że pomoże to komuś takiemu jak ja.
źródło
Plik dokowania → (Kompilacja) → Obraz → (Uruchom) → Kontener .
Plik Docker : zawiera zestaw instrukcji Docker, które zapewniają systemowi operacyjnemu upodobanie i instalują / konfigurują całe oprogramowanie.
Zdjęcie : skompilowany plik Docker. Oszczędza czas od przebudowywania Dockerfile za każdym razem, gdy trzeba uruchomić kontener. Jest to sposób na ukrycie kodu rezerwowego.
Kontener : sam wirtualny system operacyjny. Możesz do niego ssh i uruchamiać dowolne polecenia, tak jakby to było prawdziwe środowisko. Możesz uruchomić ponad 1000 kontenerów z tego samego obrazu.
źródło
Mówiąc prosto, jeśli obraz jest klasa , a następnie pojemnik jest instancją klasy jest czas pracy obiektu .
źródło
Kontener jest wykonywalnym plikiem binarnym, który ma być uruchamiany przez system operacyjny hosta zgodnie z zestawem ograniczeń, które są wstępnie ustawione za pomocą aplikacji (np. Docker), która wie, jak powiedzieć systemowi operacyjnemu, jakie ograniczenia należy zastosować.
Typowe ograniczenia dotyczą izolacji procesu, bezpieczeństwa (na przykład korzystania z ochrony SELinux ) i zasobów systemowych (pamięci, dysku, procesora i sieci).
Do niedawna tylko jądra w systemach uniksowych obsługiwały możliwość uruchamiania plików wykonywalnych pod ścisłymi ograniczeniami. Dlatego większość dzisiejszych rozmów na temat kontenerów dotyczy głównie Linuksa lub innych dystrybucji Uniksa.
Docker jest jedną z tych aplikacji, które wiedzą, jak powiedzieć systemowi operacyjnemu (głównie Linuxowi), jakie ograniczenia należy uruchamiać. Plik wykonywalny jest zawarty w obrazie Docker, który jest tylko plikiem tar. Plik wykonywalny jest zwykle okrojoną wersją dystrybucji Linuksa (Ubuntu, CentOS, Debian itp.) Wstępnie skonfigurowanej do uruchamiania jednej lub więcej aplikacji.
Chociaż większość osób używa Linuksa jako pliku wykonywalnego, może to być dowolna inna aplikacja binarna, o ile system operacyjny hosta może go uruchomić (patrz tworzenie prostego obrazu podstawowego za pomocą scratch ). Niezależnie od tego, czy plik binarny w obrazie Docker jest systemem operacyjnym, czy po prostu aplikacją, dla hosta systemu operacyjnego jest to po prostu inny proces, zamknięty proces rządzony ustalonymi granicami systemu operacyjnego.
Inne aplikacje, takie jak Docker, mogą określić system operacyjny hosta, jakie granice zastosować do procesu podczas jego działania, takich jak LXC , libvirt i systemd . Docker używał tych aplikacji do pośredniej interakcji z systemem operacyjnym Linux, ale teraz Docker współdziała bezpośrednio z Linuksem za pomocą własnej biblioteki o nazwie „ libcontainer ”.
Tak więc kontenery to tylko procesy działające w trybie ograniczonym, podobnie jak to robił chroot .
IMO wyróżnia Docker spośród innych technologii kontenerów za pomocą repozytorium (Docker Hub) i narzędzi do zarządzania, dzięki czemu praca z kontenerami jest niezwykle łatwa.
Zobacz Docker (oprogramowanie) .
źródło
Podstawową koncepcją Dockera jest ułatwienie tworzenia „maszyn”, które w tym przypadku można uznać za kontenery. Pojemnik pomaga w ponownym użyciu, umożliwiając łatwe tworzenie i upuszczanie pojemników.
Obrazy przedstawiają stan kontenera w każdym momencie. Podstawowy przepływ pracy to:
źródło
Wiele odpowiedzi wskazywało na to: budujesz plik Docker, aby uzyskać obraz, i uruchamiasz obraz, aby uzyskać kontener .
Jednak następujące kroki pomogły mi lepiej poznać obraz i kontener Dockera:
1) Zbuduj plik Docker:
docker build -t my_image dir_with_dockerfile
2) Zapisz obraz do
.tar
plikudocker save -o my_file.tar my_image_id
my_file.tar
zapisze obraz. Otwórz za pomocątar -xvf my_file.tar
, a zobaczysz wszystkie warstwy. Jeśli zanurkujesz głębiej w każdą warstwę, możesz zobaczyć, jakie zmiany zostały dodane w każdej warstwie. (Powinny być bardzo zbliżone do poleceń w pliku Docker).3) Aby zajrzeć do wnętrza pojemnika, możesz:
sudo docker run -it my_image bash
i widać, że to bardzo przypomina system operacyjny.
źródło
Obraz jest równoważny definicji klasy w OOP, a warstwy to różne metody i właściwości tej klasy.
Kontener to rzeczywista instancja obrazu, podobnie jak obiekt jest instancją lub instancją klasy.
źródło
Myślę, że lepiej wyjaśnić na początku.
Załóżmy, że uruchomiłeś polecenie
docker run hello-world
. Co się dzieje?Wywołuje CLI Docker, który jest odpowiedzialny za przyjmowanie poleceń Docker i przekształcanie w celu wywoływania poleceń serwera Docker . Gdy tylko serwer Docker otrzyma polecenie uruchomienia obrazu , sprawdza pogodę, że pamięć podręczna obrazów zawiera obraz o takiej nazwie.
Załóżmy, że hello-world nie istnieje. Serwer Docker idzie do Docker Hub (Docker Hub to tylko bezpłatne repozytorium obrazów) i pyta, hej Hub, czy masz obraz o nazwie
hello-world
? Odpowiedzi centrum - tak, rozumiem. Daj mi to, proszę. I rozpoczyna się proces pobierania. Po pobraniu obrazu Docker serwer Docker umieszcza go w pamięci podręcznej obrazu .Zanim wyjaśnimy, czym są obrazy Docker i kontenery Docker, zacznijmy od wprowadzenia o systemie operacyjnym na twoim komputerze i sposobie działania oprogramowania.
Kiedy uruchamiasz na przykład Chrome na swoim komputerze, wywołuje on system operacyjny, sam system operacyjny wywołuje jądro i pyta, hej, chcę uruchomić ten program. Jądro potrafi uruchamiać pliki z dysku twardego.
Teraz wyobraź sobie, że masz dwa programy, Chrome i Node.js. Chrome wymaga uruchomienia Python w wersji 2, a Node.js wymaga Python w wersji 3 do uruchomienia. Jeśli zainstalowałeś tylko Python v2 na swoim komputerze, uruchomiony zostanie tylko Chrome.
Aby oba przypadki działały, musisz w jakiś sposób użyć funkcji systemu operacyjnego znanej jako przestrzeń nazw. Przestrzeń nazw to funkcja umożliwiająca izolowanie procesów, dysku twardego, sieci, użytkowników, nazw hostów i tak dalej.
Kiedy mówimy o obrazie, tak naprawdę mówimy o migawce systemu plików. Obraz jest plik fizyczny, który zawiera wskazówki i metadane zbudować konkretny pojemnik . Sam kontener jest instancją obrazu ; izoluje dysk twardy za pomocą przestrzeni nazw dostępnej tylko dla tego kontenera . Tak więc zbiornik jest procesem lub zestaw procesów, które grupuje różne zasoby przypisane do niego.
źródło
Obraz Docker pakuje aplikację i środowisko wymagane przez aplikację do uruchomienia, a kontener jest działającą instancją obrazu.
Obrazy są częścią opakowania Dockera, analogiczną do „kodu źródłowego” lub „programu”. Kontenery są częścią wykonawczą Dockera, analogicznie do „procesu”.
W pytaniu odnosi się tylko do części „programowej” i to jest obraz. „Działającą” częścią Dockera jest kontener. Gdy kontener jest uruchamiany i wprowadzane są zmiany, to tak, jakby proces dokonał zmiany własnego kodu źródłowego i zapisał go jako nowy obraz.
źródło
Podobnie jak w aspekcie programowania
Obraz jest kodem źródłowym.
Gdy kod źródłowy jest kompilowany i budować, nazywa się aplikacja.
Podobnie jak „gdy instancja jest tworzona dla obrazu”, nazywa się ją „ kontenerem ”.
źródło
Obraz jest „migawki” z pojemnika . Możesz tworzyć obrazy z kontenera (nowe „migawki”), a także możesz uruchamiać nowe kontenery z obrazu (tworzyć „migawkę”).
Na przykład możesz utworzyć nowy kontener z obrazu podstawowego, uruchomić niektóre polecenia w kontenerze, a następnie wykonać migawkę jako nowy obraz. Następnie możesz uruchomić 100 kontenerów z tego nowego obrazu.
Inne rzeczy do rozważenia:
docker images
.źródło
Chciałbym wypełnić brakującą część tutaj między
docker images
acontainers
. Docker używa unijnego systemu plików ( UFS ) dla kontenerów, który umożliwia podłączenie wielu systemów plików w hierarchii i wyświetlenie ich jako pojedynczego systemu plików. System plików z obrazu został zamontowany jakoread-only
warstwa, a wszelkie zmiany w uruchomionym kontenerze są wprowadzane wread-write
warstwie zamontowanej na nim. Z tego powodu Docker musi tylko spojrzeć na najwyższą warstwę do odczytu i zapisu, aby znaleźć zmiany wprowadzone w działającym systemie.źródło
Dla fałszywej analogii programowania można pomyśleć, że Docker ma abstrakcyjny ImageFactory, który przechowuje ImageFactories, które pochodzą ze sklepu .
Następnie, gdy chcesz utworzyć aplikację z tego ImageFactory, będziesz mieć nowy pojemnik i możesz go modyfikować według własnego uznania. DotNetImageFactory będzie niezmienny, ponieważ działa jak abstrakcyjna klasa fabryczna, w której dostarcza tylko pożądane instancje.
źródło
W skrócie:
Kontener to podział (wirtualny) w jądrze, który ma wspólny system operacyjny i uruchamia obraz (obraz Docker).
Kontener jest samowystarczalną aplikacją, która będzie zawierała pakiety i wszystkie niezbędne zależności, aby uruchomić kod.
źródło
Kontener Docker uruchamia instancję obrazu. Możesz powiązać obraz z programem i kontener z procesem :)
źródło
Obraz jest klasą jako kontener obiektu.
Kontener jest instancją obrazu, ponieważ obiekt jest instancją klasy.
źródło
Plik Docker jest podobny do skryptu Bash, który tworzy plik tarball (obraz Docker).
Kontenery Docker są jak wyodrębniona wersja tarballa. Możesz mieć tyle kopii, ile chcesz w różnych folderach (kontenerach).
źródło