Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

10 augusti lanserades i Slörm en videokurs om Docker, dĂ€r vi gĂ„r igenom det i detalj – frĂ„n grundlĂ€ggande abstraktioner till nĂ€tverksinstĂ€llningar.

I den hÀr artikeln kommer vi att diskutera historien bakom Docker och dess grundlÀggande abstraktioner: Image, Cli, Dockerfile. FörelÀsningen riktar sig till nybörjare, sÄ den kommer knappast att intressera erfarna anvÀndare. Det kommer inte att förekomma blod, blindtarmsoperationer och djupdykningar. Bara grunderna.

Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

Vad Àr Docker

LÄt oss titta pÄ definitionen av Docker frÄn Wikipedia.

Docker Àr en mjukvara för automatisering av distribution och hantering av applikationer i miljöer med stöd för containrar.

Av denna definition framgÄr ingenting klart. Speciellt oklart Àr vad som menas med "i miljöer med stöd för containrar". För att förstÄ detta, lÄt oss gÄ tillbaka i tiden. LÄt oss börja frÄn en tid som jag kollektivt kallar "Den monolitiska eran".

Den monolitiska eran

Den monolitiska eran Àr början av 2000-talet, nÀr alla applikationer var monolitiska med massor av beroenden. Utvecklingen tog lÄng tid. Samtidigt fanns det inte sÄ mÄnga servrar, vi kÀnde dem alla vid namn och övervakade dem. Det finns en rolig jÀmförelse:

Spela video

Pets – det Ă€r husdjur. Under den monolitiska eran behandlade vi vĂ„ra servrar som husdjur, vi tog hand om dem, och violen gĂ€rna fjĂ€drade bort damm. För att bĂ€ttre hantera resurser anvĂ€nde vi virtualisering: vi tog en server och delade den pĂ„ flera virtuella maskiner, vilket dĂ€rmed sĂ€krade miljöisolering.

Virtualiseringssystem baserade pÄ hypervisorer

Om virtualiseringssystem har sĂ€kert de flesta hört talas om: VMware, VirtualBox, Hyper-V, Qemu KVM etc. De tillhandahĂ„ller applikationsisolering och resurshantering, men de har ocksĂ„ nackdelar. För att göra virtualisering behövs en hypervisor. Och hypervisorn innebĂ€r resurskostnader. Dessutom Ă€r sjĂ€lva den virtuella maskinen vanligtvis en stor apparat – en tung bild, med operativsystem, Nginx, Apache och eventuellt MySQL. Bilden Ă€r stor och det Ă€r besvĂ€rligt att arbeta med en virtuell maskin. Som en följd blir arbetet med virtuella maskiner lĂ„ngsamt. För att lösa detta problem skapades virtualiseringssystem pĂ„ kĂ€rnnivĂ„.

Virtualiseringssystem pÄ kÀrnnivÄ

Virtualisering pÄ kÀrnnivÄ stöds av system som OpenVZ, Systemd-nspawn, LXC. Ett tydligt exempel pÄ sÄdan virtualisering Àr LXC (Linux Containers).

LXC — en virtualiseringssystem pĂ„ operativsystemets nivĂ„ för att köra flera isolerade instanser av operativsystemet Linux pĂ„ en och samma nod. LXC anvĂ€nder inte virtuella maskiner, utan skapar en virtuell miljö med eget processutrymme och nĂ€tverksstack.

I grund och botten skapar LXC containrar. Vad Àr skillnaden mellan virtuella maskiner och containrar?

Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

Containern passar inte för att isolera processer: i virtualiseringssystem pÄ kÀrnnivÄ finns sÄrbarheter som gör att man kan ta sig ut ur containern till vÀrden. SÄ om du behöver isolera nÄgot, Àr det bÀttre att anvÀnda en virtuell maskin.

Skillnaderna mellan virtualisering och containerisering kan ses i diagrammet.
Det finns hÄrdvaruhypervisorer, hypervisorer ovanpÄ operativsystem och containrar.

Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

"HÄrdhypervisorer" Àr en fantastisk sak om du verkligen vill isolera nÄgot. För dÀr finns möjligheten att isolera pÄ minnesordsnivÄ och processorer.

