VM eller Docker?

Hvordan vet du om du trenger Docker og ikke en VM? Du må bestemme nøyaktig hva du vil isolere. Hvis du ønsker å isolere et system med garantert dedikerte ressurser og virtuell maskinvare, bør valget være en VM. Hvis du trenger å isolere kjørende applikasjoner som separate systemprosesser, trenger du Docker.

Så hva er forskjellen mellom Docker-containere og VM-er?

Virtuell maskin (VM) er en virtuell datamaskin med alle virtuelle enheter og en virtuell harddisk der et nytt uavhengig OS er installert sammen med virtuelle enhetsdrivere, minneadministrasjon og andre komponenter. Det vil si at vi får en abstraksjon av fysisk maskinvare som gjør at vi kan kjøre mange virtuelle datamaskiner på én datamaskin.
En installert VM kan ta opp plass på datamaskinens disk på forskjellige måter:

  • fast harddiskplass, som gir raskere tilgang til den virtuelle harddisken og unngår filfragmentering;
  • dynamisk minnetildeling. Når du installerer tilleggsapplikasjoner, vil minnet tildeles dynamisk for dem til det når det maksimale beløpet som er tildelt det.

Jo flere virtuelle maskiner per server, jo mer plass tar de opp, og krever også konstant støtte for miljøet som kreves for at applikasjonen din skal kjøre.

Docker er programvare for å lage containerbaserte applikasjoner. Beholdere og virtuelle maskiner har lignende fordeler, men fungerer annerledes. Containere tar mindre plass fordi... gjenbruk flere delte ressurser til vertssystemet enn VM, fordi i motsetning til VM, gir den virtualisering på OS-nivå, ikke på maskinvarenivå. Denne tilnærmingen resulterer i lavere minneavtrykk, raskere distribusjon og enklere skalering.

Beholderen gir en mer effektiv mekanisme for innkapsling av applikasjoner ved å tilveiebringe de nødvendige grensesnittene til vertssystemet. Denne funksjonen lar containere dele kjernen av systemet, med hver container som kjører som en separat verts-OS-prosess som har sitt eget sett med minneområder (sin egen virtuelle adresseplass). Siden hver beholders virtuelle adresserom er sitt eget, kan ikke data som tilhører forskjellige minneområder endres.
Det opprinnelige operativsystemet for Docker er Linux (Docker kan også brukes på Windows og MacOS), det bruker hovedfordelene, som lar det organisere kjerneseparasjonen. Å kjøre Docker-beholdere på Windows vil foregå inne i en virtuell maskin som kjører Linux OS, fordi containere deler operativsystemet til vertssystemet og hovedoperativsystemet for dem er Linux.

Container - hvordan fungerer det?

container er en abstraksjon på applikasjonsnivå som kombinerer kode og avhengigheter. Beholdere lages alltid fra bilder, legger til et skrivbart topplag og initialiserer ulike parametere. Fordi en beholder har sitt eget skrivelag og alle endringer lagres i det laget, kan flere beholdere dele tilgang til det samme hovedbildet.

Hver container kan konfigureres gjennom en fil i docker-compose-prosjektet inkludert i hovedløsningen - docker-compose.yml. Der kan du sette ulike parametere som containernavn, porter, identifikatorer, ressursgrenser, avhengigheter mellom andre containere. Hvis du ikke spesifiserer et beholdernavn i innstillingene, vil Docker opprette en ny beholder hver gang, og gi den et tilfeldig navn.

Når en beholder startes fra et bilde, monterer Docker et lese-skrive-filsystem på toppen av alle lagene under. Det er her alle prosessene vi vil at vår Docker-beholder skal kjøre, kjøres.

Når Docker først starter en beholder, er det første lese-skrive-laget tomt. Når endringer skjer, blir de påført dette laget; for eksempel, hvis du vil endre en fil, vil den filen bli kopiert fra skrivebeskyttet laget under til lese-skrive-laget.
Den skrivebeskyttede versjonen av filen vil fortsatt eksistere, men den er nå skjult under kopien. Volumer brukes til å lagre data, uavhengig av beholderens livssyklus. Volumer initialiseres når beholderen opprettes.

