VM eller Docker?

Hvordan forstår man, at du har brug for Docker og ikke en VM? Du skal bestemme, hvad du præcist vil isolere. Hvis du ønsker at isolere et system med garanterede ressourcer og virtuel hardware, bør valget falde på VM'en. Hvis du har brug for at isolere kørende applikationer som separate systemprocesser, skal du bruge Docker.

Så hvad er forskellen mellem Docker-containere og VM'er?

Virtuel maskine (VM) er en virtuel computer med alle virtuelle enheder og en virtuel harddisk, hvorpå et nyt uafhængigt OS er installeret sammen med virtuelle enhedsdrivere, hukommelsesstyring og andre komponenter. Det vil sige, at vi får en abstraktion af fysisk hardware, der giver dig mulighed for at køre mange virtuelle computere på én computer.
En installeret VM kan optage diskplads på forskellige måder:

  • fast harddiskplads, som giver hurtigere adgang til den virtuelle harddisk og undgår filfragmentering;
  • dynamisk hukommelsesallokering. Når du installerer yderligere applikationer, vil hukommelsen blive dynamisk allokeret til dem, indtil den når den maksimale mængde, der er allokeret til den.

Jo flere virtuelle maskiner på serveren, jo mere plads fylder de, og de kræver også den konstante support fra det miljø, der kræves for at din applikation kan fungere.

Docker er en software til at bygge applikationer baseret på containere. Containere og virtuelle maskiner har lignende fordele, men fungerer anderledes. Containere fylder mindre, pga overbruge flere delte ressourcer af værtssystemet end VM'en, fordi i modsætning til VM, giver virtualisering på OS-niveau, ikke hardware. Denne tilgang giver mindre hukommelsesfodaftryk, hurtigere implementering og lettere skalering.

Beholderen tilvejebringer en mere effektiv mekanisme til at indkapsle applikationer ved at tilvejebringe de nødvendige grænseflader til værtssystemet. Denne funktion gør det muligt for containere at dele kernen af ​​systemet, hvor hver af containerne kører som en separat proces af det primære OS, som har sit eget sæt hukommelsesområder (dets eget virtuelle adresserum). Da hver containers virtuelle adresserum er sit eget, kan data, der tilhører forskellige hukommelsesområder, ikke ændres.
Det oprindelige OS for Docker er Linux (Docker kan også bruges på Windows og MacOS), det bruger sine vigtigste fordele, som gør det muligt at organisere en delt kerne. Lanceringen af ​​Docker-containere på Windows vil finde sted inde i en virtuel Linux-maskine. containere deler OS af værtssystemet, og det vigtigste OS for dem er Linux.

Container - hvordan fungerer det?

container er en abstraktion på applikationsniveau, der kombinerer kode og afhængigheder. Containere oprettes altid ud fra billeder, tilføjer et skrivbart toplag og initialiserer forskellige parametre. Fordi en container har sit eget skrivelag, og alle ændringer er gemt i dette lag, kan flere containere dele adgang til det samme masterbillede.

Hver container kan konfigureres gennem en fil i docker-compose-projektet inkluderet i hovedløsningen, docker-compose.yml. Der kan du indstille forskellige parametre såsom containernavn, porte, identifikatorer, ressourcegrænser, afhængigheder mellem andre containere. Hvis du ikke angiver et containernavn i indstillingerne, vil Docker oprette en ny container hver gang og tildele den et navn tilfældigt.

Når en container startes fra et billede, monterer Docker læse/skrive-filsystemet oven på ethvert lag nedenfor. Det er her, alle de processer, vi ønsker, at vores Docker-container skal køre, kører.

Når Docker først starter en container, er det indledende læse/skrive lag tomt. Når der sker ændringer, påføres de på det pågældende lag; for eksempel, hvis du ønsker at ændre en fil, kopieres den fil fra skrivebeskyttet lag nedenfor til læse-skrive-laget.
Den skrivebeskyttede version af filen vil stadig eksistere, men er nu skjult under kopien. Mængder bruges til at lagre data, uanset containerens livscyklus. Volumen initialiseres, når en container oprettes.