Det finns hypervisorer som programvara och det finns containrar, och det Àr dem vi kommer att prata mer om. I containeriseringssystemet finns det ingen hypervisor, men det finns en Container Engine som skapar och hanterar containrar. Det Àr en lÀttviktslösning, sÄ genom att arbeta med kÀrnan Àr overheaden mindre, eller inte alls.

Vad som anvÀnds för containerisering pÄ kÀrnnivÄ

De viktigaste teknologierna som gör det möjligt att skapa en isolerad container frÄn andra processer Àr Namespaces och Control Groups.

Namespaces: PID, NÀtverk, Montering och AnvÀndare. Det finns fler, men för enkelhetens skull fokuserar vi pÄ dessa.

PID Namespace begrÀnsar processerna. NÀr vi till exempel skapar en PID Namespace och placerar en process dÀr, fÄr den PID 1. Vanligtvis Àr PID 1 i systemen antingen systemd eller init. DÀrför, nÀr vi placerar en process i en ny namespace, fÄr den ocksÄ PID 1.

Networking Namespace möjliggör att begrĂ€nsa/isolera nĂ€tverket och placera sina egna grĂ€nssnitt dĂ€r inne. Montering Ă€r begrĂ€nsning pĂ„ filsystemet. AnvĂ€ndare — begrĂ€nsning pĂ„ anvĂ€ndarna.

Control Groups: Minne, CPU, IOPS, NĂ€tverk — det finns totalt omkring 12 instĂ€llningar. De kallas ocksĂ„ Cgroups ("C-grupper").

Control Groups hanterar resurser för containern. Genom Control Groups kan vi ange att containern inte fÄr anvÀnda mer Àn en viss mÀngd resurser.

För att containerisering ska fungera fullt ut anvÀnds ytterligare teknologier: Capabilities, Copy-on-write och andra.

Capabilities Àr nÀr vi sÀger till processen vad den kan göra och vad den inte kan. PÄ kÀrnnivÄ Àr det helt enkelt bitmasker med mÄnga parametrar. Till exempel har anvÀndaren root full behörighet och kan göra allt. Tidsservern kan Àndra systemtiden: den har capabilities för Time Capsule, och sÄ Àr det. Genom privilegier kan vi flexibelt stÀlla in begrÀnsningar för processerna och pÄ sÄ sÀtt skydda oss sjÀlva.

Systemet Copy-on-write gör att vi kan arbeta med Docker-avbilder och anvÀnda dem mer effektivt.

För nÀrvarande har Docker problem med kompatibilitet med Cgroups v2, sÄ artikeln fokuserar pÄ just Cgroups v1.

Men lÄt oss ÄtergÄ till historien.

NĂ€r virtualiseringssystem pĂ„ kĂ€rnnivĂ„ kom ut, började de tillĂ€mpas aktivt. Överhuvudtaget försvann overheaden pĂ„ hypervisorn, men vissa problem kvarstod:

  • stora avbilder: i samma OpenVZ trycker man in operativsystemet, bibliotek, en massa olika mjukvaror, och i slutĂ€ndan blir avbilden Ă€ndĂ„ ganska stor;
  • det finns ingen ordentlig standard för paketering och distribution, sĂ„ problemet med beroenden kvarstĂ„r. Det kan uppstĂ„ situationer dĂ€r tvĂ„ kodstycken anvĂ€nder ett bibliotek, men med olika versioner. Det kan uppstĂ„ konflikter mellan dem.

För att lösa alla dessa problem kom nÀsta era.

Era av containrar

NÀr Era av containrar intrÀffade, förÀndrades filosofin för hur man arbetar med dem:

  • En process — en container.
  • Alla nödvĂ€ndiga beroenden för processen levereras i dess container. Detta krĂ€ver att man delar upp monoliter i mikrotjĂ€nster.
  • Ju mindre avbild, desto bĂ€ttre — fĂ€rre potentiella sĂ„rbarheter, snabbare distribution och sĂ„ vidare.
  • Instanser blir efemĂ€ra.

Kommer ni ihĂ„g att jag pratade om pets vs cattle? Förr var instanser som husdjur, nu har de blivit som cattle — boskap. Tidigare fanns det en monolit — en applikation. Nu finns det 100 mikrotjĂ€nster, 100 containrar. NĂ„gra containrar kan ha 2-3 repliker. Det blir inte sĂ„ viktigt att kontrollera varje container. Det viktigare Ă€r tillgĂ€ngligheten av sjĂ€lva tjĂ€nsten: vad denna uppsĂ€ttning containrar gör. Detta förĂ€ndrar tillvĂ€gagĂ„ngssĂ€tten för övervakning.

Åren 2014-2015 intrĂ€ffade blomstringen av Docker — den teknologi vi kommer att prata om nu.

Docker har förÀndrat filosofin och standardiserat paketeringen av applikationer. Med Docker kan vi paketera en applikation, skicka den till ett repot, ladda ner den dÀrifrÄn och distribuera den.

I Docker-containern lÀgger vi allt som behövs, vilket löser problemet med beroenden. Docker garanterar reproducerbarhet. Jag tror att mÄnga har stött pÄ problem med reproducerbarhet: allt fungerar för dig, men nÀr du pushar till produktion slutar det fungera. Med Docker försvinner det problemet. Om din Docker-container startar och gör vad den ska, Àr chansen stor att den kommer att starta i produktion och göra samma sak dÀr.

En avvikelse om overhead

Det pÄgÄr stÀndiga diskussioner om overhead. Vissa hÀvdar att Docker inte medför nÄgon extra belastning, eftersom det anvÀnder Linux-kÀrnan och alla dess processer som behövs för containerisering. De sÀger att "om du pÄstÄr att Docker Àr overhead, dÄ Àr Àven Linux-kÀrnan overhead".

Å andra sidan, om vi dyker djupare, sĂ„ finns det faktiskt flera saker i Docker som, med viss inskrĂ€nkning, kan sĂ€gas vara overhead.

För det första – PID-namnomrĂ„det. NĂ€r vi placerar en process i ett namnrum tilldelas den PID 1. Samtidigt har denna process en annan PID som finns i vĂ€rdnamnomrĂ„det, utanför containern. Till exempel, vi startade Nginx i containern, och det blev PID 1 (masterprocessen). Men pĂ„ vĂ€rden har den PID 12623. Och det Ă€r svĂ„rt att sĂ€ga hur mycket overhead det hĂ€r medför.

Den andra saken – Cgroups. LĂ„t oss ta Cgroups för minne, det vill sĂ€ga möjligheten att begrĂ€nsa minnet för en container. NĂ€r det aktiveras aktiveras rĂ€kneverken, minnes redovisning: kĂ€rnan mĂ„ste förstĂ„ hur mĂ„nga sidor som har tilldelats och hur mĂ„nga som fortfarande Ă€r tillgĂ€ngliga för denna container. Det kan vara overhead, men jag har inte sett nĂ„gra exakta studier av hur det pĂ„verkar prestandan. Och jag har inte mĂ€rkt att en applikation som körs i Docker plötsligt tappar i prestanda.

Och en annan kommentar om prestanda. Vissa kÀrnparametrar förs över frÄn vÀrden till containern. I synnerhet vissa nÀtverksparametrar. SÄ om du vill köra nÄgot högpresterande i Docker, till exempel nÄgot som aktivt kommer att anvÀnda nÀtverket, sÄ behöver du Ätminstone justera dessa parametrar. NÄgon slags nf_conntrack, till exempel.

Om konceptet Docker

Docker bestÄr av flera komponenter:

  1. Docker Daemon – det Ă€r just Container Engine; det startar containrar.
  2. Docker CII – ett verktyg för att hantera Docker.
  3. Dockerfile – en instruktion för hur man bygger en image.
  4. Image – en bild som containern rullas ut ifrĂ„n.
  5. Container.
  6. Docker registry – en lagringsplats för images.

Schemat ser ungefÀr ut sÄ hÀr:

Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

PÄ Docker_host kör Docker daemon, som startar containrar. Det finns en klient som skickar kommandon: bygg en image, ladda ner en image, kör en container. Docker daemon gÄr till registry och utför dem. Docker-klienten kan nÄ ut lokalt (till unix-socketen) eller via TCP frÄn en fjÀrrvÀrd.

LÄt oss gÄ igenom varje komponent.

Docker daemon (demon) – Ă€r den serverbaserade delen, den körs pĂ„ vĂ€rdmaskinen: laddar ner images och startar containrar frĂ„n dem, skapar nĂ€tverk mellan containrar, samlar loggar. NĂ€r vi sĂ€ger 'skapa en image', sĂ„ utför Ă€ven demon det.

