VM eller Docker?

Hur förstår man att man behöver Docker och inte en virtuell dator? Du måste bestämma exakt vad du vill isolera. Om du vill isolera ett system med garanterade resurser och virtuell hårdvara, bör valet falla på den virtuella datorn. Om du behöver isolera applikationer som körs som separata systemprocesser behöver du Docker.

Så vad är skillnaden mellan Docker-containrar och virtuella datorer?

Virtuell maskin (VM) är en virtuell dator med alla virtuella enheter och en virtuell hårddisk, på vilken ett nytt oberoende OS är installerat tillsammans med virtuella enhetsdrivrutiner, minneshantering och andra komponenter. Det vill säga att vi får en abstraktion av fysisk hårdvara som gör att du kan köra många virtuella datorer på en dator.
En installerad virtuell dator kan ta upp diskutrymme på olika sätt:

  • fast hårddiskutrymme, vilket ger snabbare åtkomst till den virtuella hårddisken och undviker filfragmentering;
  • dynamisk minnesallokering. När du installerar ytterligare applikationer kommer minnet att tilldelas dynamiskt för dem tills det når den maximala mängden som tilldelats det.

Ju fler virtuella maskiner på servern, desto mer utrymme tar de upp, och kräver också det konstanta stödet från miljön som krävs för att din applikation ska fungera.

Hamnarbetare är en programvara för att bygga applikationer baserade på containrar. Behållare och virtuella maskiner har liknande fördelar, men fungerar annorlunda. Behållare tar mindre plats, eftersom överanvänder fler delade resurser i värdsystemet än den virtuella datorn, eftersom till skillnad från VM, tillhandahåller virtualisering på OS-nivå, inte hårdvara. Detta tillvägagångssätt ger mindre minnesfotavtryck, snabbare distribution och enklare skalning.

Behållaren tillhandahåller en mer effektiv mekanism för att kapsla in applikationer genom att tillhandahålla de nödvändiga gränssnitten till värdsystemet. Denna funktion gör det möjligt för behållare att dela kärnan i systemet, där var och en av behållarna körs som en separat process för huvudoperativsystemet, som har sin egen uppsättning minnesområden (sin egen virtuell adressrymd). Eftersom varje containers virtuella adressutrymme är sitt eget kan data som tillhör olika minnesområden inte ändras.
Det ursprungliga operativsystemet för Docker är Linux (Docker kan också användas på Windows och MacOS), det använder sina främsta fördelar, vilket gör att det kan organisera en delad kärna. Lanseringen av Docker-behållare på Windows kommer att ske inuti en virtuell Linux-maskin, eftersom behållare delar operativsystemet för värdsystemet och det huvudsakliga operativsystemet för dem är Linux.

Container – hur fungerar det?

behållare är en abstraktion på applikationsnivå som kombinerar kod och beroenden. Behållare skapas alltid från bilder, lägger till ett skrivbart toppskikt och initierar olika parametrar. Eftersom en behållare har sitt eget skrivlager och alla ändringar lagras i det lagret, kan flera behållare dela åtkomst till samma huvudbild.

Varje behållare kan konfigureras genom en fil i docker-compose-projektet som ingår i huvudlösningen docker-compose.yml. Där kan du ställa in olika parametrar som containernamn, portar, identifierare, resursgränser, beroenden mellan andra containrar. Om du inte anger ett containernamn i inställningarna kommer Docker att skapa en ny container varje gång och tilldela den ett namn slumpmässigt.

När en behållare startas från en bild, monterar Docker läs/skrivfilsystemet ovanpå valfritt lager nedan. Det är här alla processer som vi vill att vår Docker-behållare ska köra kommer att köras.

När Docker först startar en behållare är det initiala läs/skrivlagret tomt. När ändringar sker, appliceras de på det lagret; till exempel, om du vill modifiera en fil, kommer den filen att kopieras från det skrivskyddade lagret nedan till läs-skrivlagret.
Den skrivskyddade versionen av filen kommer fortfarande att finnas, men är nu gömd under kopian. Volymer används för att lagra data, oavsett behållarens livscykel. Volymer initieras när en behållare skapas.

