Viac na
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?
802
3
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ť pomocoudocker ps
(a všetky kontajnery môžete vidieť pomocoudocker ps -a
).Bežiaca inštancia obrazu je teda kontajner.
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
:Niekoľko vecí, ktoré treba poznamenať:
-t
príkazudocker build
alebo z príkazudocker 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íkazedocker push
alebodocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Pre vyššie uvedenéubuntu
je REGISTRYHOST odvodený akoregistry.hub.docker.com
. Ak teda plánujete uložiť svoj obraz s názvommy-application
do registra na adresedocker.example.com
, mali by ste tento obraz označiť akodocker.example.com/my-application
.latest
nie je magický, je to jednoducho predvolený tag, keď nezadáte žiadny tag.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
: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í:
docker ps
vypíše iba spustené kontajnery. Všetky kontajnery (spustené alebo zastavené) môžete zobraziť pomocou príkazudocker ps -a
.--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 dotazomdangling=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
: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:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.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.