VM eller Docker?

Hvordan kan du forstå, om du har brug for Docker og ikke VM? Du skal bestemme, hvad du præcist ønsker at isolere. Hvis du har brug for at isolere et system med garanterede tildelte ressourcer og virtuel hardware, så skal valget falde på VM. Hvis du derimod har brug for at isolere kørende applikationer som separate processer i systemet, har du brug for Docker.

Hvad er så forskellen mellem Docker-containere og VM?

En virtuel maskine (VM) er en virtuel computer med alle virtuelle enheder og et virtuelt harddisk, hvorpå et nyt, uafhængigt OS installeres sammen med virtuelle enhedsdrivere, hukommelsesadministration og andre komponenter. Det vil sige, at vi får en abstraktion af det fysiske udstyr, der gør det muligt at køre mange virtuelle computere på én computer.
En installeret VM kan optage plads forskelligt på computerens harddisk:

  • fast plads på harddisken, hvilket muliggør hurtigere adgang til den virtuelle harddisk og undgår filfragmentering;
  • dynamisk tildeling af hukommelse. Når der installeres yderligere applikationer, vil hukommelsen blive tildelt dynamisk til dem, indtil den maksimale mængde, der er afsat til den, er opnået.

Jo flere virtual machines på serveren, jo mere plads optager de, og de kræver også konstant vedligeholdelse af det miljø, der kræves for at køre din applikation.

Docker er software til opbygning af applikationer baseret på containere. Containere og virtuelle maskiner har lignende fordele, men fungerer forskelligt. Containere optager mindre plads, da de genbruger flere fælles ressourcer fra værtssystemet end VM, eftersom de i modsætning til VM muliggør virtualisering på OS-niveau og ikke hardware-niveau. Denne tilgang sikrer en mindre hukommelsesforbrug, hurtig implementering og nemmere skalering.

Containeren giver en mere effektiv mekanisme til inkapsling af applikationer og sikrer de nødvendige grænseflader til værtsystemet. Denne funktion gør det muligt for containerne at dele systemkernen, hvor hver af containerne fungerer som en separat proces i den primære OS, som har sit eget sæt af hukommelsesområder (sit eget virtuelle adresserum). Da det virtuelle adresserum for hver container er unikt, kan data, der tilhører forskellige hukommelsesområder, ikke ændres.
Den native OS for Docker er Linux (Docker kan også bruges på Windows og MacOS), og den udnytter dens grundlæggende fordele, der er afgørende for at organisere delingen af kernen. Kørsel af Docker-containere på Windows vil ske inde i en virtuel maskine med Linux OS, da containerne deler værtsystemets OS, og den primære OS for dem er Linux.

Container - hvordan fungerer det?

Container er en abstraktion på applikationsniveau, der sammenbinder kode og afhængigheder. Containere oprettes altid fra billeder, hvor der tilføjes et skrivbart lag ovenpå og initialiseres forskellige parametre. Da containeren har sit eget skrivbare lag, og alle ændringer gemmes i dette lag, kan flere containere samtidig dele adgang til det samme basisbillede.

Hver container kan konfigureres via en fil i projektet docker-compose, der er inkluderet i den primære løsning - docker-compose.yml. Der kan angives forskellige parametre som containerens navn, porte, identifikatorer, ressourcegrænser og afhængigheder mellem andre containere. Hvis der ikke angives et navn på containeren i indstillingerne, vil Docker hver gang oprette en ny container og tilfældigt tildele den et navn.

Når containeren startes fra billedet, monterer Docker filsystemet til læsning og skrivning ovenfor hvilke som helst lag nedenfor. Det er her, alle de processer vil blive udført, som vi ønsker, at vores Docker-container skal køre.

Når Docker først starter containeren, er det indledende lag til læsning og skrivning tomt. Når der foretages ændringer, anvendes de på dette lag; for eksempel, hvis du ønsker at ændre en fil, vil denne fil blive kopieret fra det kun-læsning lag nedenfor til lagene til læsning og skrivning.
Den skrivebeskyttede filversion vil stadig eksistere, men den er nu skjult bag en kopi. For at gemme data uafhængigt af containerens livscyklus bruges volumener. Volumener initialiseres, når containeren oprettes.

