VM ili Docker?

Kako shvatiti da vam treba Docker, a ne VM? Morate odrediti šta tačno želite izolirati. Ako želite da izolujete sistem sa zagarantovanim resursima i virtuelnim hardverom, onda bi izbor trebao pasti na VM. Ako trebate izolirati pokrenute aplikacije kao zasebne sistemske procese, trebat će vam Docker.

Dakle, koja je razlika između Docker kontejnera i VM-a?

Virtuelna mašina (VM) je virtuelni računar sa svim virtuelnim uređajima i virtuelnim hard diskom, na koji je instaliran novi nezavisni OS zajedno sa drajverima virtuelnih uređaja, upravljanjem memorijom i drugim komponentama. To jest, dobijamo apstrakciju fizičkog hardvera koji vam omogućava da pokrenete više virtuelnih računara na jednom računaru.
Instalirani VM može zauzeti prostor na disku na različite načine:

  • fiksni prostor na tvrdom disku, koji omogućava brži pristup virtuelnom tvrdom disku i izbjegava fragmentaciju datoteka;
  • dinamička alokacija memorije. Prilikom instaliranja dodatnih aplikacija, memorija će im se dinamički dodijeliti dok ne dostigne maksimalnu količinu koja joj je dodijeljena.

Što više virtuelnih mašina na serveru, to više prostora zauzimaju, a takođe zahtevaju stalnu podršku okruženja potrebnu da bi vaša aplikacija radila.

doker je softver za izgradnju aplikacija zasnovanih na kontejnerima. Kontejneri i virtuelne mašine imaju slične prednosti, ali rade drugačije. Kontejneri zauzimaju manje prostora, jer prekomjerno koristite više zajedničkih resursa host sistema nego VM, jer za razliku od VM-a, pruža virtuelizaciju na nivou OS, a ne hardvera. Ovaj pristup pruža manji memorijski otisak, bržu implementaciju i lakše skaliranje.

Kontejner obezbeđuje efikasniji mehanizam za inkapsuliranje aplikacija obezbeđivanjem potrebnih interfejsa za host sistem. Ova karakteristika omogućava kontejnerima da dijele jezgro sistema, gdje svaki od kontejnera radi kao poseban proces glavnog OS-a, koji ima svoj vlastiti skup memorijskih područja (svoj virtuelni adresni prostor). Budući da je virtualni adresni prostor svakog kontejnera svoj, podaci koji pripadaju različitim memorijskim područjima ne mogu se mijenjati.
Izvorni OS za Docker je Linux (Docker se također može koristiti na Windows i MacOS), koristi svoje glavne prednosti koje mu omogućavaju organiziranje podijeljenog kernela. Lansiranje Docker kontejnera na Windows-u će se odvijati unutar Linux virtuelne mašine. kontejneri dijele OS glavnog sistema i glavni OS za njih je Linux.

Kontejner - kako radi?

Kontejner je apstrakcija na nivou aplikacije koja kombinuje kod i zavisnosti. Kontejneri se uvijek kreiraju od slika, dodajući gornji sloj koji se može pisati i inicijalizirati različite parametre. Budući da kontejner ima svoj vlastiti sloj za pisanje i sve promjene su pohranjene u tom sloju, više kontejnera može dijeliti pristup istoj glavnoj slici.

Svaki kontejner se može konfigurirati putem datoteke u projektu docker-compose koji je uključen u glavno rješenje, docker-compose.yml. Tamo možete postaviti različite parametre kao što su naziv kontejnera, portovi, identifikatori, ograničenja resursa, zavisnosti između drugih kontejnera. Ako ne navedete naziv kontejnera u postavkama, Docker će svaki put kreirati novi kontejner, dodjeljujući mu ime nasumično.

Kada se kontejner pokrene sa slike, Docker montira sistem datoteka za čitanje/pisanje na bilo koji sloj ispod. Ovdje će se pokrenuti svi procesi koje želimo da naš Docker kontejner pokreće.

Kada Docker prvi put pokrene kontejner, početni sloj za čitanje/pisanje je prazan. Kada dođe do promjena, one se primjenjuju na taj sloj; na primjer, ako želite izmijeniti datoteku, ta datoteka će biti kopirana sa sloja samo za čitanje ispod u sloj za čitanje i pisanje.
Verzija datoteke samo za čitanje će i dalje postojati, ali je sada skrivena ispod kopije. Volumi se koriste za skladištenje podataka, bez obzira na životni ciklus kontejnera. Volumi se inicijaliziraju kada se kreira spremnik.

