Aký je rozdiel medzi obrazom Docker a kontajnerom?

Pri používaní nástroja Docker začíname so základným obrazom. Spustíme ho, vytvoríme zmeny a tieto zmeny sa uložia do vrstiev, ktoré tvoria ďalší obraz.

Takže nakoniec mám obraz pre inštanciu PostgreSQL a obraz pre webovú aplikáciu, ktorých zmeny sa neustále uchovávajú.

Čo je to kontajner?

Riešenie

Inštancia obrazu sa nazýva kontajner. Máte obraz, ktorý je súborom vrstiev, ako popisujete. Ak tento obraz spustíte, máte spustený kontajner tohto obrazu. Môžete mať veľa spustených kontajnerov toho istého obrazu.

Všetky svoje obrazy môžete vidieť pomocou docker images, zatiaľ čo bežiace kontajnery môžete vidieť pomocou docker ps (a všetky kontajnery môžete vidieť pomocou docker ps -a).

Bežiaca inštancia obrazu je teda kontajner.

Komentáre (14)

Z môjho článku Automatizácia nasadenia Docker:

Docker Images vs. Containers

V Dockerlande existujú images a containers. Tieto dva typy sú úzko prepojené, ale odlišné. Pochopenie tejto dichotómie pre mňa nesmierne objasnilo Docker.

Čo je to obrázok?

Obraz je inertný, nemenný súbor, ktorý je v podstate snímkou kontajnera. Obrazy sa vytvárajú príkazom build a po spustení príkazom run vytvoria kontajner. Obrazy sa ukladajú do registra Docker, napríklad registry.hub.docker.com. Keďže obrazy môžu byť pomerne veľké, sú navrhnuté tak, aby sa skladali z vrstiev iných obrazov, čo umožňuje posielať minimálne množstvo údajov pri prenose obrazov po sieti.

Miestne obrazy možno zobraziť spustením príkazu 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
                                  4ab0d9120985        3 months ago        486.5 MB

Niekoľko vecí, ktoré treba poznamenať:

  1. IMAGE ID je prvých 12 znakov skutočného identifikátora obrázka. Môžete vytvoriť mnoho značiek daného obrázka, ale ich ID budú všetky rovnaké (ako je uvedené vyššie).
  2. VIRTUÁLNA VEĽKOSŤ je virtuálna, pretože sa sčítavajú veľkosti všetkých odlišných podkladových vrstiev. To znamená, že súčet všetkých hodnôt v tomto stĺpci je pravdepodobne oveľa väčší ako priestor na disku, ktorý využívajú všetky tieto obrázky.
  3. Hodnota v stĺpci REPOSITORY pochádza z príznaku -t príkazu docker build alebo z príkazu docker tag-ing existujúceho obrazu. Obrazy môžete ľubovoľne označovať pomocou nomenklatúry, ktorá vám dáva zmysel, ale vedzte, že docker použije značku ako umiestnenie registra v príkaze docker push alebo docker pull.
  4. Úplný tvar tagu je [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Pre vyššie uvedené ubuntu je REGISTRYHOST odvodený ako registry.hub.docker.com. Ak teda plánujete uložiť svoj obraz s názvom my-application do registra na adrese docker.example.com, mali by ste tento obraz označiť ako docker.example.com/my-application.
  5. Stĺpec TAG je len [:TAG] časť tagu full. Je to nešťastná terminológia.
  6. Tag latest nie je magický, je to jednoducho predvolený tag, keď nezadáte žiadny tag.
  7. Môžete mať neoznačené obrázky, ktoré sú identifikovateľné len pomocou ich IMAGE ID. Tie dostanú `` TAG a REPOSITORY. Je'ľahké na ne zabudnúť.

Viac informácií o obrazoch nájdete v dokumentácii k nástroju Docker a slovníku pojmov.

Čo je to kontajner?

Ak použijeme metaforu programovania, ak je obraz trieda, potom kontajner je inštancia triedy - objekt na spustenie. Kontajnery sú, dúfajme, dôvodom, prečo používate Docker; sú to ľahké a prenosné zapúzdrenia prostredia, v ktorom sa spúšťajú aplikácie.

Zobrazenie lokálne spustených kontajnerov pomocou 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

Tu spúšťam dockerizovanú verziu docker registra, takže mám súkromné miesto na ukladanie svojich obrazov. Opäť si treba všimnúť niekoľko vecí:

  1. Podobne ako IMAGE ID, aj CONTAINER ID je skutočný identifikátor kontajnera. Má rovnaký tvar, ale identifikuje iný druh objektu.
  2. docker ps vypíše iba spustené kontajnery. Všetky kontajnery (spustené alebo zastavené) môžete zobraziť pomocou príkazu docker ps -a.
  3. Na identifikáciu spusteného kontajnera možno použiť príznak --name.

Ako sa vyhnúť hromadeniu obrazu a kontajnerov

Jednou z mojich prvých frustrácií z Dockera bolo zrejme neustále hromadenie neoznačených obrazov a zastavených kontajnerov. Pri niekoľkých príležitostiach malo toto hromadenie za následok maximálne vyťažené pevné disky, ktoré spomaľovali môj notebook alebo zastavovali môj automatizovaný build pipeline. Hovoríme o "kontajneroch všade"!

Všetky neoznačené obrazy môžeme odstrániť kombináciou docker rmi s nedávnym dotazom dangling=true:

docker images -q --filter "dangling=true" | xargs docker rmi

Docker nebude schopný odstrániť obrazy, ktoré sú za existujúcimi kontajnermi, takže možno budete musieť najprv odstrániť zastavené kontajnery pomocou docker rm:

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

Toto sú známe boľavé miesta nástroja Docker a môžu byť riešené v budúcich vydaniach. S jasným pochopením obrazov a kontajnerov sa však týmto situáciám dá predísť pomocou niekoľkých postupov:

  1. Vždy odstráňte nepoužiteľný, zastavený kontajner pomocou docker rm [CONTAINER_ID].
  2. Vždy odstráňte obraz za nepoužiteľným, zastaveným kontajnerom pomocou príkazu docker rmi [IMAGE_ID].
Komentáre (11)

Hoci je najjednoduchšie predstaviť si kontajner ako bežiaci obraz, nie je to celkom presné.

Obraz je v skutočnosti šablóna, ktorú možno zmeniť na kontajner. Aby sa obraz zmenil na kontajner, mechanizmus Docker vezme obraz, pridá naň súborový systém na čítanie a zápis a inicializuje rôzne nastavenia vrátane sieťových portov, názvu kontajnera, ID a limitov zdrojov. Bežiaci kontajner má aktuálne vykonávaný proces, ale kontajner možno aj zastaviť (alebo exitovať v terminológii Docker'a). Ukončený kontajner nie je to isté ako obraz, pretože ho možno reštartovať a zachová si svoje nastavenia a všetky zmeny súborového systému.

Komentáre (5)