Jaka jest różnica między obrazem Docker a kontenerem?


921

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?

Odpowiedzi:


1240

Instancja obrazu nazywa się kontenerem. Masz obraz, który jest zestawem warstw, które opisujesz. Jeśli uruchomisz ten obraz, masz działający kontener tego obrazu. Możesz mieć wiele działających kontenerów tego samego obrazu.

Możesz zobaczyć wszystkie swoje zdjęcia, docker imagespodczas gdy możesz zobaczyć swoje uruchomione kontenery za pomocą docker ps(i możesz zobaczyć wszystkie kontenery za pomocą docker ps -a).

Tak więc działająca instancja obrazu jest kontenerem.


106
Jaka jest różnica między obrazem a zatrzymanym pojemnikiem?
Victor Dombrovsky,

341
obraz to przepis, pojemnik to ciasto ;-) z danego przepisu możesz zrobić tyle ciast, ile chcesz
Julien

142
@VictorDombrovsky Zatrzymany pojemnik to ciasto w zamrażarce.
Jacob Ford

44
@Julien, jeśli obraz jest przepisem, co powiesz na plik Dockerfile? :)
Johnny Willer

71
@JohnnyWiller Analogie mają swoje ograniczenia, ale może widzimy, że Dockerfile to twoja lista zakupów składników ;-). W przeciwnym razie nazwij plik Docker plikiem przepisem, obraz pleśnią, pojemnik nadal jest pysznym ciastem
Julien

585

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:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

Kilka rzeczy do zapamiętania:

  1. IMAGE ID to pierwsze 12 znaków prawdziwego identyfikatora obrazu. Możesz utworzyć wiele tagów danego obrazu, ale ich identyfikatory będą takie same (jak wyżej).
  2. WIRTUALNY ROZMIAR jest wirtualny, ponieważ sumuje rozmiary wszystkich różnych leżących poniżej warstw. Oznacza to, że suma wszystkich wartości w tej kolumnie jest prawdopodobnie znacznie większa niż miejsce na dysku używane przez wszystkie te obrazy.
  3. Wartość w kolumnie REPOSITORY pochodzi z -tflagi docker buildpolecenia lub z docker 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 w docker pushlub docker pull.
  4. Pełna forma tagu to [REGISTRYHOST/][USERNAME/]NAME[:TAG]. W przypadku ubuntupowyższego wnioskuje się, że REGISTRYHOST registry.hub.docker.com. Więc jeśli planujesz przechowywać obraz wywoływany my-applicationw rejestrze w docker.example.com, powinieneś oznaczyć ten obraz docker.example.com/my-application.
  5. Kolumna TAG jest tylko częścią [: TAG] pełnego tagu. To niefortunna terminologia.
  6. latestTag nie jest magiczne, to po prostu domyślny tag jeśli nie określisz znacznik.
  7. Nieoznaczone zdjęcia można rozpoznać tylko na podstawie ich identyfikatorów. Te dostanie <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:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

Tutaj uruchamiam dokowaną wersję rejestru rejestru, dzięki czemu mam prywatne miejsce do przechowywania moich zdjęć. Znów kilka rzeczy do zapamiętania:

  1. Podobnie jak IMAGE ID, CONTAINER ID jest prawdziwym identyfikatorem kontenera. Ma tę samą formę, ale identyfikuje inny rodzaj obiektu.
  2. docker pswyświetla tylko działające kontenery. Możesz wyświetlić wszystkie kontenery ( uruchomione lub zatrzymane ) za pomocą docker ps -a.
  3. NAZWY mogą być użyte do identyfikacji uruchomionego kontenera za pomocą --nameflagi.

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 rmiz ostatnim dangling=truezapytaniem:

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 rmnajpierw zatrzymanych kontenerów :

docker rm `docker ps --no-trunc -aq`

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:

  1. Zawsze usuwaj bezużyteczny, zatrzymany pojemnik za pomocą docker rm [CONTAINER_ID].
  2. Zawsze usuwaj obraz za bezużyteczny, zatrzymany pojemnik docker rmi [IMAGE_ID].

5
Dobre różnicowanie obrazów bte i kontenera. Bardzo pomaga początkującym jak ja.
Gibbs,

2
Myślę, że utknąłem na tym, jak działają obrazy (używam boot2docker w systemie Windows). Dlaczego tworzymy obrazy dla aplikacji, powiedzmy mysql? W tym momencie, jak działa mysql? Czy nie muszę mieć obrazu Linuksa, aby móc uruchomić mysql?
Kenny Worden,

W rzeczywistości nie jest to prawdą: „okno dokowane przeciągając: najnowszy znacznik obrazu doda co najmniej dwa obrazy do lokalnej listy obrazów: jeden z najnowszym znacznikiem i jeden dla każdego oryginalnego znacznika najnowszego obrazu, np. 14.04 i trysty powyżej ”. Dodanie tylko jednego obrazu z najnowszym tagiem. Wyciągnięcie 14.04 później może być niemożliwe, jeśli identyfikator obrazu jest taki sam, ale nadal wymaga osobnego ściągnięcia.
Adrian Mouat

4
W nowszych wersjach okna dokowanego można użyć docker image prunedo czyszczenia zwisających obrazów. Przycinaj nieużywane obiekty Docker
Dario Seidl

3
Po prostu używam docker system prunedo czyszczenia WSZYSTKIEGO
Rami Alloush,

137

W prostych słowach.

Obrazy -

Aplikacja systemu plików i konfiguracji (tylko do odczytu) służąca do tworzenia kontenerów. Więcej szczegółów .

Pojemniki -

Są to uruchomione wystąpienia obrazów Docker. Kontenery uruchamiają rzeczywiste aplikacje. Kontener zawiera aplikację i wszystkie jej zależności. Dzieli jądro z innymi kontenerami i działa jako izolowany proces w przestrzeni użytkownika w systemie operacyjnym hosta. Więcej szczegółów .


Inne ważne warunki, na które należy zwrócić uwagę:


Demon dokowania -

Usługa działająca w tle działająca na hoście, która zarządza budowaniem, uruchomieniem i dystrybucją kontenerów Docker.

Klient Docker -

Narzędzie wiersza poleceń, które pozwala użytkownikowi na interakcję z demonem Docker.

Docker Store -

Sklep to między innymi rejestr obrazów Docker. Rejestr można traktować jako katalog wszystkich dostępnych obrazów Docker.

Zdjęcie z tego posta na blogu jest warte tysiąca słów.

Wpisz opis zdjęcia tutaj

(W celu głębszego zrozumienia przeczytaj to .)

Podsumowanie:

  • Pociągnąć obraz z piastą dokowanym lub produkcji ze Dockerfile => przedstawia obraz Docker (nieedytowalna).
  • Uruchom obraz ( docker run image_name:tag_name) => Daje działający obraz tj. Kontener (edytowalny)

1
Dzięki. Jakie jest źródło diagramu? czy to z oficjalnych dokumentów Dockera?

Opublikowane zdjęcie jest fantastyczne . Mam jeden problem: mówisz „Znalazłem go podczas czytania jakiegoś artykułu” - jeśli to nie jest twój schemat, moralnie ważne jest [i prawnie wymagane] uznanie w odpowiednim czasie („uznanie autorstwa”): Autorem oryginalnego obrazu jest WHO? Pierwotnie znaleziony pod jakim adresem URL?
ToolmakerSteve

@ToolmakerSteve Dzięki za wskazówkę, będę pamiętać i zaktualizuję odpowiedź, jak tylko znajdę źródło.
Imran Ahmad

126

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.


jak zmienić obraz w kontener bez uruchamiania go?
Janus Troelsen

12
@JanusTroelsen Use docker create.
Adrian Mouat,

To jest trochę mylące. Mówimy, że obrazy są niezmienne, ale gdy są uruchamiane jako kontener, przechowuje wszelkie zmiany w modyfikowalnej górnej warstwie, jak powiedziałeś. Ale czy po zatrzymaniu te zmiany są następnie zapisywane jako nowa warstwa na obrazie? Jeśli tak, to jak to możliwe, ponieważ oryginalny obraz miał być niezmienny?
Dchucks,

4
OK, przeczytałem trochę i uzyskałem odpowiedź w tym wątku. „Po usunięciu kontenera usuwana jest również warstwa do zapisu. Obraz poniżej pozostaje niezmieniony”.
Dchucks,

Bardzo pomocna odpowiedź. Byłem wcześniej zdezorientowany. Jeśli rysuję obraz, uruchom go jako kontener, umieść losowy plik tekstowy w tym kontenerze i zatrzymaj kontener, plik tekstowy znajduje się w zatrzymanym kontenerze, ale NIE pobrałem obrazu podstawowego.
James Allen

89

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 ).


44

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.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Aby wyświetlić listę obrazów, które można uruchomić, wykonaj:

docker image ls

Aby wyświetlić listę kontenerów, na których można wykonywać polecenia:

docker ps

1
Bardziej kompleksowy schemat przepływu pracy można znaleźć na stronie: stackoverflow.com/a/46528745/714112
Sridhar Sarnobat,

1
Ale wymagane przewijanie w tej sztuce ASCII stanowi problem.
Peter Mortensen

Zamiast tego można użyć Unicode, aby uzyskać ładniejsze pudełka. Narzędziem online jest wersja demonstracyjna JavaScript Box .
Peter Mortensen

40

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ę.