Kako je slika povezana sa kontejnerom?

Slika - glavni element za svaki kontejner. Slika je kreirana iz Dockerfile-a dodanog projektu i predstavlja skup sistema datoteka (slojeva) raspoređenih jedan na drugi i grupisanih zajedno, dostupnih samo za čitanje; maksimalan broj slojeva je 127.

U srcu svake slike je osnovna slika, koja je određena naredbom FROM - ulazna tačka prilikom generisanja Dockerfile slike. Svaki sloj je sloj samo za čitanje i predstavljen je jednom naredbom koja modificira sistem datoteka, napisana u Dockerfile-u.
Za kombinovanje ovih slojeva u jednu sliku, Docker koristi napredni višeslojni sistem datoteka Union (AuFS je izgrađen na vrhu UnionFS), dozvoljavajući različitim datotekama i direktorijumima iz različitih slojeva datoteka da se transparentno preklapaju, stvarajući pridruženi sistem datoteka.

Slojevi sadrže metapodatke koji vam omogućavaju pohranjivanje povezanih informacija o svakom sloju u vrijeme izvođenja i izgradnje. Svaki sloj sadrži vezu sa sljedećim slojem, ako sloj nema vezu, onda je ovo najviši sloj na slici.

Dockerfile može sadržavati naredbe kao što su:

  • FROM - ulazna tačka u formiranju slike;
  • MAINTAINER - ime vlasnika slike;
  • RUN - izvršenje naredbe tokom sklapanja slike;
  • DODAJ - kopiranje host datoteke u novu sliku, ako navedete URL datoteku, Docker će je preuzeti u navedeni direktorij;
  • ENV - varijable okruženja;
  • CMD - počinje kreiranje novog kontejnera na osnovu slike;
  • ENTRYPOINT - Naredba se izvršava kada se kontejner pokrene.
  • WORKDIR je radni direktorij za izvršavanje CMD naredbe.
  • KORISNIK - Postavlja UID za kontejner kreiran od slike.
  • VOLUME - Montira host direktorij u kontejner.
  • EXPOSE je skup portova koji se slušaju u kontejneru.

Kako funkcioniše UnionFS?

UnionFS — sistem datoteka servisnog steka (FS) za Linux i FreeBSD. Ovaj FS implementira mehanizam kopiranja na upisivanje (Copy-On-Write, COW). Radna jedinica UnionFS-a je sloj, svaki sloj treba smatrati zasebnim punopravnim sistemom datoteka s hijerarhijom direktorija od samog korijena. UnionFS kreira union mount za druge sisteme datoteka i omogućava vam transparentno spajanje datoteka i direktorija iz različitih sistema datoteka (koji se nazivaju granama) u jedan povezani sistem datoteka, transparentno za korisnika.

Sadržaj direktorija sa istim stazama će biti prikazan zajedno u jednom kombinovanom direktorijumu (u istom imenskom prostoru) rezultirajućeg sistema datoteka.

UnionFS kombinuje slojeve na osnovu sledećih principa:

  • jedan od slojeva postaje sloj najvišeg nivoa, drugi i sljedeći slojevi postaju slojevi nižeg nivoa;
  • objekti sloja su dostupni korisniku „od vrha do dna“, tj. ako je traženi objekat u "gornjem" sloju, vraća se, bez obzira na prisustvo objekta istog imena u "donjem" sloju; u suprotnom, vraća se objekat sloja "donji"; ako traženi objekat nije ni tamo ni tamo, vraća se greška "Nema takve datoteke ili direktorija";
  • radni sloj je „gornji“, odnosno, sve radnje korisnika za promenu podataka odražavaju se samo na sloju najvišeg nivoa, bez uticaja na sadržaj slojeva nižeg nivoa.

Docker je najčešća tehnologija za korištenje kontejnera u radu aplikacija. Postao je standard u ovoj oblasti, nadovezujući se na cgroups i namespaces koje obezbeđuje Linux kernel.

Docker nam omogućava da brzo implementiramo aplikacije i na najbolji način iskoristimo sistem datoteka tako što dijelimo jezgro OS-a između svih kontejnera, koji rade kao zasebni procesi OS-a.

izvor: www.habr.com

Dodajte komentar