Kihagyás

Docker alapok

Előadás

Konténer-technológiák és Docker alapok

Cél

A labor célja megismerni a Docker konténerek használatának alapjait és a leggyakrabban használt Docker CLI parancsokat.

Előkövetelmények

Feladatok

Docker Desktop

  • Indítsuk el a Docker Desktop-ot.
  • Keressük meg a tálcán az ikont.
  • Nézzük meg a beállítási lehetőségeit.
  • Keressük meg a Switch to Linux containers / Switch to Windows containers parancsokat.
  • Csak Windows-on: keressük meg a háttérben futó Hyper-V VM-et.
  • Csak Windows-on: Ha tudjuk, kapcsoljuk be a WSL2-t.

Docker hello world

  • Nyissunk egy PowerShell konzolt, és adjuk ki a következő parancsokat.
  • docker --version
    • Ezzel ellenőrizhetjük, hogy a docker CLI elérhető-e.
  • docker run hello-world

Konténer futtatása interaktív módon

  • Add ki a következő parancsot: docker run -it ubuntu
    • Nézzük meg a fájlrendszert: ls
    • Lépjünk ki az interaktív shell-ből: exit
  • Konténer terminált, mert a bash folyamat megállt az exit hatására. Konténer addig fut, amíg a benne levő alkalmazás (folyamat) fut.
  • Leállt konténer nem törlődik automatikusan, tartalma nem veszik el: docker ps -a. Nézzük meg a parancs eredményét. Keressük meg a konténerek id-ját.
  • Távolítsuk el a két konténert, amit mi indítottunk: docker rm <id1> <id2>

Docker CLI parancsok struktúrája

  • Adjuk ki a docker parancsot a help-hez.
  • Adminisztratív parancsok: mivel mit, pl. docker image ls
  • Kezelő parancsok: parancs argumentumok, pl. docker rmi <id>
  • Gyakran használtak:
    • Konténerek kezelése
      • docker container ls [-all] avagy docker ps [-a]
      • docker run [opciók] <image>
      • docker stop <id>
      • docker rm <id>
    • Image-ek kezelése
      • docker pull <image>
      • docker image ls avagy docker images
      • docker rmi <image>
      • docker tag <id> <tag>
  • Konkrét parancshoz segítség: docker <parancs> --help

Minden konténer (futók is!) eltávolítása

docker rm -f $(docker ps -aq) (PowerShell)

Volume csatolása (bind mount)

  • Hozzunk létre egy munkakönyvtárat, pl. c:\work\<neptun>\foo
  • Indítsunk el egy konténert úgy, hogy ezt a könyvtárat felcsatoljuk
    • docker run -it --rm -v c:\work\<neptun>\foo:/bar ubuntu
    • szintaktika: helyi teljes elérési útvonal kettőspont konténeren belüli teljes elérési útvonal
    • Konténeren belül: ls, látjuk a /bar könyvtárat
    • Írjunk bele: echo "hello" > /bar/a.txt
    • exit
  • Nézzük meg a munkakönyvtárunkat.

--rm

A --rm opció törli a konténert leállás után; pl. teszteléshez hasznos, mint most.

Port mappelés

  • Indítsunk el egy nginx webszervert: docker run -d -p 8085:80 nginx
    • -d opció: háttérben fut, a konzolt "visszakaptunk", amint elindult a konténer, és kiírja az image id-t
    • -p helyi port kettőspont konténeren belüli port
  • Nyissuk meg böngészőben ezt a címet: http://localhost:8085
  • Nézzük meg a konténer logjait: docker logs <id>
  • Állítsuk le a konténert: docker stop <id>

Műveletvégzés futó konténerben

  • Indítsunk el egy nginx webszervert: docker run -d -p 8085:80 nginx
    • Jegyezzük meg a kiírt konténer id-t, alább használni fogjuk.
  • Futtassunk le egy parancsot a konténerben: docker exec <id> ls /
    • A parancs kilistázta a konténer fájlrendszerének gyökerét.
  • Kérhetünk egy shell-t is a konténerbe ily módon: docker exec -it <id> /bin/bash
    • Az -it opció az interaktivitásra utal, azaz a konzolunkat "hozzáköti" a konténerben futó shellhez.
    • Tipikusan vagy /bin/bash vagy /bin/sh a Linux konténerekben a shell. Utóbbi az alpine alapú konténerekben gyakori.
    • Ebben az interaktív shell-ben bármit csinálhatunk, beléphetünk könyvtárakba, megnézhetünk fájlokat, stb. (Arra viszont ügyeljünk, hogy az így végzett módosításaink elvesznek, amikor a konténer törlésre kerül.)
    • Például nézzük meg az nginx konfigurációját: cat /etc/nginx/conf.d/default.conf
    • Lépjünk ki az exit utasítással. Ez csak a "második" shellt állítja le, a konténer még fut, mert az eredeti indítási pont is még fut.
  • Ha szükségünk van egy fájlra, akkor azt kimásolhatjuk a futó konténerből: docker cp <id>:/etc/nginx/conf.d/default.conf c:\work\nginx.conf
    • Szintaktikája: docker cp <id>:</full/path> <cél/hely>
    • A másolás az ellenkező irányba is működik, helyi gépről a konténerbe.