OD Ubuntu: 15.04

KOPIUJ . / app

URUCHOM markę / aplikację

CMD python /app/app.py

Co ważne , każda warstwa jest tylko zbiorem różnic w stosunku do warstwy przed nią.

  • Pojemnik . Podczas tworzenia nowego kontenera dodajesz nową warstwę do zapisu na wierzchu warstw leżących poniżej . Ta warstwa jest często nazywana „warstwą pojemnika”. Wszystkie zmiany wprowadzone w działającym kontenerze, takie jak pisanie nowych plików, modyfikowanie istniejących plików i usuwanie plików, są zapisywane w tej cienkiej zapisywalnej warstwie kontenera.

Dlatego główną różnicą między pojemnikiem a obrazem jest górna warstwa do zapisu . Wszystkie zapisy w kontenerze, które dodają nowe lub modyfikują istniejące dane, są przechowywane w tej zapisywalnej warstwie. Po usunięciu kontenera usuwana jest również warstwa do zapisu. Podstawowy obraz pozostaje niezmieniony.

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 -spolecenia. Otrzymasz sizei virtual sizejako 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.


1
Dzięki za ten komentarz potwierdza różnicę między rozmiarem a rozmiarem wirtualnym i jest bardzo interesujący dla wielu kontenerów, które współużytkują te same dane tylko do odczytu i jest to miejsce na dysku dla zysku.
user1842947

34

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.


Doskonała analogia. Gdybym mógł dać ci 1000 kciuków w górę, zrobiłbym to.
Rich Lysakowski PhD

16

Mówiąc prosto, jeśli obraz jest klasa , a następnie pojemnik jest instancją klasy jest czas pracy obiektu .


13

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) .


12

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:

  1. utwórz obraz
  2. uruchomić pojemnik
  3. dokonać zmian w kontenerze
  4. zapisz pojemnik z powrotem jako obraz

8

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 .tarpliku

docker save -o my_file.tar my_image_id

my_file.tarzapisze 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.


6

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.


4

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.


3

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.


3

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 ”.


1
Plik Docker jest jak kod źródłowy. Obraz jest jak plik wykonywalny po skompilowaniu / zbudowaniu kodu źródłowego. Kontener jest jak aplikacja uruchamiana z pliku wykonywalnego.
ejlp12

Obraz NIE jest kodem źródłowym kontenera. Plik dokowania to metaklasa lub specyfikacja klasy. Obraz jest klasą lub szablonem kontenera, a kontener jest instancją klasy. Kontener jest instancją, która działa. Możesz mieć 1000 instancji klasy. Obraz jest jak skompilowany kod obiektowy, który można połączyć z innym programem i uruchomić jako część tego programu.
Rich Lysakowski PhD

3

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:

  • Obraz składa się z warstw, a warstwy to migawki „diffs” (więc kiedy naciskasz obraz, wystarczy wysłać „diff” do rejestru).
  • Plik Docker definiuje niektóre polecenia na górze obrazu podstawowego, który tworzy nowe warstwy („diffs”), które dają nowy obraz („snapshot”).
  • Tagi graficzne to nie tylko tagi. Są to „pełna nazwa” obrazu („repository: tag”). Jeśli ten sam obraz ma wiele nazw, pokazuje to wiele razy docker images.

Ta odpowiedź zawiera odpowiedź wstecz. Kontener jest instancją obrazu lub wykonywalną migawką obrazu. Obraz nie jest wykonywany bezpośrednio, ponieważ jest klasą nadrzędną instancji. Instancja (kontener) jest dzieckiem rodzica (przepis lub szablon do tworzenia instancji)
dr Rich Lysakowski

Ta odpowiedź zaczyna się na końcu procesu. Nowy obraz MOŻE być wykonany jako migawka kontenera, ale wszystkie kontenery musiały mieć obraz nadrzędny. W tym przypadku nie ma problemu z kurczakiem i jajami, ponieważ pierwszy pierwotny obraz musi zostać najpierw zbudowany z pliku Dockerfile. Najpierw przyszedł plik Docker, potem obraz, a potem kontener. Kontener może służyć jako podstawa nowego obrazu, ale ten kontener musiał mieć „obraz nadrzędny”.
Rich Lysakowski PhD

3

Chciałbym wypełnić brakującą część tutaj między docker imagesa containers. 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 jako read-onlywarstwa, a wszelkie zmiany w uruchomionym kontenerze są wprowadzane w read-writewarstwie 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.


1

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.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

1

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.


1

Kontener Docker uruchamia instancję obrazu. Możesz powiązać obraz z programem i kontener z procesem :)


1

Obraz jest klasą jako kontener obiektu.

Kontener jest instancją obrazu, ponieważ obiekt jest instancją klasy.


1

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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.