Skip to content
Menu
msandor honlapja
  • Bemutatkozás
msandor honlapja

Docker image készítés

Posted on 2025.02.28.2025.02.28.

Mi szükségem van erre? Tele van az Internet ingyen letölthető konténerekkel.

Erre több válaszom is van (a teljesség igénye nélkül):

  • bizony előfordul, hogy nincs olyan image, amilyenre szükséged van
  • egy idegen által készített image használata bizalmi kérdés
  • esetleg találtál megfelelő image-t, de túl régi (nem tartják karban)
  • találtál megfelelő image-t, de hiányzik belőle 1-2 modul vagy csomag
  • vagy csak tudsz jobbat, kisebbet csinálni, mint néhány neves szoftver gyártó

Amikor kapok egy feladatot, hogy telepítsek fel egy bizonyos szoftvert a szerverre, első körben megnézem a docker hub-ot, hogy van-e belőle hivatalos image. Ilyen volt a több cikket is megélt zabbix is. Ha nincs, akkor a szoftver készítőjének a honlapján nézem meg a letöltései között. Ha nem támogatják a dockert, akkor két választásom van: vagy hagyományosan feltelepítem, vagy készítek hozzá én konténer imaget…

Mi kell a docker image készítéséhez?

Nem fogod kitalálni, de egy feltelepített docker 🙂

Amikor dockerről beszélek, minden esetben a „ce”, azaz a community edition-ről beszélek. Ez az ingyenes változata.

Ehhez a feladathoz nincs szükség labor környezetre, én minden esetben a saját laptopomon (Fedora Linux) szoktam készíteni. Természetesen ha Te windowsos gépről olvasol, és szeretnéd kipróbálni az itt olvasottakat, akkor szükséged lesz egy Linuxos gépre (erre megfelelő a WSL által nyújtott gép is). Itt találsz telepítési leírást a disztribúciódhoz.

Definiáljunk egy demó konténert

  • minél kisebb legyen
  • csak a szükséges csomagokat tartalmazza
  • az egyszerűség kedvéért egy statikus weblapot fog tartalmazni
  • ne rootként fusson, hanem egy dedikált felhasználóval (1000-től nagyobb UID-val)
  • 1024-től magasabb porton fusson
  • a statikus html nyitólapot is tartalmazza a konténer

Rögtön meg is mutatom a Dockerfile-t, majd alatta soronként megmagyarázom:

FROM alpine
ARG BUILDDATE
RUN apk add --no-cache apache2 sed \
    && addgroup -S appuser; adduser -u 12345 -G appuser -D -H appuser \
    && chown -R apache:apache /var/log/apache2 /var/www /run/apache2; chmod 777 /var/log/apache2 /run/apache2 \
    && sed -i "s/Listen 80/Listen 8080/" -i /etc/apache2/httpd.conf \
    && echo "<div style=\"text-align: center;\"><h1>Ez egy demo oldal egy apache konténerben...</h1>" > /var/www/localhost/htdocs/index.html \
    && echo "Build Date: "$BUILDDATE"</div>" >> /var/www/localhost/htdocs/index.html
USER appuser
EXPOSE 8080
WORKDIR /var/www/localhost/htdocs
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
  1. sor: az Alpine Linuxot választottam base image-nek, ez kisebb, mint 8 MB! Ha nem adok meg verziót (pl: alpine:3.21), akkor a legújabb stabil változatot fogja használni
  2. sor: kintről átveszem a BUILDDATE változót
  3. sor: feltelepítem az apache2 webszervert és a sed programot
  4. sor: létrehozok egy csoportot és felhasználót (appuser)
  5. sor: a webszerver által használt mappákat átadom az appuser-nek
  6. sor: átállítom a webszerver konfigjában a portot 80-ról 8080-ra
  7. sor: létrehozom a statikus html oldalt
  8. sor: hozzáfűzöm az aktuális dátumot
  9. sor: beállítom, hogy appuser-ként fusson az apache
  10. sor: beállítom, hogy a 8080-as porton fusson az apache
  11. sor: beállítom a munkakönyvtárat, ez arra jó, hogy a konténerbe lépéskor ide fog minket dobni
  12. sor: végül beállítom, hogy a konténer indításakor milyen kapcsolóval induljon el az apache

A sorok végi "\" jel a sortörésre szolgál, a sorok eleji "&&" karakterekkel pedig azt jelezzük, hogy új parancs következik.

A konténer rétegekből (layer) épül fel, így nem mindegy, hogy mennyit akarunk létrehozni, mivel minden réteg növeli az image méretét. Ezért tettem egy RUN alá az összes parancsot.

Hogyan kell elkészíteni, ha már megvan a recept?

Csinálj magadnak egy mappát, pl: mkdir -p ~/docker/apache.

Ebbe a mappába hozz létre egy fájlt Dockerfile néven, és másold bele a fenti 12 sort.

Végül ezzel a paranccsal készítsük el a lemezképünket (ami 12 MB lett):

docker buildx build --build-arg BUILDDATE=$(date +%Y.%m.%d.) --network=host --rm --progress=plain -t 127.0.0.1:5000/msandor/apache:2.4.62.b1 .

Itt adjuk át a dátumot a készülő konténernek, ebben a példában „év.hónap.nap.” formában. A legfontosabb paraméter magának a konténer image-nek a neve és verziója, ami négy tagból áll:

  • 127.0.0.1:5000/ -> ez lenne a docker registry neve/címe
  • msandor/ -> ez vagyunk mi, a készítő (opcionális)
  • apache: -> ez lenne a konténer neve/funkciója
  • 2.4.62.b1 -> ez pedig a verziója

Minden eleme tetszőlegesen állítható, az a lényeg, hogy könnyen felismerhető legyen.

Ez a build folyamat kimenete:

