VM sau Docker?

Cum să înțelegeți că aveți nevoie de Docker și nu de o VM? Trebuie să determinați exact ce doriți să izolați. Dacă doriți să izolați un sistem cu resurse garantate și hardware virtual, atunci alegerea ar trebui să cadă pe VM. Dacă trebuie să izolați aplicațiile care rulează ca procese de sistem separate, veți avea nevoie de Docker.

Deci, care este diferența dintre containerele Docker și VM-uri?

Mașină virtuală (VM) este un computer virtual cu toate dispozitivele virtuale și un hard disk virtual, pe care este instalat un nou sistem de operare independent împreună cu drivere pentru dispozitive virtuale, managementul memoriei și alte componente. Adică, obținem o abstractizare a hardware-ului fizic care vă permite să rulați multe computere virtuale pe un singur computer.
O VM instalată poate ocupa spațiu pe disc în diferite moduri:

  • spațiu fix pe hard disk, care permite accesul mai rapid la hard disk-ul virtual și evită fragmentarea fișierelor;
  • alocarea memoriei dinamice. La instalarea aplicațiilor suplimentare, memoria va fi alocată dinamic pentru acestea până când ajunge la suma maximă alocată acesteia.

Cu cât sunt mai multe mașini virtuale pe server, cu atât ocupă mai mult spațiu și necesită, de asemenea, suportul constant al mediului necesar pentru ca aplicația dvs. să funcționeze.

Docher este un software pentru construirea de aplicații bazate pe containere. Containerele și mașinile virtuale au beneficii similare, dar funcționează diferit. Containerele ocupă mai puțin spațiu, deoarece suprautilizarea mai multor resurse partajate ale sistemului gazdă decât VM, deoarece spre deosebire de VM, oferă virtualizare la nivel de sistem de operare, nu hardware. Această abordare oferă o amprentă mai mică în memorie, o implementare mai rapidă și o scalare mai ușoară.

Containerul oferă un mecanism mai eficient pentru încapsularea aplicațiilor prin furnizarea de interfețe necesare sistemului gazdă. Această caracteristică permite containerelor să partajeze nucleul sistemului, unde fiecare dintre containere rulează ca un proces separat al sistemului de operare principal, care are propriul set de zone de memorie (propriul său spațiu de adrese virtuale). Deoarece spațiul de adrese virtuale al fiecărui container este propriu, datele aparținând diferitelor zone de memorie nu pot fi modificate.
Sistemul de operare nativ pentru Docker este Linux (Docker poate fi folosit și pe Windows și MacOS), își folosește principalele avantaje, care îi permit să organizeze un nucleu divizat. Lansarea containerelor Docker pe Windows va avea loc într-o mașină virtuală Linux. containerele partajează sistemul de operare al sistemului gazdă, iar sistemul de operare principal pentru ele este Linux.

Container - cum funcționează?

Recipient este o abstractizare la nivel de aplicație care combină cod și dependențe. Containerele sunt întotdeauna create din imagini, adăugând un strat superior care poate fi scris și inițialând diverși parametri. Deoarece un container are propriul strat de scriere și toate modificările sunt stocate în acel strat, mai multe containere pot partaja accesul la aceeași imagine principală.

Fiecare container poate fi configurat printr-un fișier din proiectul docker-compose inclus în soluția principală, docker-compose.yml. Acolo puteți seta diverși parametri, cum ar fi numele containerului, porturile, identificatorii, limitele de resurse, dependențele dintre alte containere. Dacă nu specificați un nume de container în setări, atunci Docker va crea un nou container de fiecare dată, atribuindu-i un nume aleatoriu.

Când un container este pornit de la o imagine, Docker montează sistemul de fișiere de citire/scriere deasupra oricăror straturi de mai jos. Aici vor rula toate procesele pe care vrem să le ruleze containerul nostru Docker.

Când Docker pornește pentru prima dată un container, stratul inițial de citire/scriere este gol. Când apar modificări, acestea sunt aplicate layer-ului; de exemplu, dacă doriți să modificați un fișier, acel fișier va fi copiat din stratul de numai citire de mai jos în stratul de citire-scriere.
Versiunea numai pentru citire a fișierului va exista în continuare, dar acum este ascunsă sub copie. Volumele sunt folosite pentru stocarea datelor, indiferent de ciclul de viață al containerului. Volumele sunt inițializate atunci când este creat un container.