Docker CLI – den kundbaserade delen av Docker, ett kommandoradsverktyg för att arbeta med demon. Jag upprepar, den kan fungera inte bara lokalt utan Ă€ven över nĂ€tverket.

GrundlÀggande kommandon:

docker ps – visa de containrar som för nĂ€rvarande Ă€r körda pĂ„ Docker-vĂ€rden.
docker images – visa images som har laddats ner lokalt.
docker search – sök efter en image i registry.
docker pull – ladda ner en image frĂ„n registry till maskinen.
docker build <> – bygg en image.
docker run – kör containern.
docker rm – ta bort containern.
docker logs – loggar för containern
docker start/stop/restart – hantera containern

Om du behÀrskar dessa kommandon och anvÀnder dem bekvÀmt, kan du anse att du har bemÀstrat Docker pÄ anvÀndarnivÄ till 70%.

Dockerfile – instruktion för att skapa en image. NĂ€stan varje kommando i instruktionen Ă€r ett nytt lager. LĂ„t oss titta pĂ„ ett exempel.

Vad Àr Docker: en kort översikt över historien och grundlÀggande abstraktioner

UngefÀr sÄ hÀr ser en Dockerfile ut: kommandon till vÀnster, argument till höger. Varje kommando som finns hÀr (och skrivs i Dockerfile) skapar ett nytt lager i Image.

Även om man tittar pĂ„ vĂ€nster del, kan man förstĂ„ ungefĂ€r vad som pĂ„gĂ„r. Vi sĂ€ger: 'skapa en mapp Ă„t oss' – det Ă€r ett lager. 'Gör mappen till arbetsmapp' – det Ă€r ytterligare ett lager, och sĂ„ vidare. Lagerkakan förenklar livet. Om jag skapar ytterligare en Dockerfile och Ă€ndrar nĂ„got i den sista raden – om jag kör "python" "main.py" eller installerar beroenden frĂ„n en annan fil – kommer de tidigare lagren att Ă„tersanvĂ€ndas som cache.

Image — det hĂ€r Ă€r en containeravbildning, frĂ„n vilken containrar startas. Om vi ser pĂ„ Docker ur ett pakethanterarperspektiv (som om vi arbetar med deb- eller rpm-paket), sĂ„ Ă€r en bild i grund och botten ett rpm-paket. Genom yum install kan vi installera en applikation, ta bort den, hitta den i arkivet och ladda ner den. HĂ€r Ă€r det ungefĂ€r detsamma: containrar startas frĂ„n bilden, de lagras i Docker-register (pĂ„ samma sĂ€tt som yum, i ett arkiv), och varje bild har en SHA-256-hash, namn och tagg.

Bild byggs enligt instruktionerna i Dockerfile. Varje instruktion i Dockerfile skapar ett nytt lager. Lager kan ÄteranvÀndas.

Docker-register — Ă€r ett register för Docker-bilder. Precis som operativsystem har Docker ett offentligt standardregister — dockerhub. Men det gĂ„r att bygga ett eget register, en egen Docker-register.

Container — Ă€r det som körs frĂ„n en bild. Vi har byggt bilden enligt instruktionerna i Dockerfile, och sedan kör vi den frĂ„n denna bild. Denna container Ă€r isolerad frĂ„n andra containrar och ska innehĂ„lla allt som behövs för att köra applikationen. Samtidigt Ă€r en container — en process. Det kan hĂ€nda att vi mĂ„ste ha tvĂ„ processer, men det strider mot Docker-ideologin.

Kravet "en container — en process" Ă€r relaterat till PID Namespace. NĂ€r en process med PID 1 startas i ett Namespace, om den plötsligt dör, dör hela containern ocksĂ„. Om det dĂ€remot finns tvĂ„ processer som körs: en Ă€r levande och den andra har dött, sĂ„ fortsĂ€tter containern att leva. Men det hĂ€r handlar om Best Practices, och vi kommer att diskutera dem i andra material.

För mer detaljerad information om kursens egenskaper och hela program kan du följa lÀnken: "Videokurs om Docker».

Författare: Marsel Ibraev, certifierad Kubernetes-administratör, verksam ingenjör pĂ„ Southbridge, talare och kursutvecklare för SlĂŒrm.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster