Forstå forskjellene mellom Docker og virtuelle maskiner

Nodejs

Introduksjon til Docker og virtuelle maskiner

Docker og virtuelle maskiner (VM-er) er begge populære verktøy for å distribuere applikasjoner, men de fungerer på fundamentalt forskjellige måter. Mange utviklere finner seg forvirret over hvordan Docker kan tilby et komplett filsystem, isolert nettverk og andre funksjoner uten overhead som vanligvis er forbundet med VM-er.

Denne artikkelen tar sikte på å klargjøre forskjellene mellom Docker og tradisjonelle virtuelle maskiner, og forklarer hvorfor Docker ofte anses som lettere og lettere for å distribuere programvare. Vi vil fordype oss i de underliggende teknologiene og de praktiske fordelene ved å bruke Docker i produksjonsmiljøer.

Kommando Beskrivelse
FROM Spesifiserer basisbildet som skal brukes for å lage en Docker-beholder.
WORKDIR Setter arbeidskatalogen inne i Docker-beholderen.
COPY Kopierer filer eller kataloger fra vertsmaskinen til Docker-beholderen.
RUN Utfører en kommando i Docker-beholderen under byggeprosessen.
EXPOSE Informerer Docker om at containeren lytter på de angitte nettverksportene ved kjøring.
CMD Angir kommandoen som skal kjøres i Docker-beholderen når den starter.
config.vm.box Definerer basisboksen som skal brukes for den virtuelle Vagrant-maskinen.
config.vm.network Konfigurerer nettverksinnstillinger, for eksempel videresending av porter fra verten til VM.
config.vm.provision Angir hvordan den virtuelle maskinen skal klargjøres, for eksempel å kjøre shell-skript under oppsett.

Utforsker Dockerfile og Vagrantfile

I de medfølgende eksemplene demonstrerte vi først hvordan du oppretter en Dockerfile for å distribuere en Node.js-applikasjon. Dockerfilen begynner med å spesifisere basisbildet med kommando, i dette tilfellet, ved å bruke en offisiell Node.js kjøretid. Innstilling av arbeidskatalogen inne i beholderen oppnås med kommando, som sikrer at påfølgende kommandoer blir utført i den angitte katalogen. De kommandoen brukes til å overføre package.json-filene og applikasjonskoden til beholderen. De RUN kommandoen installerer deretter de nødvendige avhengighetene inne i beholderen. Vi avslører porten applikasjonen kjører på ved å bruke kommandoen, og til slutt kommandoen definerer kommandoen for å kjøre applikasjonen når beholderen starter.

For Vagrantfile-eksemplet starter konfigurasjonen ved å spesifisere basisboksen med kommando, her bruker Ubuntu 20.04. Nettverksinnstillinger konfigureres ved hjelp av kommando, som videresender port 8080 på verten til port 80 på gjeste-VM, som tillater ekstern tilgang til tjenester som kjører på VM. De kommandoen brukes til å kjøre et shell-skript som oppdaterer pakkelisten og installerer Apache2, og forsyner VM med nødvendig programvare. Disse kommandoene viser de grunnleggende trinnene for å sette opp et VM-miljø, og tilbyr en mer tradisjonell tilnærming sammenlignet med det containeriserte miljøet levert av Docker.

Opprette en Dockerfile for Node.js Application Deployment

Dette eksemplet viser hvordan du oppretter en Dockerfile for en Node.js-applikasjon, og viser fremgangsmåten for å bygge og kjøre appen i en Docker-beholder.

# Use an official Node.js runtime as a parent image
FROM node:14

# Set the working directory inside the container
WORKDIR /usr/src/app

# Copy package.json and package-lock.json to the container
COPY package*.json ./

# Install the application dependencies inside the container
RUN npm install

# Copy the rest of the application code to the container
COPY . .

# Expose the port the app runs on
EXPOSE 8080

# Define the command to run the app
CMD ["node", "app.js"]

Sette opp en virtuell maskin ved hjelp av Vagrant

Dette eksemplet viser hvordan du setter opp en virtuell maskin ved hjelp av Vagrant med en enkel Vagrantfil, og demonstrerer prosessen med å definere og konfigurere et VM-miljø.

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # Use Ubuntu 20.04 as the base box
  config.vm.box = "ubuntu/focal64"

  # Forward port 8080 on the host to port 80 on the guest
  config.vm.network "forwarded_port", guest: 80, host: 8080

  # Provision the VM with a shell script
  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y apache2
  SHELL
end

Forstå Docker og virtuelle maskiner

En av de viktigste forskjellene mellom Docker og virtuelle maskiner (VM-er) ligger i hvordan de bruker systemressurser. VM-er kjører på en hypervisor, som emulerer maskinvare og lar flere operativsystemer kjøre samtidig på en vertsmaskin. Dette krever at hver VM inkluderer et komplett gjesteoperativsystem, sitt eget sett med biblioteker og binærfiler. Dette bruker ikke bare betydelige systemressurser, men øker også den totale størrelsen og kompleksiteten til distribusjon og vedlikehold.

I kontrast utnytter Docker containeriseringsteknologi, som lar flere containere dele den samme operativsystemkjernen. Hver beholder kjører som en isolert prosess i brukerområdet. Dette betyr at containere er mye lettere og raskere å starte opp sammenlignet med VM-er, da de ikke trenger å starte opp et helt OS. Docker oppnår filsystemisolasjon gjennom et lagdelt filsystem, der hver container har sitt eget filsystemlag på toppen av et basisbilde. Nettverksisolering håndteres ved hjelp av navneområder, noe som gjør at Docker kan tilby isolerte nettverksmiljøer for hver container uten overhead knyttet til virtuelle datamaskiner.

  1. Hva er den primære forskjellen mellom Docker og VM-er?
  2. Docker bruker containerisering for å dele verts-OS-kjernen, noe som gjør den lettere og raskere, mens VM-er krever et fullstendig gjeste-OS og en hypervisor.
  3. Hvorfor anses Docker-containere som mer effektive?
  4. Beholdere deler verts-OS-kjernen og har minimal overhead, noe som gir raskere oppstartstider og effektiv ressursutnyttelse.
  5. Hvordan oppnår Docker filsystemisolasjon?
  6. Docker bruker et lagdelt filsystem, der hver container har sitt eget filsystemlag på toppen av et basisbilde.
  7. Hva er en hypervisor i sammenheng med virtuelle datamaskiner?
  8. En hypervisor er programvare som emulerer maskinvare, slik at flere operativsystemer kan kjøres samtidig på en enkelt vertsmaskin.
  9. Hvordan håndterer Docker nettverksisolasjon?
  10. Docker bruker navnerom for å gi isolerte nettverksmiljøer for hver container.
  11. Hvorfor er det enklere å distribuere programvare til et Docker-bilde enn en VM?
  12. Docker-bilder innkapsler alle avhengigheter og konfigurasjoner, og sikrer konsistens på tvers av forskjellige miljøer.
  13. Hva er noen vanlige brukstilfeller for Docker?
  14. Docker brukes ofte for mikrotjenester-arkitektur, kontinuerlig integrasjon/kontinuerlig distribusjon (CI/CD) og isolerte utviklingsmiljøer.
  15. Kan Docker-containere kjøre på et hvilket som helst operativsystem?
  16. Docker-beholdere kan kjøre på alle operativsystemer som støtter Docker, men de deler verts-OS-kjernen.
  17. Hva er et basisbilde i Docker?
  18. Et basisbilde er utgangspunktet for å bygge Docker-beholdere, ofte inkludert OS og grunnleggende avhengigheter.

Oppsummering av Docker vs. virtuelle maskiner

Ved å sammenligne Docker og virtuelle maskiner ligger den primære forskjellen i ressursutnyttelsen og distribusjonseffektiviteten. Virtuelle maskiner opererer med fullt gjesteoperativsystem og hypervisor, noe som fører til høyere ressursforbruk. Motsatt deler Docker-beholdere verts-OS-kjernen, noe som resulterer i en mer lett og smidig løsning. Docker oppnår isolerte miljøer gjennom et lagdelt filsystem og nettverksnavneområder, slik at den kan tilby lignende funksjoner som VM-er uten tilhørende overhead. Dette gjør distribusjon av programvare til Docker-bilder mer effektiv, konsistent og enklere å administrere i ulike produksjonsmiljøer.

Som konklusjon gir Dockers bruk av containerisering en betydelig fordel i forhold til tradisjonelle virtuelle maskiner ved å minimere ressursbruk og forenkle distribusjonsprosesser. Ved å dele verts-OS-kjernen og bruke isolerte filsystemer og nettverk, gir Docker en robust, men likevel lett løsning for moderne applikasjonsdistribusjon. Å forstå disse forskjellene kan hjelpe utviklere å velge riktig verktøy for deres behov, og sikre effektiv og skalerbar applikasjonsadministrasjon.