Docker registry

  • Korábban használt parancs: docker run ubuntu Az ubuntu az image neve. Ez egy un. registry-ből jön.
  • Alapértelmezett registry: https://hub.docker.com
    • Tipikusan open-source szoftverek image-ei, és az általunk is használt alap image-ek.
    • Vannak továbbiak is (Azure, Google, stb.)
    • Analógia: NPM csomagkezelő, NuGet.org
  • Image neve valójában nem ubuntu, hanem index.docker.io/ubuntu:latest
    • index.docker.io registry szerver elérési útvonala
    • ubuntu image neve (lehet többszintű is)
    • :latest tag neve
  • Hasonló példa: mcr.microsoft.com/dotnet/core/runtime:2.1
  • Két fajta registry: publikus (pl. Docker Hub) és privát
    • Privát registry esetén: docker login <url> és docker logout <url>
  • Letöltés a registry-ből: docker pull mcr.microsoft.com/dotnet/core/runtime:2.1
    • Ugyan a run parancs is letölti, de csak akkor, ha még nem létezik. Nem ellenőrzi viszont, hogy nincs-e újabb image verzió publikálva. A pull mindig frisset szed le.

Készítsünk saját image-et

Kövesd az alábbi lépéseket egy saját image elkészítéséhez.

Az alábbinál lesz jobb megoldás, lásd következő órán.

  1. Indíts el egy nginx image-et: docker run -d -p 8085:80 nginx Jegyezd meg az image id-t, alább többször is használni fogjuk.
  2. "Lépj be" a futó konténerbe egy interaktív bash shellben: docker exec -it <id> /bin/bash
  3. A bash shellben lépj be az nginx által kiszolgált index html-t tartalmazó mappába: cd /usr/share/nginx/html/
  4. Nézd meg a mappa tartalmát: ls
  5. Írd felül az index.html tartalmát: echo "hello from nginx" > index.html
  6. Lépj ki a shellből: exit
  7. Ellenőrizd meg, hogy a konténer még fut: docker ps
  8. Nyisd meg böngészőből a http://localhost:8085 címet, ellenőrizd, hogy megjelenik a saját tartalom
  9. Készíts egy pillanatmentést a konténer jelenlegi állapotáról: docker commit <id>
  10. Az előbbi parancs készített egy image-et, aminek kiírta a hash-ét. Ellenőrizd, hogy tényleg létezik-e ez az image: docker images
  11. Állítsd le a háttérben futó konténert: docker stop <id>
  12. Taggeld meg az image-et: docker tag <imageid> mynginx (itt már az image id-ja kell)
  13. Indíts el egy új konténert az előbb létrehozott saját image-ből: docker run -it --rm -p 8086:80 mynginx (A portszám szándékosan más, hogy biztosan legyünk benne, nem a korábban futóhoz csatlakozunk - ha mégse állítottuk volna azt le.)
  14. Nyisd meg böngészőből a http://localhost:8086 címet. Látható, hogy ez a módosított tartalmat jeleníti meg. Tehát mynginx néven létrehoztunk egy saját image-et.

Takarítás

Fejlesztés közben sok ideiglenes image keletkezik, és konténereket hagyunk hátra. Add ki a következő parancsot a nem futó konténerek törléséhez és az ideiglenes (címke nélküli) image-ek törléséhez: docker system prune

Docker kontérek események megfigyelése

Docker events lifecycle

  • Nyissunk meg 2 PowerShell konzolt egymást mellé.
  • A bal oldali konzolon indítsuk el a docker eseményfigyelő szolgáltatását docker events
  • A jobb oldali konzolon indítsunk el egy nginx konténert docker run -d -p 8085:80 --name nginx nginx
  • Ekkor a bal oldalon láthatóak az események. Figyeljük meg, milyen metrikák találhatóak itt.
  • Hogy olvashatóbb legyen, állítsuk le a processt, CTRL-C-vel, majd: docker events | cut -c1-70
  • Szimuláljunk konténer meghibásodást: docker kill nginx
  • Adjuk ki a docker rm -f nginx parancsot, mit láthatunk? Vessük össze a mellékelt ábra eseményeivel.

További olvasnivaló

Back to top