Hvordan er billedet forbundet med beholderen?

billede - hovedelementet for hver container. Billedet er oprettet ud fra en Dockerfile tilføjet til projektet og er et sæt filsystemer (lag), der er lagt oven på hinanden og grupperet sammen, kun tilgængelig til læsning; det maksimale antal lag er 127.

I hjertet af hvert billede er et basisbillede, som er specificeret af FROM-kommandoen - indgangspunktet ved generering af et Dockerfile-billede. Hvert lag er et skrivebeskyttet lag og er repræsenteret af en enkelt kommando, der ændrer filsystemet, skrevet i en Dockerfile.
For at kombinere disse lag til et enkelt billede, bruger Docker det avancerede flerlags Union-filsystem (AuFS er bygget oven på UnionFS), hvilket tillader forskellige filer og mapper fra forskellige fillag at overlappe transparent, hvilket skaber et tilknyttet filsystem.

Lag indeholder metadata, der giver dig mulighed for at gemme relaterede oplysninger om hvert lag ved kørsel og byggetid. Hvert lag indeholder et link til det næste lag, hvis laget ikke har noget link, så er dette det øverste lag i billedet.

Dockerfile kan indeholde kommandoer som:

  • FROM - indgangspunkt i dannelsen af ​​billedet;
  • MAINTAINER - navnet på ejeren af ​​billedet;
  • RUN - kommandoudførelse under billedsamling;
  • ADD - kopiering af værtsfilen til et nyt billede, hvis du angiver en URL-fil, vil Docker downloade den til den angivne mappe;
  • ENV - miljøvariabler;
  • CMD - starter oprettelsen af ​​en ny container baseret på billedet;
  • ENTRYPOINT - Kommandoen udføres, når containeren startes.
  • WORKDIR er arbejdsbiblioteket til at udføre CMD-kommandoen.
  • BRUGER - Indstiller UID'et for den container, der er oprettet fra billedet.
  • VOLUME - Monterer værtsbiblioteket til containeren.
  • EXPOSE er et sæt porte, der lyttes til i containeren.

Hvordan fungerer UnionFS?

UnionFS — servicestack-filsystem (FS) til Linux og FreeBSD. Denne FS implementerer kopi-på-skriv-mekanismen (Copy-On-Write, COW). Arbejdsenheden i UnionFS er et lag, hvert lag skal betragtes som et separat fuldgyldigt filsystem med et mappehierarki fra selve roden. UnionFS opretter en unionsmontering for andre filsystemer og giver dig mulighed for transparent at flette filer og mapper fra forskellige filsystemer (kaldet branches) til et enkelt linket filsystem, transparent for brugeren.

Indholdet af mapper med de samme stier vil blive vist sammen i én kombineret mappe (i samme navneområde) i det resulterende filsystem.

UnionFS kombinerer lag baseret på følgende principper:

  • et af lagene bliver et lag på øverste niveau, det andet og efterfølgende lag bliver lag på lavere niveau;
  • lagobjekter er tilgængelige for brugeren "fra top til bund", dvs. hvis det anmodede objekt er i det "øverste" lag, returneres det, uanset tilstedeværelsen af ​​et objekt med samme navn i det "nederste" lag; ellers returneres objektet "nederste" lag; hvis det anmodede objekt hverken er der eller der, returneres fejlen "Ingen sådan fil eller mappe";
  • arbejdslaget er det "øverste", det vil sige, at alle brugerhandlinger for at ændre data afspejles kun på det øverste niveau uden at påvirke indholdet af lag på lavere niveau.

Docker er den mest almindelige teknologi til brug af containere i applikationsarbejde. Det er blevet standarden på dette område og bygger på de cgroups og navneområder, der leveres af Linux-kernen.

Docker giver os mulighed for hurtigt at implementere applikationer og udnytte filsystemet bedst muligt ved at dele OS-kernen mellem alle containere, der kører som separate OS-processer.

Kilde: www.habr.com

Tilføj en kommentar