Karcsúsítja Docker képeit

A 4. rész - Tanulja meg az Elég Dockert hasznosnak lenni

Jeff Hale

2019. január 31. · 9 perc olvasás

Ebben a cikkben megtudhatja, hogyan gyorsíthatja fel a Docker felépítési ciklusait és hogyan hozhat létre könnyű képeket. Ételmetaforáinkkal összhangban salátát fogunk enni, miközben karcsúsítjuk Docker képeinket - nincs több pizza, fánk és bagel.

karcsúsítja

A sorozat 3. részében tucatnyi Dockerfile utasítást ismertettünk. Ha elmulasztotta, nézze meg a cikket itt:

Tanulja meg, hogy elég Docker hasznos legyen

3. rész: Egy tucat Dandy Dockerfile utasítás

felédatascience.com

Itt a cheatsheet.

FROM - meghatározza az alap (helyes n) képet.
LABEL - metaadatokat nyújt. Jó hely a fenntartói információk feltöltésére.
ENV - állandó környezeti változót állít be.
RUN - futtat egy parancsot és létrehoz egy képréteget. Csomagok konténerekbe történő telepítésére szolgál.
COPY - fájlokat és könyvtárakat másol a tárolóba.
ADD - fájlokat és könyvtárakat másol a tárolóba. Feltöltheti a helyi .tar fájlokat.
CMD - parancsot és argumentumokat ad a végrehajtó tárolóhoz. A paraméterek felülírhatók. Csak egy CMD lehet.
WORKDIR - beállítja a munka könyvtárat a következő utasításokhoz.
ARG - meghatároz egy változót, amelyet át kell adni a Docker-nek az építéskor.
ENTRYPOINT - parancsot és argumentumokat ad a végrehajtó tárolóhoz. Az érvek továbbra is fennállnak.
EXPOSE - portot mutat.
VOLUME - létrehoz egy könyvtár csatlakozási pontot a tartós adatok eléréséhez és tárolásához.

Most nézzük meg, hogyan alakíthatjuk Docker-fájljainkat, hogy időt takarítsunk meg a képek fejlesztésekor és a konténerek meghúzásakor.

A Docker egyik erőssége, hogy gyorsítótárazást biztosít, hogy gyorsabban tudja ismételni a képépítéseket.

Kép készítésekor a Docker végigvezeti a Dockerfile utasításait, mindegyiket sorrendben végrehajtva. Az egyes utasítások vizsgálata során a Docker egy meglévő köztes képet keres a gyorsítótárában, amelyet újrafelhasználhat ahelyett, hogy új (ismétlődő) köztes képet hozna létre.

Ha a gyorsítótár érvénytelen, az azt érvénytelenítő utasítás és az összes következő Dockerfile utasítás új köztes képeket generál. Amint érvényteleníti a gyorsítótárat, ez a Dockerfile utasításainak további része.

Tehát a Dockerfile tetejétől kezdve, ha az alapkép már a gyorsítótárban van, akkor újra felhasználásra kerül. Ez egy sláger. Ellenkező esetben a gyorsítótár érvénytelen.

Ezután a következő utasítást összehasonlítják az alapképből származó gyorsítótár összes gyermekképével. Minden gyorsítótárazott köztes képet összehasonlítunk, hogy lássuk, az utasítás talál-e gyorsítótár-találatot. Ha a cache hiányzik, akkor a cache érvénytelen lesz. Ugyanezt a folyamatot addig ismételjük, amíg a Dockerfile végét el nem érjük.

A legtöbb új utasítást egyszerűen összehasonlítják a köztes képeken szereplőekkel. Ha egyezik, akkor a gyorsítótárazott példányt használják.

Például, amikor egy RUN pip install -r requirements.txt utasítás megtalálható egy Dockerfile-ban, a Docker ugyanazt az utasítást keresi a helyileg gyorsítótárazott köztes képeken. A régi és az új requirements.txt fájlok tartalmát nem hasonlítják össze.

Ez a viselkedés problematikus lehet, ha frissíti a követelmények.txt fájlt új csomagokkal, és a RUN pip install programot használja, és újra szeretné futtatni a csomag telepítését az új csomagnevekkel. Egy pillanat alatt bemutatok néhány megoldást.

A Docker más utasításaitól eltérően az ADD és a COPY utasítások megkövetelik, hogy a Docker megvizsgálja a fájl (ok) tartalmát, hogy megállapítsa, van-e gyorsítótár-találat. A hivatkozott fájl ellenőrző összegét összehasonlítjuk a meglévő köztes képek ellenőrző összegével. Ha a fájl tartalma vagy metaadatai megváltoztak, akkor a gyorsítótár érvénytelen lesz.

Íme néhány tipp a gyorsítótár gyors használatához.

  • A gyorsítótárazás kikapcsolható a --no-cache = True docker build használatával .
  • Ha módosítani akarja az utasításokat, akkor minden következő réteget gyakran felépítenek. A gyorsítótár előnyeinek kihasználása érdekében tegye a lehető legkisebb mértékben az utasításokat a Dockerfile-ba.
  • Láncoljon RUN apt-get update és apt-get install parancsokat a gyorsítótár kihagyási problémáinak elkerülése érdekében.
  • Ha olyan csomag telepítőt használ, mint például a pip a követelmények.txt fájllal, akkor kövesse az alábbi mintához hasonló modellt, hogy megbizonyosodjon arról, hogy nem kapott elavult köztes képet a követelményekben feltüntetett régi csomagokkal.

Ezek a javaslatok a Docker build gyorsítótár gyors használatához. Ha vannak mások, kérjük, ossza meg őket a megjegyzésekben vagy a Twitteren @discdiver.

A Docker képek nagyok lehetnek. Kicsiben szeretné tartani őket, hogy gyorsan kihasználhassák és kevés erőforrást használhassanak. Soványítsuk le a képeit!

Az Alpine alapkép egy teljes Linux disztribúció, sok minden más nélkül. A letöltés általában 5 MB alatt van, de több időt kell fordítania a működő alkalmazás létrehozásához szükséges függőségek kódjának megírására.

Ha Pythonra van szüksége a tárolójában, a Python Alpine build jó kompromisszum. Linuxot és Pythonot tartalmaz, és Ön szolgáltatja a legtöbbet.

Egy kép, amelyet a legújabb Python Alpine összeállítással készítettem nyomtatott („hello world”) szkript segítségével, súlya 78,5 MB. Itt van a Dockerfile:

A Docker Hub webhelyen az alapkép 29 MB-os. Amikor a gyermekkép felépül, letölti és telepíti a Python-t, így nagyobbá válik.

Az alpesi alapképek használata mellett egy másik módszer a képek méretének csökkentésére a többlépcsős összeállítások használata. Ez a technika bonyolultabbá teszi a Dockerfile-t is.

A többlépcsős buildek több FROM utasítást használnak. Szelektíven másolhatja a fájlokat, az úgynevezett build műtermékeket, egyik szakaszról a másikra. Bármit otthagyhat, amit nem akar a végső képen. Ez a módszer csökkentheti a teljes képméretet.

Minden FROM utasítás

  • az építkezés új szakaszát kezdi.
  • az előző szakaszokban létrehozott állapotokat hagyja maga után.
  • használhat más alapot.

Íme egy módosított példa a Docker dokumentumokból származó többlépcsős összeállításra:

Ne feledje, hogy az első szakaszt úgy nevezzük meg, hogy nevet fűzünk a FROM utasításhoz a névhez. A megnevezett szakaszra a COPY --from = utasításban hivatkozunk később a Dockerfile-ben.

A többlépcsős összeállításoknak bizonyos esetekben van értelme, amikor sok konténert fog gyártani a gyártás során. A többlépcsős összeállítások segítenek abban, hogy minden utolsó unciát (grammot, ha metrikusan gondolja) kiszorítson a képméretéből. Azonban néha a többlépcsős összeállítások még bonyolultabbá teszik, ami megnehezíti a képek fenntartását, így valószínűleg nem fogja használni a legtöbb buildben. A kompromisszumok további vitáját itt és a fejlett mintákat itt találja.

Ezzel szemben mindenkinek használnia kell egy .dockerignore fájlt, hogy segítsen Docker képeinek soványan tartani.

.A dockerignore fájlokról tudnia kell, mint olyan embernek, aki ismer elég Dockert ahhoz, hogy hasznos legyen ̶an̶g̶e̶r̶o̶u̶s̶.

.a dockerignore hasonló a .gitignore-hoz. Ez egy olyan fájl, amelyben a Docker a minták listájával illeszkedik a fájlnevekhez és kizárható a kép készítésekor.

Helyezze a .dockerignore fájlt ugyanabba a mappába, mint a Dockerfile és a többi építési kontextus.

