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"]
- 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
- sor: kintről átveszem a
BUILDDATE
változót - sor: feltelepítem az
apache2
webszervert és ased
programot - sor: létrehozok egy csoportot és felhasználót (
appuser
) - sor: a webszerver által használt mappákat átadom az
appuser
-nek - sor: átállítom a webszerver konfigjában a portot
80
-ról8080
-ra - sor: létrehozom a statikus html oldalt
- sor: hozzáfűzöm az aktuális dátumot
- sor: beállítom, hogy
appuser
-ként fusson az apache - sor: beállítom, hogy a
8080
-as porton fusson az apache - sor: beállítom a munkakönyvtárat, ez arra jó, hogy a konténerbe lépéskor ide fog minket dobni
- 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.