Imagini, containere și registre
Modelul mental
| Concept | Ce reprezintă | Exemplu |
|---|---|---|
| Imagine | șablon read-only care conține aplicația și dependențele sale | alpine:3.24 |
| Container | instanță executată a unei imagini, cu propriul strat read/write | containerul alpine-demo |
| Registru | serviciu care stochează și distribuie imagini | Docker Hub sau GitHub Container Registry |
| Repository | colecție de versiuni ale aceleiași imagini într-un registru | library/alpine |
Aceeași imagine poate produce mai multe containere independente. Dacă un container este șters, imaginea rămâne disponibilă local și poate fi folosită pentru a crea altul.
Straturi
O imagine este alcătuită din straturi read-only. La construirea imaginii, instrucțiunile din Dockerfile generează straturi și metadate care pot fi reutilizate din cache.
La rulare, Docker adaugă deasupra imaginii un strat read/write specific acelui container. Datele importante nu trebuie păstrate doar în acest strat: ele dispar atunci când containerul este șters. Pentru persistență vom folosi volume.
Tag și digest
O referință uzuală are forma:
registry/repository:tag
De exemplu, în alpine:3.24, alpine este repository-ul, iar 3.24 este tag-ul.
- un tag este o etichetă ușor de citit și poate fi mutată către altă versiune a imaginii
- un digest identifică prin conținut o versiune exactă, de forma
sha256:... latesteste doar un tag implicit; numele său nu garantează că este alegerea potrivită sau cea mai nouă pentru proiect
Container sau mașină virtuală?
Un container rulează ca un proces izolat și folosește kernel-ul gazdei. O mașină virtuală include propriul sistem de operare și propriul kernel. Din acest motiv, containerele pornesc de obicei mai repede și au un overhead mai mic, dar nu sunt echivalente cu mașinile virtuale.
În imaginea de mai sus (preluată din documentația oficială Docker), mașinile virtuale rulează sisteme de operare "oaspete", lucru care consumă multe resurse, iar imaginea rezultată ocupă mult spațiu, conținând setări de sistem de operare, dependențe, patch-uri de securitate, etc. În schimb, containerele pot să împartă același nucleu, și singurele date care trebuie să fie într-o imagine de container sunt executabilul și pachetele de care depinde, care nu trebuie deloc instalate pe sistemul gazdă. Dacă o mașină virtuală abstractizează resursele hardware, un container Docker este un proces care abstractizează baza pe care rulează aplicațiile în cadrul unui sistem de operare și izolează resursele software ale sistemului de operare (memorie, access la rețea și fișiere, etc.).
Arhitectura Docker
Clientul docker trimite cereri către Docker Engine, care construiește imagini, creează rețele și volume și gestionează ciclul de viață al containerelor. Engine-ul comunică la nevoie cu un registru pentru a descărca sau publica imagini, așa cum se poate observa în imaginea de mai jos (preluată din documentația oficială Docker).
Fluxul de bază este:
- clientul trimite comanda către Docker Engine
- Engine-ul gestionează imaginile, containerele, rețelele și volumele locale
- când este necesar, Engine-ul descarcă sau publică imagini printr-un registru
Clientul și Engine-ul pot rula pe același sistem sau pe sisteme diferite. În Docker Desktop, Engine-ul pentru containere Linux rulează într-un mediu Linux administrat de aplicație.
Întrebări rapide
- Ce se poate crea de mai multe ori din aceeași imagine?
- Ce se pierde când ștergem un container fără volum?
- Când este un digest mai potrivit decât un tag?