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?
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.
Z môjho článku Automatizácia nasadenia Docker:
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.
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
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Niekoľko vecí, ktoré treba poznamenať:
-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
.[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
.latest
nie je magický, je to jednoducho predvolený tag, keď nezadáte žiadny tag.<none>
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.
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í:
docker ps
vypíše iba spustené kontajnery. Všetky kontajnery (spustené alebo zastavené) môžete zobraziť pomocou príkazu docker ps -a
.--name
.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:
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.