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.
- Hva er den primære forskjellen mellom Docker og VM-er?
- 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.
- Hvorfor anses Docker-containere som mer effektive?
- Beholdere deler verts-OS-kjernen og har minimal overhead, noe som gir raskere oppstartstider og effektiv ressursutnyttelse.
- Hvordan oppnår Docker filsystemisolasjon?
- Docker bruker et lagdelt filsystem, der hver container har sitt eget filsystemlag på toppen av et basisbilde.
- Hva er en hypervisor i sammenheng med virtuelle datamaskiner?
- En hypervisor er programvare som emulerer maskinvare, slik at flere operativsystemer kan kjøres samtidig på en enkelt vertsmaskin.
- Hvordan håndterer Docker nettverksisolasjon?
- Docker bruker navnerom for å gi isolerte nettverksmiljøer for hver container.
- Hvorfor er det enklere å distribuere programvare til et Docker-bilde enn en VM?
- Docker-bilder innkapsler alle avhengigheter og konfigurasjoner, og sikrer konsistens på tvers av forskjellige miljøer.
- Hva er noen vanlige brukstilfeller for Docker?
- Docker brukes ofte for mikrotjenester-arkitektur, kontinuerlig integrasjon/kontinuerlig distribusjon (CI/CD) og isolerte utviklingsmiljøer.
- Kan Docker-containere kjøre på et hvilket som helst operativsystem?
- Docker-beholdere kan kjøre på alle operativsystemer som støtter Docker, men de deler verts-OS-kjernen.
- Hva er et basisbilde i Docker?
- 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.