Munka a konténerekkel

Mielőtt saját konténereket készítünk, érdemes megismerkedni a konténerek alapvető kezelésével. Enélkül, különösen egy fejlesztési folyamat során, a felesleges konténerek és image-ek előbb-utóbb rengeteg erőforrást foglalnak el a gépünkön. Ezért először olyan, a DockerHubról származó, mások által készített konténerekkel foglalkozunk, amelyeket szabadon letölthetők, majd különféle paraméterekkel állítjuk be a kívánt működését. Ennek során az alábbi műveleteket ismerjük meg:

  • Konténereket keresünk a DockerHubon.

  • Elindítjuk az első konténerünket.

  • Megtanuljuk a konténerek indításának, leállításának és törlésének különféle módjait.

  • Megismerjük a konténerek állapotának és ellenőrzésének parancsait.

  • Csatlakozunk egy futó konténerhez.

  • Megtekintjük egy konténer állapotát és futási paramétereit.

  • Lekérdezzük egy konténer működési statisztikáit.

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. 3 óra, gyakorlati feladatok megoldására további 1 óra.

Keresés a DockerHubon

A DockerHub rengeteg konténert tartalmaz, de a hub.docker.com/search oldalon elérhető keresővel könnyen megtalálhatjuk a bennünket érdeklőket. Legtöbbször azonban parancssoros felületen dolgozunk, ahol nem áll rendelkezésre a kereső interaktív felülete. Ezért itt egy megfelelően paraméterezett docker search parancsot használunk. Lássuk ezt egy példán keresztül: keressük meg azokat a konténer image-eket, amelyek tartalmazzák az Ubuntu szót! Mivel várhatóan sok ilyet találunk majd, limitáljuk a megjelenő sorok számát 4-ben úgy, hogy a parancsot kiegészítjük a --limit 4 paraméterrel!

