Introduktion til Docker og virtuelle maskiner
Docker og virtuelle maskiner (VM'er) er begge populære værktøjer til at implementere applikationer, men de fungerer på fundamentalt forskellige måder. Mange udviklere bliver forvirrede over, hvordan Docker kan levere et komplet filsystem, isoleret netværk og andre funktioner uden de overhead, der typisk er forbundet med VM'er.
Denne artikel har til formål at tydeliggøre forskellene mellem Docker og traditionelle virtuelle maskiner, og forklarer hvorfor Docker ofte anses for at være lettere og lettere at implementere software. Vi vil dykke ned i de underliggende teknologier og de praktiske fordele ved at bruge Docker i produktionsmiljøer.
Kommando | Beskrivelse |
---|---|
FROM | Angiver det basisbillede, der skal bruges til at oprette en Docker-container. |
WORKDIR | Indstiller arbejdsmappen inde i Docker-beholderen. |
COPY | Kopierer filer eller mapper fra værtsmaskinen til Docker-beholderen. |
RUN | Udfører en kommando i Docker-beholderen under byggeprocessen. |
EXPOSE | Informerer Docker om, at containeren lytter på de angivne netværksporte under kørsel. |
CMD | Angiver den kommando, der skal køres i Docker-beholderen, når den starter. |
config.vm.box | Definerer den basisboks, der skal bruges til den virtuelle Vagrant-maskine. |
config.vm.network | Konfigurerer netværksindstillinger, såsom videresendelse af porte fra værten til VM'en. |
config.vm.provision | Angiver, hvordan den virtuelle maskine klargøres, såsom at køre shell-scripts under opsætning. |
Udforsker Dockerfile og Vagrantfile
I de medfølgende eksempler demonstrerede vi først, hvordan man opretter en Dockerfile til implementering af en Node.js-applikation. Dockerfilen begynder med at angive basisbilledet med kommando, i dette tilfælde, ved hjælp af en officiel Node.js runtime. Indstilling af arbejdsbiblioteket inde i beholderen opnås med kommando, som sikrer, at efterfølgende kommandoer udføres i den angivne mappe. Det kommandoen bruges til at overføre package.json-filerne og applikationskoden til containeren. Det RUN kommandoen installerer derefter de nødvendige afhængigheder inde i containeren. Vi afslører den port, applikationen kører på, ved hjælp af kommando, og endelig kommando definerer kommandoen til at køre programmet, når containeren starter.
For Vagrantfile-eksemplet starter konfigurationen med at angive basisboksen med kommando, her ved hjælp af Ubuntu 20.04. Netværksindstillinger konfigureres ved hjælp af kommando, som videresender port 8080 på værten til port 80 på gæste-VM'en, hvilket tillader ekstern adgang til tjenester, der kører på VM'en. Det kommandoen bruges til at køre et shell-script, der opdaterer pakkelisten og installerer Apache2, og forsyner VM'en med nødvendig software. Disse kommandoer viser de grundlæggende trin til opsætning af et VM-miljø, og tilbyder en mere traditionel tilgang sammenlignet med det containeriserede miljø leveret af Docker.
Oprettelse af en Dockerfile til Node.js Application Deployment
Dette eksempel viser, hvordan man opretter en Dockerfile til en Node.js-applikation, og viser trinene til at bygge og køre appen i en Docker-container.
# 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"]
Opsætning af en virtuel maskine ved hjælp af Vagrant
Dette eksempel viser, hvordan man opsætter en virtuel maskine ved hjælp af Vagrant med en simpel Vagrantfil, der demonstrerer processen med at 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 af de vigtigste forskelle mellem Docker og virtuelle maskiner (VM'er) ligger i, hvordan de bruger systemressourcer. VM'er kører på en hypervisor, som emulerer hardware og tillader flere operativsystemer at køre samtidigt på en værtsmaskine. Dette kræver, at hver VM inkluderer et komplet gæsteoperativsystem, sit eget sæt af biblioteker og binære filer. Dette bruger ikke kun betydelige systemressourcer, men øger også den samlede størrelse og kompleksitet af implementering og vedligeholdelse.
I modsætning hertil udnytter Docker containeriseringsteknologi, som gør det muligt for flere containere at dele den samme operativsystemkerne. Hver container kører som en isoleret proces i brugerrummet. Det betyder, at containere er meget lettere og hurtigere at starte op sammenlignet med VM'er, da de ikke behøver at starte et helt OS op. Docker opnår filsystemisolering gennem et lagdelt filsystem, hvor hver container har sit eget filsystemlag oven på et basisbillede. Netværksisolering håndteres ved hjælp af navnerum, hvilket giver Docker mulighed for at levere isolerede netværksmiljøer for hver container uden overhead, der er forbundet med VM'er.
- Hvad er den primære forskel mellem Docker og VM'er?
- Docker bruger containerisering til at dele værts-OS-kernen, hvilket gør den lettere og hurtigere, hvorimod VM'er kræver et komplet gæste-OS og en hypervisor.
- Hvorfor anses Docker-containere for at være mere effektive?
- Containere deler værts-OS-kernen og har minimal overhead, hvilket giver mulighed for hurtigere opstartstider og effektiv ressourceudnyttelse.
- Hvordan opnår Docker filsystemisolering?
- Docker bruger et lagdelt filsystem, hvor hver container har sit eget filsystemlag oven på et basisbillede.
- Hvad er en hypervisor i forbindelse med VM'er?
- En hypervisor er software, der emulerer hardware, hvilket tillader flere operativsystemer at køre samtidigt på en enkelt værtsmaskine.
- Hvordan håndterer Docker netværksisolering?
- Docker bruger navnerum til at levere isolerede netværksmiljøer for hver container.
- Hvorfor er det nemmere at implementere software til et Docker-image end en VM?
- Docker-billeder indkapsler alle afhængigheder og konfigurationer, hvilket sikrer konsistens på tværs af forskellige miljøer.
- Hvad er nogle almindelige use cases for Docker?
- Docker bruges almindeligvis til mikroservicearkitektur, kontinuerlig integration/kontinuerlig udrulning (CI/CD) og isolerede udviklingsmiljøer.
- Kan Docker-containere køre på ethvert operativsystem?
- Docker-containere kan køre på ethvert OS, der understøtter Docker, men de deler værts-OS-kernen.
- Hvad er et basisbillede i Docker?
- Et basisbillede er udgangspunktet for at bygge Docker-containere, ofte inklusive OS og grundlæggende afhængigheder.
Opsummering af Docker vs. Virtual Machines
Ved sammenligning af Docker og virtuelle maskiner ligger den primære forskel i deres ressourceudnyttelse og implementeringseffektivitet. Virtuelle maskiner opererer med et komplet gæsteoperativsystem og hypervisor, hvilket fører til højere ressourceforbrug. Omvendt deler Docker-containere host-OS-kernen, hvilket resulterer i en mere let og smidig løsning. Docker opnår isolerede miljøer gennem et lagdelt filsystem og netværksnavneområder, hvilket gør det muligt at levere lignende funktionaliteter til VM'er uden den tilhørende overhead. Dette gør implementering af software til Docker-billeder mere effektiv, ensartet og lettere at administrere i forskellige produktionsmiljøer.
Som konklusion giver Dockers brug af containerisering en betydelig fordel i forhold til traditionelle virtuelle maskiner ved at minimere ressourceforbrug og forenkle implementeringsprocesser. Ved at dele værts-OS-kernen og bruge isolerede filsystemer og netværk giver Docker en robust, men letvægtsløsning til moderne applikationsimplementering. At forstå disse forskelle kan hjælpe udviklere med at vælge det rigtige værktøj til deres behov, hvilket sikrer effektiv og skalerbar applikationsadministration.