Cum este asociată imaginea cu containerul?

imagine - elementul principal pentru fiecare recipient. Imaginea este creată dintr-un fișier Dockerfile adăugat la proiect și este un set de sisteme de fișiere (straturi) stratificate unul peste altul și grupate împreună, disponibile numai pentru citire; numărul maxim de straturi este de 127.

În centrul fiecărei imagini se află o imagine de bază, care este specificată de comanda FROM - punctul de intrare atunci când se generează o imagine Dockerfile. Fiecare strat este un strat numai în citire și este reprezentat de o singură comandă care modifică sistemul de fișiere, scrisă într-un Dockerfile.
Pentru a combina aceste straturi într-o singură imagine, Docker folosește sistemul avansat de fișiere Union multi-strat (AuFS este construit pe deasupra UnionFS), permițând suprapunerea transparentă a diferitelor fișiere și directoare din diferite straturi de fișiere, creând un sistem de fișiere asociat.

Straturile conțin metadate care vă permit să stocați informații legate de fiecare strat în timpul execuției și în timpul construirii. Fiecare strat conține o legătură către stratul următor, dacă stratul nu are nicio legătură, atunci acesta este stratul cel mai de sus din imagine.

Dockerfile poate conține comenzi precum:

  • FROM - punct de intrare în formarea imaginii;
  • MAINTENER - numele proprietarului imaginii;
  • RUN - executarea comenzii în timpul asamblarii imaginii;
  • ADD - copierea fișierului gazdă într-o imagine nouă, dacă specificați un fișier URL, Docker îl va descărca în directorul specificat;
  • ENV - variabile de mediu;
  • CMD - începe crearea unui nou container pe baza imaginii;
  • ENTRYPOINT - Comanda este executată când containerul este pornit.
  • WORKDIR este directorul de lucru pentru executarea comenzii CMD.
  • USER - Setează UID-ul pentru containerul creat din imagine.
  • VOLUME - Montează directorul gazdă pe container.
  • EXPOSE este un set de porturi ascultate în container.

Cum funcționează UnionFS?

UnionFS — Service Stack File System (FS) pentru Linux și FreeBSD. Acest FS implementează mecanismul copy-on-write (Copy-On-Write, COW). Unitatea de lucru a UnionFS este un strat, fiecare strat ar trebui considerat ca un sistem de fișiere complet separat, cu o ierarhie de directoare de la rădăcină însăși. UnionFS creează o montare uniune pentru alte sisteme de fișiere și vă permite să îmbinați în mod transparent fișierele și directoarele din diferite sisteme de fișiere (numite ramuri) într-un singur sistem de fișiere legat, în mod transparent pentru utilizator.

Conținutul directoarelor cu aceleași căi va fi afișat împreună într-un director combinat (în același spațiu de nume) al sistemului de fișiere rezultat.

UnionFS combină straturi pe baza următoarelor principii:

  • unul dintre straturi devine un strat de nivel superior, al doilea și straturile ulterioare devin straturi de nivel inferior;
  • obiectele stratului sunt accesibile utilizatorului „de sus în jos”, adică. dacă obiectul solicitat se află în stratul „superior”, acesta este returnat, indiferent de prezența unui obiect cu același nume în stratul „inferior”; în caz contrar, obiectul stratului „de jos” este returnat; dacă obiectul solicitat nu este nici acolo, nici acolo, este returnată eroarea „Nu există un astfel de fișier sau director”;
  • stratul de lucru este cel „de sus”, adică toate acțiunile utilizatorului de a schimba datele sunt reflectate numai pe stratul de nivel superior, fără a afecta conținutul straturilor de nivel inferior.

Docker este cea mai comună tehnologie pentru utilizarea containerelor în munca de aplicare. A devenit standardul în acest domeniu, bazându-se pe cgroup-urile și spațiile de nume furnizate de kernel-ul Linux.

Docker ne permite să implementăm rapid aplicații și să folosim cât mai bine sistemul de fișiere prin partajarea nucleului sistemului de operare între toate containerele, rulând ca procese separate ale sistemului de operare.

Sursa: www.habr.com

Adauga un comentariu