Hvordan er bildet relatert til beholderen?

bilde — hovedelementet for hver beholder. Bildet er opprettet fra en Dockerfile lagt til prosjektet og er et sett med filsystemer (lag) lagt oppå hverandre og gruppert sammen, skrivebeskyttet; maksimalt antall lag er 127.

I hjertet av hvert bilde er et basisbilde, som spesifiseres av FROM-kommandoen - inngangspunktet når du bygger Dockerfile-bildet. Hvert lag er et skrivebeskyttet lag og er representert av en enkelt kommando som endrer filsystemet, skrevet i en Dockerfile.
For å kombinere disse lagene til ett enkelt bilde, bruker Docker det avanserte flerlags Union-filsystemet (AuFS er bygget på toppen av UnionFS), slik at forskjellige filer og kataloger fra forskjellige fillag kan legges transparent over, og skaper et sammenhengende filsystem.

Lag inneholder metadata som lar deg lagre relatert informasjon om hvert lag under kjøretid og byggetid. Hvert lag inneholder en kobling til neste lag; hvis et lag ikke har en kobling, er det det øverste laget i bildet.

Dockerfilen kan inneholde kommandoer som:

  • FROM — inngangspunkt når du danner et bilde;
  • MAINTAINER - navn på bildeeieren;
  • RUN — kommandoutførelse under bildemontering;
  • ADD - kopiering av vertsfilen til et nytt bilde; hvis du spesifiserer URL-en til filen, vil Docker laste den ned til den angitte katalogen;
  • ENV - miljøvariabler;
  • CMD - starter opprettelsen av en ny beholder basert på bildet;
  • ENTRYPOINT - kommandoen utføres når containeren starter.
  • WORKDIR er arbeidskatalogen for å utføre CMD-kommandoen.
  • BRUKER - setter UID for beholderen som er opprettet basert på bildet.
  • VOLUME - monterer vertskatalogen i beholderen.
  • EXPOSE er et sett med porter som lyttes til i containeren.

Hvordan fungerer UnionFS?

UnionFS - Utility stack filsystem (FS) for Linux og FreeBSD. Denne FS implementerer en kopi-på-skriv-mekanisme (Copy-On-Write, COW). Arbeidsenheten til UnionFS er et lag; hvert lag bør betraktes som et separat fullverdig filsystem med et hierarki av kataloger fra selve roten. UnionFS oppretter en unionsfeste for andre filsystemer og lar filer og kataloger fra forskjellige filsystemer (kalt gafler) kombineres til et enkelt sammenhengende filsystem, transparent for brukeren.

Innholdet i kataloger med de samme banene vil vises sammen i én enhetlig katalog (i et enkelt navneområde) i det resulterende filsystemet.

UnionFS kombinerer lag basert på følgende prinsipper:

  • ett av lagene blir lag på øverste nivå, det andre og påfølgende lag blir lag på lavere nivå;
  • lagobjekter er tilgjengelige for brukeren "fra topp til bunn", dvs. hvis det forespurte objektet er i "øverste" laget, returneres det, uavhengig av tilstedeværelsen av et objekt med samme navn i "nederste" laget; ellers returneres objektet til "bunnlaget"; hvis det forespurte objektet verken er der eller der, returneres feilen "Ingen slik fil eller katalog";
  • Arbeidslaget er det "øverste", det vil si at alle brukerhandlinger for å endre data reflekteres bare på toppnivålaget, uten å påvirke innholdet i lagene på lavere nivåer.

Docker er den vanligste teknologien for å bruke containere til å kjøre applikasjoner. Det har blitt standarden på feltet, og bygger på cgroups og navneområder levert av Linux-kjernen.

Docker lar oss raskt distribuere applikasjoner og utnytte filsystemet på best mulig måte ved å dele OS-kjernen mellom alle containere, kjører som separate OS-prosesser.

Kilde: www.habr.com

Legg til en kommentar