#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 688B done
#1 DONE 0.0s

#2 [internal] load metadata for docker.io/library/alpine:latest
#2 DONE 0.5s

#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s

#4 [1/3] FROM docker.io/library/alpine:latest@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
#4 CACHED

#5 [2/3] RUN apk add --no-cache apache2 sed     && addgroup -S appuser; adduser -u 12345 -G appuser -D -H appuser     && chown -R apache:apache /var/log/apache2 /var/www /run/apache2; chmod 777 /var/log/apache2 /run/apache2     && sed -i "s/Listen 80/Listen 8080/" -i /etc/apache2/httpd.conf     && echo "<div style="text-align: center;"><h1>Ez egy demo oldal egy apache konténerben...</h1>" > /var/www/localhost/htdocs/index.html     && echo "Build Date: "2025.02.27."</div>" >> /var/www/localhost/htdocs/index.html
#5 0.204 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
#5 0.397 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
#5 0.862 (1/7) Installing libuuid (2.40.4-r0)
#5 0.883 (2/7) Installing apr (1.7.5-r0)
#5 0.898 (3/7) Installing libexpat (2.6.4-r0)
#5 0.912 (4/7) Installing apr-util (1.6.3-r1)
#5 0.930 (5/7) Installing pcre2 (10.43-r0)
#5 0.954 (6/7) Installing apache2 (2.4.62-r0)
#5 0.978 Executing apache2-2.4.62-r0.pre-install
#5 1.094 (7/7) Installing sed (4.9-r2)
#5 1.112 Executing busybox-1.37.0-r12.trigger
#5 1.124 OK: 11 MiB in 22 packages
#5 DONE 1.5s

#6 [3/3] WORKDIR /var/www/localhost/htdocs
#6 DONE 0.3s

#7 exporting to image
#7 exporting layers
#7 exporting layers 0.3s done
#7 writing image sha256:e56d6bae42b7f745106965af984fd6dacf78248a98bde79e19d88ddc0a9c2282 done
#7 naming to 127.0.0.1:5000/msandor/apache:2.4.62.b1 0.0s done
#7 DONE 0.3s

Láthatjuk, hogy 7 rétegből áll az image. Ez abból a szempontból lehet érdekes, hogy ha újra buildeljük, akkor a gyorsítótár miatt csak azok a rétegek fognak újra generálódni, amik változtak. A mi esetünkben a #5 [2/3] RUN alatti réteg, mivel a dátum minden nap mást fog tartalmazni.

Tehát lefuttattam tegnap, majd ma egymás után kétszer (a „b” utáni számot minden esetben növeltem eggyel), így a 3. futásnál nem változott semmi, azaz a konténer IMAGE ID-ja megegyezik a 2. és a 3. buildelésnél (más szavakkal mondva, a belseje bitre megegyezik):

$ docker images
REPOSITORY                            TAG                    IMAGE ID       CREATED          SIZE
127.0.0.1:5000/msandor/apache         2.4.62.b2              e87f9da719e9   12 seconds ago   11.8MB
127.0.0.1:5000/msandor/apache         2.4.62.b3              e87f9da719e9   12 seconds ago   11.8MB
127.0.0.1:5000/msandor/apache         2.4.62.b1              e56d6bae42b7   13 hours ago     11.8MB

Egy dolog mégis változott a 2. és a 3. futtatáskor, a 3. már azonnal elkészült, mivel a docker remekül használja a gyorsítótárat.

Próbáljuk ki a friss konténerünket

Indítsuk el parancssorból:

docker run --rm -d --name apache-test -p 1080:8080 127.0.0.1:5000/msandor/apache:2.4.62.b1

A konténerünk apache-test néven fog elindulni és a 1080-as porton fogjuk elérni:

$ docker ps
CONTAINER ID   IMAGE                                           COMMAND                  CREATED         STATUS         PORTS                                         NAMES
978a057e2d97   127.0.0.1:5000/msandor/apache:2.4.62.b1         "/usr/sbin/httpd -D …"   4 minutes ago   Up 4 minutes   0.0.0.0:1080->8080/tcp, [::]:1080->8080/tcp   apache-test

Teszteljük le parancssorból:

$ curl http://localhost:1080
<div style="text-align: center;"><h1>Ez egy demo oldal egy apache konténerben...</h1>
Build Date: 2025.02.27.</div>

Böngészővel is megnyithatjuk:

Ennyi az egész, így tudjuk leállítani a konténert:

$ docker stop apache-test

Csak rajtunk múlik, hogy mit teszünk bele a konténerünkbe, mégis törekedjünk az egy alkalmazás/konténer felépítésre.

Vélemény, hozzászólás? Válasz megszakítása

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Kategóriák

  • ansible
  • docker
  • e-mail
  • git
  • hardware
  • hibakeresés
  • kubernetes
  • ldap
  • Linux
  • MariaDB
  • OpenWrt
  • Proxmox
  • security
  • SNMP
  • Synology
  • teszt
  • Unifi
  • UPS
  • vagrant
  • Virtualbox
  • zabbix
©2025 msandor honlapja | WordPress Theme by Superb WordPress Themes

Adatkezelési tájékoztató || Hibát talált az oldalon? Írja meg nekem. || Impresszum || Powered by WordPress

Oldalunk cookie-kat ("sütiket") használ. Ezen fájlok információkat szolgáltatnak számunkra a felhasználó oldallátogatási szokásairól a legjobb felhasználói élmény nyújtása érdekében, de nem tárolnak személyes információkat, adatokat. Szolgáltatásaink igénybe vételével Ön beleegyezik a cookie-k használatába. Kérjük, hogy kattintson az Elfogadom gombra, amennyiben böngészni szeretné weboldalunkat.ElfogadomAdatvédelmi irányelvek