Hvordan er et billede relateret til en container?

Billede — den grundlæggende enhed for hver container. Et billede oprettes ud fra en Dockerfile tilføjet til projektet og repræsenterer et sæt filsystemer (lag) stablet oven på hinanden og gruppet sammen, tilgængeligt kun til læsning; det maksimale antal lag er 127.

Bunden af hvert billede er et basisbillede, der angives med kommandoen FROM — indgangspunktet ved opbygningen af Dockerfile-billedet. Hvert lag er et read-only lag og repræsenteres af én kommando, der ændrer filsystemet, der er skrevet i Dockerfile.
For at kombinere disse lag til ét billede bruger Docker Advanced multi layered Union file system (AuFS bygget på UnionFS), hvilket gør det muligt for forskellige filer og mapper fra forskellige fil lag at overlappe transparent og skabe et samlet filsystem.

Lagene indeholder metadata, som gør det muligt at gemme tilknyttede oplysninger om hvert lag under udførelse og opbygning. Hvert lag indeholder et link til det næste lag; hvis et lag ikke har et link, er det det øverste lag i billedet.

Dockerfile kan indeholde sådanne kommandoer som:

  • FROM — indgangspunktet ved opbygningen af billedet;
  • MAINTAINER — navnet på ejer af billedet;
  • RUN — udførsel af kommandoen under opbygningen af billedet;
  • ADD — kopierer en hostfil til det nye billede; hvis URL-filen angives, vil Docker downloade den til den angivne mappe;
  • ENV — miljøvariable;
  • CMD — starter oprettelsen af en ny container baseret på billedet;
  • ENTRYPOINT — kommandoen køres ved containerens opstart.
  • WORKDIR — arbejdsbiblioteket til udførelse af CMD-kommandoen.
  • USER — indstiller UID for den container, der oprettes ud fra billedet.
  • VOLUME — monterer en værtmappe i containeren.
  • EXPOSE — sæt af porte, der lyttes i containeren.

Hvordan fungerer UnionFS?

UnionFS — en service-stakfilssystem (FS) til Linux og FreeBSD. Denne FS implementerer mekanismen for kopi ved skrivning (Copy-On-Write, COW). Arbejdsenheden for UnionFS er lag, hvor hvert lag skal betragtes som et separat, fuldt fungerende filsystem med et hierarki af mapper fra selve roden. UnionFS skaber en samlet montering for andre filsystemer og gør det muligt for brugeren at sammenflette filer og mapper fra forskellige filsystemer (kaldet grene) i et enkelt sammenhængende filsystem.

Indholdet af mapper med de samme stier vises sammen i en samlet mappe (i et enkelt navnerum) i det resulterende filsystem.

UnionFS sammenfletter lagene i henhold til følgende principper:

  • et af lagene bliver det øverste lag, det andet og følgende er de nederste lag;
  • for brugeren er objekterne fra lagene tilgængelige "fra oven og ned", dvs. hvis det ønskede objekt findes i det "øvre" lag, returneres det, uanset om der findes et objekt med dette navn i det "nederste" lag; ellers returneres objektet fra det "nederste" lag; hvis det ønskede objekt ikke findes der eller der, returneres der en fejl "Ingen sådan fil eller mappe";
  • det arbejdende lag er det "øverste", hvilket betyder, at alle brugerhandlinger vedrørende ændring af data kun påvirker det øverste lag, uden at påvirke indholdet af de nederste lag.

Docker er den mest udbredte teknologi til brug af containere i applikationsarbejde. Det er blevet standarden på dette område, bygget på basis af cgroups og navnerum, som sikres af Linux-kernen.

Docker gør det muligt for os hurtigt at implementere applikationer og maksimalt optimere filsystemet ved at dele OS-kernen mellem alle containere, der fungerer som separate OS-processer.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster