Pri uporabi programa Docker začnemo z osnovno sliko. Zaženemo jo, ustvarimo spremembe in te se shranijo v plasti, ki tvorijo drugo sliko.
Tako imam sčasoma sliko za svoj primerek PostgreSQL in sliko za svojo spletno aplikacijo, katerih spremembe se shranjujejo.
Kaj je vsebnik?
Primerek slike se imenuje vsebnik. Imate sliko, ki je niz slojev, kot ste opisali. Če to sliko zaženete, imate delujočo posodo te slike. Imate lahko več delujočih vsebnikov iste slike.
Vse slike si lahko ogledate s programom docker images
, medtem ko si lahko tekoče vsebnike ogledate s programom docker ps
(in vse vsebnike s programom docker ps -a
).
Delujoč primerek slike je torej vsebnik.
Iz mojega članka o Avtomatizaciji namestitve Dockerja:
V Dockerlandu obstajajo obrazi in kontainerji. Oba sta tesno povezana, vendar različna. Zame je razumevanje te dihotomije zelo razjasnilo program Docker.
Slika je inertna, nespremenljiva datoteka, ki je v bistvu posnetek vsebnika. Slike ustvarimo z ukazom build in ob zagonu z ukazom run ustvarijo vsebnik. Slike so shranjene v registru Docker, kot je registry.hub.docker.com. Ker so lahko precej velike, so slike zasnovane tako, da so sestavljene iz plasti drugih slik, kar omogoča pošiljanje minimalne količine podatkov pri prenosu slik po omrežju.
Lokalne slike lahko naštejete tako, da zaženete 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
Nekaj stvari, ki jih je treba upoštevati:__
-t
v ukazu docker build
ali iz oznake docker tag
na obstoječi sliki. Slike lahko označite z nomenklaturo, ki se vam zdi smiselna, vendar vedite, da bo program docker uporabil oznako kot lokacijo registra v ukazu docker push
ali docker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Za ubuntu
zgoraj je REGISTRYHOST domnevno registry.hub.docker.com
. Če torej nameravate svojo sliko z imenom my-application
shraniti v register na naslovu docker.example.com
, morate to sliko označiti z docker.example.com/my-application
.latest
ni čarobna, ampak je preprosto privzeta oznaka, kadar ne določite oznake.<none>
in REPOSITORIJO. Nanje zlahka pozabite.Več informacij o slikah je na voljo v dokumentaciji Docker in glosarju.
Če uporabimo programersko metaforo, je slika razred, potem je vsebnik primerek razreda - objekt v času izvajanja. Kontejnerji so, upajmo, razlog, zakaj uporabljate Docker; so lahke in prenosljive enkapsulacije okolja, v katerem se izvajajo aplikacije.
Oglejte si lokalne delujoče zabojnike z 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
Tukaj uporabljam dockerizirano različico dockerjevega registra, tako da imam zasebno mesto za shranjevanje svojih slik. Ponovno je treba opozoriti na nekaj stvari:
docker ps
izpiše samo delujoče vsebnike. Vse vsebnike (delujoče ali ustavljene) si lahko ogledate z docker ps -a
.--name
.Eno od mojih zgodnjih razočaranj nad programom Docker je bilo na videz stalno kopičenje neoznačenih slik in ustavljenih vsebnikov. V nekaj primerih je to kopičenje povzročilo, da so bili trdi diski maksimalno obremenjeni, kar je upočasnilo moj prenosni računalnik ali zaustavilo moj avtomatizirani sestavljalni niz. Govorimo o "vsebnikih povsod"!
Vse neoznačene slike lahko odstranimo tako, da združimo docker rmi
z nedavno poizvedbo dangling=true
:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker ne bo mogel odstraniti slik, ki so za obstoječimi vsebniki, zato boste morda morali najprej odstraniti ustavljene vsebnike z docker rm
:
docker rm `docker ps --no-trunc -aq`
To so znane bolečine pri Dockerju in bodo morda odpravljene v prihodnjih izdajah. Vendar se lahko z jasnim razumevanjem slik in vsebnikov tem situacijam izognemo z nekaj praksami:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Čeprav je najenostavneje, če si zabojnik predstavljamo kot delujočo sliko, to ni povsem točno.
Slika je v resnici predloga, ki jo je mogoče spremeniti v vsebnik. Da bi sliko spremenili v vsebnik, motor Docker vzame sliko, doda datotečni sistem za branje in pisanje ter inicializira različne nastavitve, vključno z omrežnimi priključki, imenom vsebnika, ID in omejitvami virov. Delujoči vsebnik ima trenutno izvajani proces, vendar je vsebnik mogoče tudi ustaviti (ali exited v terminologiji Dockerja). Opuščeni vsebnik ni enak sliki, saj ga je mogoče ponovno zagnati, pri čemer ohrani svoje nastavitve in morebitne spremembe datotečnega sistema.