Hur förstÄr man att man behöver Docker och inte en VM? Det handlar om att avgöra vad man vill isolera. Om man behöver isolera ett system med garanterade dedikerade resurser och virtuell hÄrdvara, bör valet falla pÄ en VM. NÀr man istÀllet vill isolera körande applikationer som separata processer i systemet, behövs Docker.
Vad Àr dÄ skillnaden mellan Docker-containrar och VM?
En virtuell maskin (VM) Àr en virtuell dator med alla virtuella enheter och en virtuell hÄrddisk, dÀr en ny oberoende operativsystem installeras tillsammans med virtuella enhetsdrivrutiner, minneshantering och andra komponenter. Det innebÀr att vi fÄr en abstraction av den fysiska hÄrdvaran, vilket gör det möjligt att köra flera virtuella datorer pÄ en och samma dator.
En installerad VM kan ta upp olika mycket diskutrymme pÄ datorn:
- fast plats pÄ hÄrddisken, vilket möjliggör snabbare Ätkomst till den virtuella hÄrddisken och förhindrar fragmentering av filen;
- dynamisk minnesallokering. Vid installation av ytterligare applikationer allokeras minnet dynamiskt till dem, tills den maximala volym som avsatts för det nÄs.
Ju fler virtuella maskiner pÄ servern, desto mer utrymme tar de upp, och de krÀver ocksÄ kontinuerligt stöd för den miljö som behövs för att köra din applikation.
Docker Àr mjukvara för att bygga applikationer baserade pÄ containrar. Containrar och virtuella maskiner har liknande fördelar, men fungerar pÄ olika sÀtt. Containrar tar upp mindre plats eftersom de ÄteranvÀnder fler gemensamma resurser frÄn vÀrdsystemet Àn en VM, eftersom de, till skillnad frÄn VM, erbjuder virtualisering pÄ operativsystemsnivÄ snarare Àn hÄrdvarunivÄ. Denna metod ger en mindre minnesanvÀndning, snabbare distribution och enklare skalning.
Containern ger en mer effektiv mekanism för applikationsinkapsling, som tillhandahÄller nödvÀndiga grÀnssnitt för vÀrdsystemet. Denna funktion möjliggör för containrar att dela kÀrnan i systemet, dÀr varje container fungerar som en separat process för det primÀra operativsystemet, som har sin egen uppsÀttning minnesomrÄden (ett eget virtuellt adressutrymme). Eftersom det virtuella adressutrymmet för varje container Àr eget kan data som tillhör olika minnesomrÄden inte Àndras.
Den nativa operativsystemet för Docker Àr Linux (Docker kan Àven anvÀndas pÄ Windows och MacOS), det utnyttjar dess huvudsakliga fördelar som möjliggör delning av kÀrnan. NÀr Docker-containrar körs pÄ Windows sker det inom en virtuell maskin med Linux som operativsystem, eftersom containrar delar vÀrdsystemets operativsystem och för dem Àr Linux det primÀra operativsystemet.
Vad Ă€r en container â hur fungerar det?
Container â det Ă€r en applikationsnivĂ„abstraktion som förenar kod och beroenden. Containrar skapas alltid frĂ„n bilder, med en skrivbar överliggande lager som lĂ€ggs till och initierar olika parametrar. Eftersom containern har sitt eget skrivskikt och alla förĂ€ndringar sparas i detta skikt, kan flera containrar dela Ă„tkomst till samma grundlĂ€ggande bild.
Varje container kan konfigureras via en fil i docker-compose-projektet, som ingĂ„r i den övergripande lösningen â docker-compose.yml. DĂ€r kan olika parametrar anges, sĂ„som container namn, portar, identifierare, resursbegrĂ€nsningar, beroenden mellan andra containrar. Om inget namn anges i instĂ€llningarna kommer Docker att skapa en ny container varje gĂ„ng med ett slumpmĂ€ssigt namn.
NÀr en container startas frÄn en bild monterar Docker filsystemet för lÀsning och skrivning ovanpÄ alla lager nedan. Det Àr hÀr alla processer kommer att köras som vi vill att vÄr Docker-container ska utföra.
NÀr Docker för första gÄngen startar en container Àr det initiala lÀs- och skrivlagret tomt. NÀr förÀndringar görs tillÀmpas de pÄ detta lager; till exempel, om du vill Àndra en fil, kommer den filen att kopieras frÄn det skrivskyddade lagret nedan till lÀs- och skrivlagret.
Versionsfilen, som endast Àr tillgÀnglig för lÀsning, kommer fortfarande att finnas, men nu Àr den gömd under en kopia. Volymer anvÀnds för att lagra data oavsett behÄllarens livscykel. Volymer initieras vid skapandet av en behÄllare.
Hur Àr en bild kopplad till en behÄllare?
Typ â huvudkomponenten för varje behĂ„llare. En bild skapas frĂ„n en Dockerfile som lagts till i projektet och representerar en uppsĂ€ttning filsystem (lager) som Ă€r staplade pĂ„ varandra och grupperade tillsammans, tillgĂ€ngliga för lĂ€sning; maximalt antal lager Ă€r 127.
I grunden för varje bild finns en basbild som anges med kommandot FROM â ingĂ„ngspunkten vid skapandet av en Dockerfile. Varje lager Ă€r ett readonly-lager och representeras av ett kommando som modifierar filsystemet som skrivs i Dockerfile.
För att kombinera dessa lager till en bild anvÀnder Docker ett avancerat flerskiktat unionfilsystem (AuFS byggt pÄ UnionFS), vilket gör att olika filer och kataloger frÄn olika fil-lager kan överlappas transparent, vilket skapar ett sammanlÀnkat filsystem.
Lagren innehÄller metadata som gör att tillhörande information om varje lager kan sparas under körning och byggande. Varje lager har en lÀnk till nÀsta lager, om lagret inte har nÄgon lÀnk betyder det att det Àr det översta lagret i bilden.
Dockerfile kan innehÄlla kommandon som:
- FROM â ingĂ„ngspunkten vid skapandet av en bild;
- MAINTAINER â namnet pĂ„ Ă€garen av bilden;
- RUN â kör kommandot under bildbygget;
- ADD â kopiera en fil frĂ„n vĂ€rdade till en ny bild, om en URL till filen anges, kommer Docker att hĂ€mta den till den angivna katalogen;
- ENV â miljövariabler;
- CMD â startar skapandet av en ny behĂ„llare baserat pĂ„ bilden;
- ENTRYPOINT â kommandot körs vid start av behĂ„llaren.
- WORKDIR â arbetskatalogen för att köra CMD-kommandot.
- USER â stĂ€ller in UID för den behĂ„llare som skapas baserat pĂ„ bilden.
- VOLUME â monterar en vĂ€rdkatalog i behĂ„llaren.
- EXPOSE â uppsĂ€ttning portar i behĂ„llaren som lyssnas pĂ„.
Hur fungerar UnionFS?
UnionFS â en tjĂ€nstemĂ€ssig stĂ€cks filsystem (FS) för Linux och FreeBSD. Detta filsystem implementerar en mekanism för kopiering vid skrivning (Copy-On-Write, COW). Arbetsenheten för UnionFS Ă€r ett lager, och varje lager bör betraktas som ett separat fullstĂ€ndigt filsystem med en hierarki av kataloger frĂ„n roten. UnionFS skapar en sammansatt montering för andra filsystem och tillĂ„ter anvĂ€ndaren att transparent sammanfoga filer och kataloger frĂ„n olika filsystem (som kallas grenar) till ett enhetligt sammanhĂ€ngande filsystem.
InnehÄllet i kataloger med samma sökvÀgar kommer att visas tillsammans i en gemensam katalog (i ett enhetligt namnrum) i det resulterande filsystemet.
UnionFS sammanfogar lager baserat pÄ följande principer:
- ett av lagren blir ett överliggande lager, det andra och efterföljande blir undre lager;
- för anvÀndaren Àr objekten i lagren tillgÀngliga "uppifrÄn och ner", det vill sÀga om det begÀrda objektet finns i det "övre" lagret returneras det, oavsett om ett objekt med samma namn finns i det "nedre" lagret; annars returneras objektet frÄn "nedre" lagret; om det begÀrda objektet inte finns dÀr eller dÀr, returneras ett felmeddelande "Ingen sÄdan fil eller katalog";
- arbetslagret Àr "övre", det vill sÀga alla anvÀndarens ÄtgÀrder för att Àndra data Äterspeglas endast i det övre lagret, utan att pÄverka innehÄllet i lÀgre lager.
Docker Àr den mest utbredda teknologin för anvÀndning av containrar i applikationsarbetet. Det har blivit standarden inom detta omrÄde, byggt pÄ cgroups och namnrymder som tillhandahÄlls av Linux-kÀrnan.
Docker möjliggör för oss att snabbt distribuera applikationer och optimalt utnyttja filsystemet genom att dela OS-kÀrnan mellan alla containrar, vilket fungerar som separata OS-processer.
KĂ€lla: habr.com
