Don; t Puneți borcane grase în imagini Docker

Postat pe 14 octombrie 2019. Actualizat pe 10 iunie 2020

Punerea unui borcan de grăsime într-un container Docker este o pierdere de depozitare, lățime de bandă și timp. Din fericire, putem valorifica straturile de imagine ale Docker și stocarea în cache a registrului pentru a crea versiuni incrementale și artefacte foarte mici. De exemplu, am putea reduce dimensiunea efectivă a noilor artefacte de la 75 MB la un singur MB! Și cel mai bun este că există un plugin pentru Maven și Gradle care gestionează totul pentru noi.

grase

  • Un borcan de grăsime conține toate dependențele care de obicei nu se schimbă între eliberări. Dar aceste dependențe sunt copiate iar și iar în fiecare borcan de grăsime ducând la o pierdere de spațiu, lățime de bandă și timp.
  • De exemplu, vasul de grăsime al aplicației noastre Spring Boot avea 72 MB mare, dar conținea doar 2 MB cod. De obicei, codul este singura parte care a fost modificată.
  • Din fericire, putem profita de straturile de imagine ale Docker: punând dependențele și resursele în diferite straturi, le putem reutiliza și actualiza doar codul pentru fiecare artefact/versiune.
  • Jib oferă un plugin ușor de utilizat pentru Maven și Gradle pentru a implementa această abordare. Nu este nevoie să scrieți manual un fișier Docker.

Mecanismul stratului Docker este puternic. Dacă toate aplicațiile dvs. utilizează aceeași imagine de bază (cum ar fi openjdk: 11.0.4-jre-slim) Docker reutilizează straturile sistemului de operare și ale JRE. Așadar, economisim spațiu de stocare în registrul Docker și accelerăm încărcarea și descărcarea din registru, deoarece trebuie transferați mai puțini MB (Docker transferă doar straturile noi în registru).

Din păcate, multe aplicații nu folosesc pe deplin acest mecanism puternic, deoarece utilizează borcane de grăsime într-un container Docker.

Fiecare versiune nouă creează un nou strat Docker cu 72 MB

Să presupunem că aplicația noastră Spring Boot este ambalată într-un borcan de grăsime. Acest borcan de grăsime are o dimensiune de 72 MB și este adăugat în ultima linie a fișierului Docker. Aceasta înseamnă că fiecare nouă versiune va necesita 72 MB spațiu de stocare și 72 MB trebuie încărcați și descărcați din registru.

Acum, este important să aruncăm o privire mai atentă asupra acestor 72 MB:

Conținutul unui borcan gras. Majoritatea conținutului său se schimbă rar, dar este copiat iar și iar în fiecare artefact.

Un borcan de grăsime conține trei părți:

  • Dependențe: bibliotecile utilizate iau cea mai mare parte a dimensiunii, dar se schimbă rar. De cele mai multe ori, atunci când creăm o versiune, ne-am atins doar de cod și nu de dependențe. Totuși, dependențele sunt copiate în fiecare versiune.
  • Resursele: Practic, este aceeași problemă aici. Deși resursele (HTML, CSS, imagini, fișiere de configurare etc.) se schimbă mai des decât dependențele, ele nu se schimbă tot atât de des pe cât se modifică codul. Dar sunt și duplicate în fiecare versiune.
  • Codul: codul are doar o mică parte din dimensiunea totală a borcanului de grăsime (300 KB - 2 MB), dar este cea mai frecvent schimbată parte a acestuia.

Deci, codul care este modificat de obicei pentru o nouă versiune este de doar câțiva MB. Totuși, copiem din nou și din nou toate dependențele și resursele din fiecare artefact. Este o pierdere de spațiu, lățime de bandă și timp.