Amikor a docker build programot futtatja egy kép létrehozásához, a Docker ellenőrzi, hogy van-e .dockerignore fájl. Ha talál egyet, akkor soronként halad át a fájlban, és a Go fájlútvonalát használja. A szabályoknak - és néhány Docker saját szabályának - egyeznie kell a fájlnevek kizárására. Gondoljon a Unix stílusú globális mintákra, ne a reguláris kifejezésekre.

Tehát a * .jpg kizárja a .jpg kiterjesztésű fájlokat. A videók pedig kizárják a videók mappát és annak tartalmát.

A #d kezdődő megjegyzésekkel elmagyarázhatja, hogy mit csinál a .dockerignore fájljában. .

Jó ötlet a .dockerignore használata a nem szükséges fájlok kizárására a Docker képből. .dockerignore:

  • segíthet abban, hogy titkait ne tárják fel. Senki sem akar jelszavakat a képein.
  • csökkentse a kép méretét. A kevesebb fájl kisebb, gyorsabb képeket jelent.
  • csökkentse a build gyorsítótár érvénytelenítését. Ha a naplók vagy más fájlok változnak, és a képe miatt érvényteleníti a gyorsítótárát, ez lelassítja az összeállítási ciklust.

Ez az oka annak, hogy egy .dockerignore fájlt használjon. További részletekért tekintse meg a dokumentumokat.

Nézzük meg, hogyan lehet megtalálni a Docker képek és tárolók méretét a parancssorból.

  • A futó tároló hozzávetőleges méretének megtekintéséhez használhatja a docker container ls -s parancsot .
  • A Docker image futtatása megmutatja a képek méretét.
  • A képet alkotó köztes képek méretének megtekintéséhez használja a docker képelőzményeit my_image: my_tag .
  • A docker image futtatása ellenőrizze a my_image: címkét sok mindent megmutat a képével kapcsolatban, beleértve az egyes rétegek méretét is. A rétegek finoman eltérnek az egész képet alkotó képektől. De úgy gondolhatja őket, mint a legtöbb célra. Nézze meg ezt a nagyszerű cikket Nigel Brown-tól, ha réteg- és köztes képbonyolultságokba akar mélyedni.
  • A merülési csomag telepítése és használata megkönnyíti a réteg tartalmának átlátását.

Frissítettem a fenti szakaszt 2019. február 8-án a felügyeleti parancsok nevének használatára. A sorozat következő részében tovább merülünk a közös Docker-parancsokban. Kövessen engem, hogy biztosan ne hagyja ki.

Most nézzünk meg néhány bevált gyakorlatot a dolgok csökkentése érdekében.

1. Használjon hivatalos alapképet, amikor csak lehetséges. A hivatalos képeket rendszeresen frissítik, és biztonságosabbak, mint a nem hivatalos képek.
2. Ha lehetséges, használja az alpesi képek variációit, hogy a képek könnyűek legyenek.
3. Az apt használata esetén kombinálja a RUN apt-get frissítést az apt-get telepítéssel ugyanabban az utasításban. Ezután láncoljon több csomagot az utasításban. Sorolja fel a csomagokat ábécé sorrendben, több soron a \ karakterrel. Például:

Ez a módszer csökkenti a felépítendő rétegek számát, és szépen és rendben tartja a dolgokat.
4. A RUN utasítás végén helyezze el a && rm -rf/var/lib/apt/lists/* szót az apt gyorsítótárának megtisztításához, hogy az ne legyen tárolva a rétegben. Lásd még a Docker dokkokat. Köszönet Vijay Raghavan Aravamudhan-nak ezért a javaslatért. Frissítve 2019. február 4.
5. Használja okosan a gyorsítótárat úgy, hogy alacsonyabban módosítja az utasításokat a Docker-fájlban.
6. Használjon egy .dockerignore fájlt, hogy a nem kívánt és felesleges fájlokat ne jelenítse meg a képen.
7. Nézze meg a merülést - ez egy nagyon jó eszköz a Docker képrétegek ellenőrzéséhez és a zsír levágásához.
8. Ne telepítsen olyan csomagokat, amelyekre nincs szüksége. Duh! De gyakori.

Most már tudja, hogyan lehet gyorsan elkészülő, gyorsan letölthető és nem sok helyet elfoglaló Docker-képeket készíteni. Mint az egészséges táplálkozás, a tudás is fél siker. Élvezze a zöldségeket! 🥗