koczka@columbo:~$ docker search --limit 4 ubuntu
NAME                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu               Ubuntu is a Debian-based Linux operating sys…   17057     [OK]
ubuntu-debootstrap   DEPRECATED; use "ubuntu" instead                52        [OK]
ubuntu-upstart       DEPRECATED, as is Upstart (find other proces…   115       [OK]
websphere-liberty    WebSphere Liberty multi-architecture images …   298       [OK]

Bár egyértelmű, hogy a webes keresés felülete sokkal áttekinthetőbb, adott helyzetben a parancssorból indított keresés nagy segítséget jelenthet, idővel pedig megszokjuk a karakteres kimenetet is.

Egy konténer elindítása

A Docker konténerek futtatását tehát egy háttérben futó szerverprogram biztosítja, melyet a gyártó folyamatosan fejleszt. Az egyes verziók között eltérések lehetnek, amelyek esetenként problémát okozhatnak. A gépen futó Docker verziószáma a docker version paranccsal kérdezhető le (és ahogyan láttuk, ez az egyik legegyszerűbb módja a működőképesség ellenőrzésének is):

Miután láttuk, hogy a Dockerünk működőképes, indítsunk el végre egy konténert! Ahogyan azt az előző fejezetben már láttuk, a DockerHub nagy számú kész ilyet tartalmaz – ott szinte minden fontosabb alkalmazás konténerizált változata elérhető. Az első példánk egy egyszerű feladat, a konténerek helloworld-jének elindítása lesz. Ezen keresztül fogjuk megismerni a konténerek kezelésének legfontosabb elemeit és a hozzájuk tartozó parancsokat. A példáink többsége Linuxon, Mac-en és Windows-on is végrehajtható, ehhez azok parancssori felületét használjuk. Windows-on célszerű a cmd, Mac-en pedig a Terminal.app használata. A Docker parancssoros kezelése mindegyikben a docker paranccsal történik.

A hello-world alkalmazást az előző fejezetben már megkerestük a DockerHubon, ezt fogjuk most elindítani. Sajnos ez a változat egy kicsit bőbeszédű, nem csak a szokásos egysoros szöveget jeleníti meg:

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

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Megjegyzés

  • Amennyiben az indítást követően hibaüzenet jelenik meg, érdemes ellenőrizni, hogy a Docker fut-e a gépen.

  • Ha Apple gépet használsz, az operációs rendszerbe épített terminál alkalmazás helyett célszerű a ITerm2 alkalmazást letölteni, ez számos kényelmi funkciót és jobb megjelenítést kínál.

  • A 2db29710123e: Pull complete sorban látható, hogy a Docker letölt egy képet egy tárolóból. Ezt a fájlt a Linux gépeken általában a /var/lib/docker/ könyvtárban tárolja a rendszer.

Elég sok szöveg jelent meg a képernyőn, lássuk, mi történt! A 2. sor szövege szerint a konténer még nem áll rendelkezésre a helyi gépen (Unable to find image «hello-world:latest» locally) ezért azt először a DockerHubról le kell tölteni. Ez a folyamat a követhető nyomon a 6. sorig, majd a konténerben elindított program kimenete olvasható: Hello from Docker kezdetű szöveget.

Az egyes konténereknek több változata is elérhető lehet a DockerHubon, így ha a parancsainkban nem határozunk meg verziót, akkor automatikusan a legutolsóval fogunk dolgozni. Egy eltérő változat kiválasztása a konténer:verzió formában történhet, például így: php:7.4, python:3, ubuntu:16.04. A verziószám helyére írt latest az utolsó elérhető változatot jelenti, jelen sorok írásakor az ubuntu:latest jelentése ubuntu:24.04.

Ahhoz, hogy a konténerekkel hatékonyan tudjunk dolgozni, meg kell ismerkednünk azokkal a kezelésükhöz szükséges parancsokkal. Enélkül, különösen a fejlesztési folyamat során, a felesleges konténerek és image-ek felgyűlnek, és előbb-utóbb rengeteg erőforrást foglalnak majd el a gépen.

Műveletek a konténerekkel

Az elindított konténerek a futásuk végén sem tűnnek el automatikusan a rendszerből, befejezett állapotban továbbra is rendelkezésre állnak, és a megfelelő parancsokkal újra elindíthatók. A kezdő konténerhasználók számára ez általában nem természetes, érdemes ezt szem előtt tartani. Az alábbi ábra egy konténer életciklusát mutatja:

Egy konténer életciklusa

Egy konténer életciklusa

A konténer image-ek tehát a repozitóriumban (pl. a DockerHubon) vannak, amelyeket az első használat előtt le kell tölteni. Ezt eredendően a docker pull parancs végzi, de a gyakorlatban valamelyest jobban használható docker run is megteszi ezt, ha az elindítani kívánt image még nem áll rendelkezésre a gépen. Csak a letöltést követően jöhet létre a konténer futó példánya. Az egyes példányokat a docker stop paranccsal lehet leállítani, és a docker start-tal újból elindítani. A továbbiakban pedig már nem szükséges konténer példányt (tehát nem az image-et!) a docker rm paranccsal lehet törölni. Lássuk ezt részletesen!

Konténerek a rendszerben

A konténerek újraindítása előtt ismerkedjünk meg azzal a paranccsal, ami a rendszerben levő konténereket listázza ki. Az alábbi példában a docker ps -a megjeleníti az összes, a rendszerben levő konténert (a -a jelentése: all):

koczka@columbo:~$  docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                          PORTS     NAMES
6b9d1f725626   hello-world   "/hello"   33 minutes ago   Exited (0) About 7 minutes ago            silly_albattani

Ha csak azokat a konténereket kívánjuk listázni, amelyek még futnak, a docker ps parancsot a -a paraméter nélkül kell használni.

koczka@columbo:~$  docker ps
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                         PORTS     NAMES

Minden konténernek van egy belső azonosítója (ez példánkban az 6b9d1f725626), aminek kiemelt szerepe van a konténerek kezelésében, a konténer újraindításában vagy törlésében. Az egyszerűség érdekében minden konténernek van egy egy neve is, amit annak a létrehozásakor határozhatunk meg, vagy ha ezt elmulasztjuk, a rendszer generál egyet (ez a példában silly_albattani). A parancs megmutatja a konténer alapjául szolgáló, korábban letöltött konténer file nevét (ez az image neve), valamint a létrehozásának idejét is. Emellett minden konténerre megjeleníti annak aktuális státuszát, ez esetünkben (Exited), amely azt jelenti, hogy az alkalmazás 0 visszatérési értékkel 7 perccel ezelőtt kilépett. Egy konténer státusza az alábbiak valamelyike lehet:

Státusz

Leírás

created

a konténer az indítását követően már létrejött, de még nem indult el.

restarting

a konténer éppen újraindítási fázisban van.

running

a konténer jelenleg fut.

paused

a konténer működése átmenetileg fel van függesztve.

exited

a konténer futása befejeződött, a visszatérési érték a státusz kód mellett olvasható le.

dead

a konténert a Docker motor megpróbálta leállítani, de az nem sikerült.

Egy konténer újraindítása

Az alábbi példában újra elindítjuk a korábban már letöltött és elindított hello-world konténer példányát:

koczka@columbo:~$  docker start -a 6b9d1f725626

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Hogy miért nem a docker run parancsot használtuk? Azért, mert a docker start a rendszerben már meglevő, de leállított konténert indítja újra, a docker run viszont annak egy újabb példányát hozta volna létre. Ennek következtében az alábbi ábrán látható módon a már lefutott konténerek „felszaporodnának”, így a fejlesztés során időről időre takarítani kell őket (vagy gondoskodni arról, hogy a leállt konténerek automatikusan törlődjenek). Az alábbi lista ezt mutatja: ebben egy újabb docker run hello-world hatására egy újabb konténer példány jött létre, amelynek azonosítója f87cb9248b50.

koczka@columbo:~$  docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                     NAMES
f87cb9248b50   hello-world   "/hello"   1 seconds ago    Exited (0) 1 seconds ago   brave_hawking
6b9d1f725626   hello-world   "/hello"   20 minutes ago   Exited (0) 20 minutes ago  silly_albattani

Ez az oka annak is, hogy a docker start paramétere nem a hello-world volt, hanem az adott konténer példány azonosítója – az image neve, amelyből a konténer példány származik, nem alkalmas a konténer egy példányának azonosítására, hiszen az mindegyik esetében azonos. A teljesség kedvvért érdemes megjegyezni, hogy a konténer egyedi neve is használható lett volna, azaz a docker start -a silly_albattani parancs is működött volna.

Egy konténer leállítása

A gyakorlatban szükség lehet egy futó konténer leállítására is, ehhez a docker stop parancsot kell használni. Mivel egy rendszer számos konténert futtathat, ezért paraméterként ebben az esetben is meg kell adni a leállítandó konténer azonosítóját pl így: docker stop 6b9d1f725626 vagy a nevét: docker stop silly_albattani. A parancs hatására tehát a konténer példány leáll, de az továbbra is él a rendszerben, az bármikor újraindítható.

Javaslat

A konténer azonosítók elég hosszú véletlenszámok, amelyeket nem szükséges pontosan begépelni, elég csupán annyit, amelyből az már egyértelműen azonosítható. A fenti konténer indítása ez alapján így lett volna rövidíthető: docker start -a 6, leállítása docker stop 6, mivel egyetlen más konténer azonosítója sem kezdődik 6-ossal. Ugyanezt a név alkalmazásával már nem lehet alkalmazni, azt pontosan meg kell adni.

Egy konténer vizsgálata

Egy konténerről a docker ps kimenetében olvasható néhány információ, azonban róluk jóval több áll rendelkezésre, amelyet a docker inspect paranccsal lehet lekérdezni. A parancs JSON formátumú kimenete a fejlesztők és üzemeltetők számára könnyen olvasható és feldolgozható. Az alábbi példában egy Alpine Linuxot indítunk el egy konténerben, amely az indítását követően vég nélkül pingelné a Google 8.8.8.8 IP című névszerverét. A konténert a Ctrl-C billentyűkkel állítjuk le, majd lekérdezzük annak tulajdonságait. Érdemes megfigyelni a sor végén megadott ping parancsot, ezt a konténer olvassa, és az indulását követően végrehajtja.

koczka@columbo:~$ docker run --name alpine-ping alpine ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=116 time=6.004 ms
64 bytes from 8.8.8.8: seq=1 ttl=116 time=6.133 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 6.004/6.068/6.133 ms

A konténer indításakor egy újabb paramétert használtunk, a --name alpine-ping-et. Ennek eredményeként a Docker nem egy véletlenszerű nevet ad a konténernek, hanem ezt használja. Ez kifejezetten hasznos abban az esetben, ha több konténert működtetünk, mivel a névvel könnyen leírhatjuk annak funkcióját, emellett a konténer kezelése során is egy megjegyezhető, informatív azonosítót használhatunk. Így járunk el a konténer vizsgálata során is, a docker inspect paramétereként most a konténer nevét használjuk:

 1koczka@columbo:~$ docker inspect alpine-ping
 2[
 3    {
 4        "Id": "f3fef16a1918dcc69d5330a2aa7bb4ceb21b69f947aa3f3c37bd4c74843dca89",
 5        "Created": "2024-05-18T09:22:06.835874049Z",
 6        "Path": "ping",
 7        "Args": [
 8            "8.8.8.8"
 9        ],
10        "State": {
11            "Status": "exited",
12            "Running": false,

Bár a parancs kimenetének egy része magától értetődő, jelentésüket érdemes a dokumentáció alapján pontosítani. Jelen jegyzetben nem célunk ezen a paraméterek részletes felsorolása.

Hasznos kiegészítő a docker top parancs, amely a konténer belső folyamatainak nyomon követésére használatos, és a Unixokban már ismert top parancsához hasonlóan működik: felsorolja a konténerben futó processzeket, azok nevei és processz id-ik mellett az indításuk idejét és a kapcsolódó TTY azonosítóját is.

koczka@columbo:~$ docker top alpine
UID   PID     PPID     C   STIME    TTY     TIME        CMD
root  918952  918930   0   14:27    pts/0   00:00:00    /bin/sh

A konténer memória, diszk és hálózat használati statisztikáit a docker stats paranccsal lehet megtekinteni. A CPU% a processzor terhelését, a MEM USAGE / LIMIT az éppen használt és a konténer által elérhető maximális memória mennyiségét írja le. A NET I/O a bejövő és a kimenő hálózati forgalom, a BLOCK I/O a diszkről olvasott és oda kiírt adatok mennyiségét írja le. A statisztikát a parancs folyamatosan frissíti, kilépni ebből is a Ctrl-C lenyomásával lehet.

koczka@columbo:~$ docker stats alpine
CONTAINER ID  NAME    CPU %  MEM USAGE / LIMIT    MEM %  NET I/O  BLOCK I/O  PIDS
a406ded75c9b  alpine  0.00%  1.617MiB / 7.741GiB  0.02%  0B / 0B  0B / 0B    1

Az erőforrások túlzott használatáról, esetleges limitek beállításáról a Biztonsági kérdések c. fejezetben lesz még szó.

Belépés egy konténerbe

A konténerek gyakran csak egy-egy futtatási környezetet tartalmaznak (pl. php interpreter, vagy Python), de szükség esetén egy teljes értékű operációs rendszer is működésének látszatát is kelthetik. Több olyan Linux változat létezik, amelyet kifejezetten konténerizált környezetek alaprendszerének terveztek. Többek között ezek a Ubuntu Core, a RancherOS, vagy az Alpine Linux. Ezek mellett a közismert Debian és Ubuntu Linuxok is szolgálhatnak konténerek kiindulási alapjaként. A választást elsősorban a konténerben működő szolgáltatások rendelkezésre állása és azok mérete határozza meg.

Az eddigi példákban szereplő konténerek egy-egy programot tartalmaztak, a konténer belsejében interaktív módon nem dolgoztunk. Egy konténer azonban nem feltétlenül zárt, abba a tartalmától függően be lehet lépni, és a benne működő környezetben lehet ellenőrizni vagy tesztelni a működését. Az interaktív működéshez szükséges paramétereket már a konténer létrehozásakor meg kell adni. A -i hatására a konténer interaktív módban indul; ekkor fogadja a billentyűzeten begépelt karaktereket, a -t pedig egy terminált rendel a konténerhez, amin az meg tudja jeleníteni az üzeneteit. Mivel ezt a két paramétert gyakran összevonva, együtt használjuk, ezért -it formában is megadhatjuk. A konténer neve után, a parancs végén pedig megadható annak a (konténerben már meglevő) programnak a nevét kell megadni, amelyet a konténeren belül indítani szeretnénk. Az alábbi példában újra egy Alpine Linux konténert indítunk el, de most úgy, hogy az egy parancsértelmezőt (/bin/sh) futtasson. A --restart=always paraméter hatására pedig a konténer automatikusan újraindul amikor az abban levő alkalmazás futása véget ér (ez a parancsértelmező esetén a exit begépelésével, vagy a Ctrl-D megnyomásával történhet). Az alábbi példában háromszor megpingeljük a 8.8.8.8 című gépet, majd az exit paranccsal kilépünk abból.

 1koczka@columbo:~$ docker run --restart=always --name=alpine -it alpine /bin/sh
 2Unable to find image 'alpine:latest' locally
 3latest: Pulling from library/alpine
 44abcf2066143: Pull complete
 5Digest: sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b
 6Status: Downloaded newer image for alpine:latest
 7/ # ping -c 3 8.8.8.8
 8PING 8.8.8.8 (8.8.8.8): 56 data bytes
 964 bytes from 8.8.8.8: seq=0 ttl=116 time=6.020 ms
1064 bytes from 8.8.8.8: seq=1 ttl=116 time=6.054 ms
1164 bytes from 8.8.8.8: seq=2 ttl=116 time=6.010 ms
12--- 8.8.8.8 ping statistics ---
133 packets transmitted, 3 packets received, 0% packet loss
14round-trip min/avg/max = 6.010/6.028/6.054 ms
15/ # exit

Azt, hogy a konténer elindítása után az abban futó parancsértelmezőben dolgozunk, a prompt megváltozása is jelzi. Ekkor az itt kiadott parancsaink tehát a konténer belső környezetében futnak le, és az exit parancs ezt a környezete hagyja el.

Amennyiben egy interaktív konténerből kilépünk, ahhoz az docker attach paranccsal lehet újra kapcsolódni. Értelemszerűen meg kell adni a kiválasztott konténer valamelyik azonosítóját: a konténer ID-jét vagy a nevét. A következő példában kihasználjuk, hogy az első indítás során a --name=alpine paraméterrel már beállítottuk a konténer nevét:

koczka@columbo:~$ docker attach alpine
/ #

Javaslat

  • Az operációs rendszereknél tanult screen-szerű működés konténerekben a Ctrl-p, majd a Ctrl-q megnyomásával érhető el.

Egy konténer leállítása

Egy konténer leállítására több mód is van, amelyek közül az adott helyzetnek megfelelően választhatunk. Ezek egyike sem törli magát a konténert, csupán leállítja azt, így a későbbiekben azok újraindíthatók.

A docker stop alpine parancs az operációs rendszer szignáljaihoz hasonlóan egy üzenettel jelzi az alpine nevű konténernek a kilépés kérését. Ez ebben az esetben szabályosan áll le, így az abban futó alkalmazások le tudják zárni az általuk megnyitott munkafájlokat, és törölhetik az esetleges átmeneti fájlokat.

Amennyiben például egy programhiba miatt egy konténer a stop üzenetre nem áll le, a kilépést a kill paranccsal lehet erőltetni. A docker kill alpine parancs az operációs rendszer kill -9 parancsához hasonlóan erőszakkal leállítja (terminálja) a konténert anélkül, hogy annak lehetősége lenne a szabályos kilépési művelet végrehajtására.

Egy konténer törlése

A fejlesztés során időről időre teszteljük az alkalmazásunkat, amelyet, ha konténerben futtatjuk, minden alkalommal a docker run paranccsal kell majd indítanunk. A korábbi példányokat el kell dobni, mert azok tartalma nem követi a fejlesztés változtatásait. Az újabb és újabb példányok létrejötte egy ilyen esetben nem szerencsés, mert – ahogyan már említettük – azok felszaporodnak a rendszerben, ezért az erőforrásokkal való takarékosság érdekében időről időre manuális úton kell törölni azokat. A „jelenség” alábbi kimenetben látható, amely két, azonos feladatot ellátó hello-world konténer:

koczka@columbo:~$  docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                     PORTS     NAMES
f87cb9248b50   hello-world   "/hello"   6 seconds ago    Exited (0) 9 seconds ago             brave_hawking
6b9d1f725626   hello-world   "/hello"   45 minutes ago   Exited (0) 4 minutes ago             silly_albattani

A megoldást egy újabb paraméter, a a --rm jelenti, amelynek hatására a docker run-nal indított konténer automatikusan törlődik, amikor annak futása véget ért. Fontos hogy egyértelmű legyen: ez a paraméter elsősorban a fejlesztés és a folyamatos módosítások esetén hasznos, éles üzemben, a végleges változatot üzemeltető rendszergazdák számára kifejezetten ellenjavallt lehet, mert ekkor a konténert a leállításakor vagy a működést biztosító operációs rendszer újraindításakor teljes egészében újra kell építeni. Ez nem csak erőforrásigényes feladat, hanem a konténerben tárolt esetleges adatok elvesztéséhez is vezethet (erről bővebben majd a Kötetek kezelése c. fejezetben lesz szó).

Példa: indítsuk el a hello-world konténer egy újabb példányát úgy, hogy az a lefutása után automatikusan törlődjön!

koczka@columbo:~$  docker run --rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
.
.

Listázva a rendszer konténereit látható, hogy a levő konténer példányok száma az újabb konténer példány létrehozása ellenére sem változott, abban csak a korábbi, már lefutott példányok vannak jelen:

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                     PORTS     NAMES
f87cb9248b50   hello-world   "/hello"   4 minutes ago    Exited (0) 4 minutes ago             brave_hawking
6b9d1f725626   hello-world   "/hello"   50 minutes ago   Exited (0) 9 minutes ago             silly_albattani

Egy konténer törlésére manuális úton is van lehetőség. A meglevő, már szükségtelen konténer példányokat a docker rm paranccsal lehet törölni, amelyhez paramétereként a konténer azonosítóját kell megadni. Csak azok a konténerek törölhetők, amelyek már nem futnak, szükség esetén ezeket a docker stop paranccsal le kell állítani, amit a --force paraméterrel lehet megkerülni. Egy lépésben több konténer is törölhető úgy, hogy azok azonosítóit szóközzel elválasztva soroljuk fel:

koczka@columbo:~$  docker rm f8 6b
f8
6b

A docker ps -a kimenete most már üres, azaz nincs egy konténer sem a rendszerben:

koczka@columbo:~$  docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Javaslat

Az összes leállított konténer törlését a docker container prune paranccsal lehet egyszerűen elvégezni. Unix rendszereken ezzel ekvivalens a docker rm $(docker ps -a -q -f status=exited) parancs, ez egyébként egy jó kis gyakorlat a shell-lel kapcsolatos ismereteink felfrissítésére.

Referencia

Az alábbi táblázatban összefoglaljuk a leggyakrabban használt docker parancsokat:

parancs

Jelentés

docker version

A Docker verziószámának megjelenítése.

docker run –name hw hello-world

A hello-world konténer egy új példányának létrehozása, amelynek neve hw lesz.

docker run busybox ls

A busybox indítása, majd abban az ls parancs végrehajtása.

docker ps

A futó konténerek listázása.

docker ps -a

A futó és a leállított konténerek listázása.

docker stop vibrant_solomon

A vibrant_solomon nevű konténer leállítása.

docker start vibrant_solomon

A korábban létrehozott, de már nem futó vibrant_solomon nevű konténer újraindítása.

docker kill vibrant_solomon

A vibrant_solomon nevű konténer processzének „erőszakos” leállítása.

docker rm 6d7e1cec74fa

A 6d7e1cec74fa azonosítójú konténer törlése.

docker container prune

Az összes leállított konténer törlése.

docker run –restart=always –name ub -it ubuntu bash

Az Ubuntu Linux utolsó változatának interaktív módú indítása, amelynek kilépése után az automatikusan újraindul. A konténer neve ub lesz.

docker attach ub

Kapcsolódás az interaktív módban futó ub nevű konténerhez.

docker inspect ub

Az ub nevű konténer részletes adatainak megtekintése.

docker search hello –limit 1

Az első olyan konténer keresése a DockerHubon, amelynek neve tartalmazza a hello szöveget.

docker exec ub ps axu

Az ub nevű konténerben végrehajtja a ps aux parancsot.

Összefoglalás

A fejezetben a konténerek kezeléséhez szükséges alapvető parancsokkal foglalkoztunk. Megismertük a DockerHub szerepét a konténerek beszerzésében és elérhetőségének biztosításában, megtanultuk a keresés és a letöltés lehetőségeit. A docker parancs számos paraméterét tekintettük át, majd megtanultuk, hogyan lehet konténereket indítani, leállítani és törölni. Megismertük a konténerek állapotának ellenőrzésére szolgáló parancsokat. Egy egyszerű hello-world konténer indításától eljutottunk egy interaktív módon használható Linux rendszer konténerizálásáig, eközben megismertük a legfontosabb Docker parancsokat, amelyekkel egy konténer igényeink szerint működtethető. A konténerek státuszának lekérdezésével alkalmaztuk a memória, diszk és hálózati statisztikák lekérdezéséhez szükséges parancsokat is. Végül, a fejezet végén található referenciában összefoglaltuk a legfontosabb alkalmazási módokat, amely segít a konténerek kezeléséhez szükséges paraméterek memorizálásában.

Feladatok

  1. Keresd meg a DockerHubon a python kulcsszóra illeszkedő a konténereket!

  2. Végezd el ugyanezt a feladatot a parancssorban úgy, hogy csak az első négy találat jelenjen meg!

  3. Indítsd el a busybox konténert a Docker segítségével! Pontosan milyen lépései vannak ennek a folyamatnak? Milyen lépések történnek a háttérben?

  4. A cowsay egy karakteres felületen futó program, amelynek egy paramétere van, a mondat, amit a tehénnek ki kell mondania :-). Indítsd el a rancher névtérben elérhető cowsay-t a hello paraméterrel!

  5. Töröld a cowsay konténer példányait!

  6. Milyen parancs használható az aktuális Docker verziószám megállapítására?

  7. Mi a különbség a „running”, „exited” és „paused” státuszok között?

  8. Hogyan lehet egy már létező konténert újraindítani? Adj egy példát erre!

  9. Hogyan lehet egy konténert törölni? Milyen parancs szükséges ehhez, és hogyan kell azt paraméterezni?

  10. Hogyan használható a docker inspect parancs egy futó konténer részletes információinak lekérdezésére? Mit jelentenek a kimenet egyes sorai?

  11. Hogyan lehet megtekinteni egy konténer memória használatát? Adj egy példát erre!

  12. Hogyan tudsz belépni egy futó konténerbe, hogy abban parancsokat lehessen kiadni? Milyen paramétereket szükségesek ehhez és mi ezek jelentése?

  13. Miért érdemes nevet adni a konténernek? Mikor és hogyan lehet ezt megadni? Adj egy gyakorlati példát!