Konténer image-ek¶
Ismerkedjünk most meg a konténer image-ekkel, amelyből az előző fejezet konténer példányai is létrejöttek! Bár ezek kevesebb művelettel kezelhetők, fontos, hogy megtanuljuk az ahhoz szükséges parancsok használatát. Ezért ebben a fejezetben megismerjük:
A konténer image-ek alapvető feladatát.
Az image-ek letöltésének és tárolásának folyamatát.
A rendszerben levő image-ek listázását és törlésük módjait.
Az image-ek részletes adatainak megismerését.
Szükséges eszközök: |
Windows, MacOS vagy Linux operációs rendszerű számítógép, telepített Docker szoftverrel. |
Feldolgozási idő: |
kb. 1 óra, gyakorlati feladatok megoldására további 1 óra. |
Az előző fejezetben már láttuk, hogy a konténerek indításakor az új példány egy fájlból jön létre; ezt a fájlt konténer image-nek nevezzük. Az első konténerünk, a hello-world indításának üzeneteiben láttuk, hogy a konténer image még nem állt rendelkezésre a gépen, ezért először azt le kellett tölteni, amit a docker run automatikusan meg is tett. Az így letöltött image volt az, amelyből aztán a konténer egy futó példánya létrejött, majd az újabb run parancs szintén ebből hozott létre az újabb és újabb példányokat. Egy meglevő konténer újraindítását a docker start paranccsal végeztük.
koczka@columbo:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
Status: Downloaded newer image for hello-world:latest
A konténer image-ek a gépünk merevlemezén tárolódnak, így nem csak konténer példányokat, hanem ezeket is menedzselnünk kell. Fontos, látni a különbséget: az eddig bemutatott parancsok alanyai az elindított, és (valaha) futó konténerek példányai voltak; de ezeknek a parancsoknak semmilyen hatása sem volt azokra a fájlokra, amelyekből „példányosítottuk” őket. Az image-ek kezelését a docker image parancsokkal végezzük el.
Egy image letöltéséhez nem csak a docker run használható, azt is megtehetjük, hogy a konténer létrehozásához szükséges fájlokat letöltjük ugyan, de nem készítjük el abból a konténert. Erre a docker pull parancsot kell használni. Bár ez így nem tűnik különösebben hasznosnak, a pull paraméterrel egy már korábban letöltött konténer frissítése is elvégezhető, amely során csak a megváltozott részeket írjuk felül. Az alábbi példában letöltjük a busybox nevű konténert, de nem indítjuk el:
koczka@columbo:~$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
f5b7ce95afea: Pull complete
Digest: sha256:9810966b5f712084ea05bf28fc8ba2c8fb110baa2531a10e2da52c1efc504698
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
A már letöltött konténert elindítani a már ismert módon, a docker run paranccsal lehet, ekkor a konténer image fájlja már rendelkezésre áll, értelemszerűen már nem töltődik le újra a gépre.
A gépen levő image-ek listája a docker image list paranccsal ellenőrizhető (rövidebb alternatívaként a docker images is használható). A példában a két eddig használt konténer látható, a hello-world és a busybox. Utóbbit a docker pull paranccsal töltöttük le, de mivel nem indítottuk el, a docker ps -a kimenetében értelemszerűen az nem jelent meg. A letöltött image-ek közt viszont már látható, hogy az helyben rendelkezésre áll, tehát egy konténer példány létrehozásakor már nem kellene azt letölteni.
koczka@columbo:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest ff4a8eb070e1 2 weeks ago 1.24MB
hello-world latest feb5d9fea6a5 13 months ago 13.3kB
Az image-eknek is vannak ID-ik (egészen pontosan image ID-ik), és bár ezeket elsősorban a törlésükkor használjuk, ugyanerre lesz szükség akkor is, amikor a saját konténerünket a DockerHubra akarjuk majd feltölteni. A már szükségtelen image-ek törlésére a docker image rm szolgál, amelynek paraméterként fel kell sorolni a törlendő image-ek ID-it. Itt is alkalmazható a példányoknál már látott rövidítés: elég annyi karaktert leírni, ahány azt már egyértelműen meghatározza.
koczka@columbo:~$ docker image rm ff fe
Untagged: busybox:latest
Untagged: busybox@sha256:9810966b5f712084ea05bf28fc8ba2c8fb110baa2531a10e2da52c1efc504698
Deleted: sha256:ff4a8eb070e12018233797e865841d877a7835c4c6d5cfc52e5481995da6b2f7
Deleted: sha256:0b16ab2571f4b3e0d5a96b66a00e5016ddc0d268e8bc45dc612948c4c95b94cd
Untagged: hello-world:latest
Untagged: hello-world@sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
Javaslat
Ha egy image, pl. a hello-world több verziója is jelen van a rendszerben, a docker rmi hello-world -f paranccsal törölhető minden változat.
Az összes konténer image azonosítóját a docker images -q paranccsal adja vissza. Ezt felhasználva az összes image a docker rmi $(docker images -q) paranccsal törölhető.
Egy image nem törölhető addig, amíg egy abból létrehozott konténer jelen van a rendszerben még akkor sem, ha annak futása már véget ért; ezért azokat először a korábban ismertetett docker rm paranccsal törölni kell. (Csak a teljesség kedvéért, ha minden kötél szakad, a --force segítségével megkerülhető ez a korlát, de használata csak indokolt esetben javasolt.)
Egy image vizsgálata¶
A docker inspect parancs nem csak egy konténer példány, hanem egy image releváns információit is meg tudja jeleníteni, az parancs célja csupán a paraméterként megadott objektumtól függ. A hello-world image esetében a kimenet egy részlete az alábbi:
koczka@columbo:~$ docker inspect hello-world
[
{
"Id": "sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a",
"RepoTags": [
"hello-world:latest"
],
"RepoDigests": [
"hello-world@sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2023-05-02T16:49:27Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
...
Nem csak a teljesség kedvéért, hanem a scriptek írásakor nagyon hasznos lehetőség miatt érdemes megismerni egy adott változó értékének lekérdezését végző módot is. Az alábbi parancsban csak az Id nevű változó értékét kérjük le:
koczka@columbo:~$ docker inspect --format='{{.Id}}' hello-world
sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Referencia¶
Az alábbi táblázat összefoglalja a Docker leggyakrabban használt image kezelési parancsait.
parancs |
Jelentés |
|---|---|
docker image ls |
A gépre már letöltött konténer image-ek megjelenítése. |
docker image ls |
A gépre már letöltött konténer image-ek megjelenítése. |
docker pull <image_neve> |
Egy konténer image letöltése a gépre annak példányosítása nélkül. |
docker image rm ubuntu:latest |
Az |
docker rmi hello-world -f |
Az összes |
for I in $(docker image ls -q) ; do docker image rm $I ; done |
Az összes image törlése. |
Összefoglalás¶
Egy konténerek futtatására szolgáló környezet alapvető építőkövei a konténer image-ek; minden konténer példány ezekből jön létre. Ezeket a DockerHub-ról (esetleg más forrásokból) lehet letölteni a docker pull paranccsal. Az image-ek azonban nem csupán a konténerek kiinduló pontját képezik: azok teljes életciklusában kulcsfontosságú szerepük van a kezelésben és menedzsmentben. Az image-ek kezeléséhez szükséges parancsok ismerete egyaránt fontos egy fejlesztő és rendszerüzemeltető számára is, ezért fontos, hogy ismerjük az erre szolgáló parancsokat. Ebben a fejezetben példákon keresztül ismertük meg ezeket a listázástól az összes felesleges image törléséig.
Feladatok¶
Hogyan lehet listázni a rendszerben lévő Docker image-eket?
Milyen információkat lehet megtudni, és hogyan egy Docker image-ről?
Mi a teendő, ha egy olyan Docker image-et szeretnénk törölni, amiből még létezik futó konténer példány?
Milyen szerepe van az image id-nek a Docker műveletek során?
Milyen módon lehet frissíteni egy már letöltött Docker image-et?
Hogyan lehet törölni az összes feleslegessé vált image-et a gépről?
Listázd ki az összes olyan image-et, amely tartalmazza az
ubuntuszót!Töröld az alpine nevű image-et a hozzá tartozó image id alapján!
Jelenítsd meg a python:3.9 image részletes információit! Mi az image id-je? Mekkora a mérete? Mikor lett ez létrehozva?
Frissítsd a busybox nevű image-et a legújabb verzióra! Ellenőrizd a konténer aktuális verziószámát!