Hur är bilden kopplad till behållaren?

bild - huvudelementet för varje container. Bilden skapas från en Dockerfil som lagts till i projektet och är en uppsättning filsystem (lager) skiktade ovanpå varandra och grupperade, endast tillgängliga för läsning; det maximala antalet lager är 127.

I hjärtat av varje bild finns en basbild, som specificeras av kommandot FROM - startpunkten när en Dockerfile-bild genereras. Varje lager är ett skrivskyddat lager och representeras av ett enda kommando som modifierar filsystemet, skrivet i en Dockerfil.
För att kombinera dessa lager till en enda bild använder Docker det avancerade flerlagers Union-filsystemet (AuFS är byggt ovanpå UnionFS), vilket gör att olika filer och kataloger från olika fillager transparent kan överlappa varandra, vilket skapar ett associerat filsystem.

Lager innehåller metadata som låter dig lagra relaterad information om varje lager vid körning och byggtid. Varje lager innehåller en länk till nästa lager, om lagret inte har någon länk är detta det översta lagret i bilden.

Dockerfile kan innehålla kommandon som:

  • FROM - ingångspunkt i bildandet av bilden;
  • MAINTAINER - namnet på ägaren av bilden;
  • RUN - kommandoexekvering under bildmontering;
  • ADD - kopierar värdfilen till en ny bild, om du anger en URL-fil kommer Docker att ladda ner den till den angivna katalogen;
  • ENV - miljövariabler;
  • CMD - startar skapandet av en ny behållare baserat på bilden;
  • ENTRYPOINT - Kommandot körs när behållaren startas.
  • WORKDIR är arbetskatalogen för att utföra CMD-kommandot.
  • ANVÄNDARE - Ställer in UID för behållaren som skapats från bilden.
  • VOLYM - Monterar värdkatalogen till behållaren.
  • EXPOSE är en uppsättning portar som lyssnas på i behållaren.

Hur fungerar UnionFS?

UnionFS — servicestackfilsystem (FS) för Linux och FreeBSD. Denna FS implementerar kopiera-på-skriv-mekanismen (Copy-On-Write, COW). Arbetsenheten för UnionFS är ett lager, varje lager bör betraktas som ett separat fullfjädrat filsystem med en kataloghierarki från själva roten. UnionFS skapar en unionsmontering för andra filsystem och låter dig transparent sammanfoga filer och kataloger från olika filsystem (kallade förgreningar) till ett enda länkat filsystem, öppet för användaren.

Innehållet i kataloger med samma sökvägar kommer att visas tillsammans i en kombinerad katalog (i samma namnområde) i det resulterande filsystemet.

UnionFS kombinerar lager baserat på följande principer:

  • ett av lagren blir ett lager på översta nivån, det andra och efterföljande lager blir lager på lägre nivå;
  • lagerobjekt är tillgängliga för användaren "från topp till botten", dvs. om det begärda objektet är i det "övre" lagret, returneras det, oavsett närvaron av ett objekt med samma namn i det "nedre" lagret; annars returneras "bottom" lagerobjektet; om det begärda objektet varken finns där eller där, returneras felet "Ingen sådan fil eller katalog";
  • arbetslagret är det "översta", det vill säga alla användaråtgärder för att ändra data återspeglas endast på toppnivålagret, utan att påverka innehållet i lager på lägre nivå.

Docker är den vanligaste tekniken för att använda containrar i applikationsarbete. Det har blivit standarden på det här området och bygger på cgroups och namnutrymmen som tillhandahålls av Linux-kärnan.

Docker tillåter oss att snabbt distribuera applikationer och utnyttja filsystemet på bästa sätt genom att dela OS-kärnan mellan alla behållare, som körs som separata OS-processer.

Källa: will.com

Lägg en kommentar