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.

Title

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 ubuntu:latest image törlése.

docker rmi hello-world -f

Az összes hello-world image törlése akkor is, ha azoknak van konténer példányuk a rendszerben.

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

  1. Hogyan lehet listázni a rendszerben lévő Docker image-eket?

  2. Milyen információkat lehet megtudni, és hogyan egy Docker image-ről?

  3. 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?

  4. Milyen szerepe van az image id-nek a Docker műveletek során?

  5. Milyen módon lehet frissíteni egy már letöltött Docker image-et?

  6. Hogyan lehet törölni az összes feleslegessé vált image-et a gépről?

  7. Listázd ki az összes olyan image-et, amely tartalmazza az ubuntu szót!

  8. Töröld az alpine nevű image-et a hozzá tartozó image id alapján!

  9. 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?

  10. Frissítsd a busybox nevű image-et a legújabb verzióra! Ellenőrizd a konténer aktuális verziószámát!