De verschillen tussen Docker en virtuele machines begrijpen

De verschillen tussen Docker en virtuele machines begrijpen
De verschillen tussen Docker en virtuele machines begrijpen

Inleiding tot Docker en virtuele machines

Docker en virtuele machines (VM's) zijn beide populaire tools voor het implementeren van applicaties, maar ze werken op fundamenteel verschillende manieren. Veel ontwikkelaars zijn verbaasd over de manier waarop Docker een compleet bestandssysteem, geïsoleerde netwerken en andere functies kan bieden zonder de overhead die doorgaans met VM's gepaard gaat.

Dit artikel heeft tot doel het onderscheid tussen Docker en traditionele virtuele machines te verduidelijken en uit te leggen waarom Docker vaak wordt beschouwd als lichter en gemakkelijker voor het implementeren van software. We verdiepen ons in de onderliggende technologieën en de praktische voordelen van het gebruik van Docker in productieomgevingen.

Commando Beschrijving
FROM Specificeert de basisinstallatiekopie die moet worden gebruikt voor het maken van een Docker-container.
WORKDIR Stelt de werkmap in de Docker-container in.
COPY Kopieert bestanden of mappen van de hostmachine naar de Docker-container.
RUN Voert tijdens het bouwproces een opdracht uit in de Docker-container.
EXPOSE Informeert Docker dat de container tijdens runtime op de opgegeven netwerkpoorten luistert.
CMD Specificeert de opdracht die moet worden uitgevoerd binnen de Docker-container wanneer deze wordt gestart.
config.vm.box Definieert het basisvak dat moet worden gebruikt voor de virtuele Vagrant-machine.
config.vm.network Configureert netwerkinstellingen, zoals het doorsturen van poorten van de host naar de VM.
config.vm.provision Geeft aan hoe de virtuele machine moet worden ingericht, zoals het uitvoeren van shell-scripts tijdens de installatie.

Dockerfile en Vagrantfile verkennen

In de gegeven voorbeelden hebben we eerst gedemonstreerd hoe u een Dockerfile kunt maken voor het implementeren van een Node.js-toepassing. Het Dockerbestand begint met het opgeven van de basisinstallatiekopie met de FROM opdracht, in dit geval met behulp van een officiële Node.js-runtime. Het instellen van de werkmap in de container wordt bereikt met de WORKDIR opdracht, die ervoor zorgt dat volgende opdrachten worden uitgevoerd in de opgegeven map. De COPY opdracht wordt gebruikt om de package.json-bestanden en de applicatiecode naar de container over te brengen. De RUN command installeert vervolgens de benodigde afhankelijkheden in de container. We stellen de poort bloot waarop de applicatie draait met behulp van de EXPOSE opdracht, en ten slotte de CMD command definieert de opdracht om de toepassing uit te voeren wanneer de container start.

Voor het Vagrantfile-voorbeeld begint de configuratie met het opgeven van het basisvak met de config.vm.box commando, hier met Ubuntu 20.04. Netwerkinstellingen worden geconfigureerd met behulp van de config.vm.network commando, dat poort 8080 op de host doorstuurt naar poort 80 op de gast-VM, waardoor externe toegang mogelijk wordt tot services die op de VM draaien. De config.vm.provision De opdracht wordt gebruikt om een ​​shellscript uit te voeren dat de pakketlijst bijwerkt en Apache2 installeert, waardoor de VM wordt voorzien van de benodigde software. Deze opdrachten tonen de fundamentele stappen voor het opzetten van een VM-omgeving en bieden een meer traditionele aanpak vergeleken met de containeromgeving van Docker.

Een Dockerfile maken voor de implementatie van Node.js-applicaties

In dit voorbeeld wordt gedemonstreerd hoe u een Dockerfile maakt voor een Node.js-toepassing, waarbij de stappen worden getoond voor het bouwen en uitvoeren van de app in een 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"]

Een virtuele machine opzetten met Vagrant

Dit voorbeeld laat zien hoe u een virtuele machine kunt instellen met behulp van Vagrant met een eenvoudig Vagrant-bestand, en demonstreert het proces van het definiëren en configureren van een VM-omgeving.

# -*- 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

Docker en virtuele machines begrijpen

Een van de belangrijkste verschillen tussen Docker en virtuele machines (VM's) ligt in de manier waarop ze systeembronnen gebruiken. VM's draaien op een hypervisor, die hardware emuleert en ervoor zorgt dat meerdere besturingssystemen tegelijkertijd op een hostmachine kunnen draaien. Hiervoor moet elke VM een volledig gastbesturingssysteem, een eigen set bibliotheken en binaire bestanden bevatten. Dit vergt niet alleen aanzienlijke systeembronnen, maar vergroot ook de algehele omvang en complexiteit van de implementatie en het onderhoud.

Docker maakt daarentegen gebruik van containerisatietechnologie, waardoor meerdere containers dezelfde besturingssysteemkernel kunnen delen. Elke container draait als een geïsoleerd proces in de gebruikersruimte. Dit betekent dat containers veel lichter en sneller zijn op te starten in vergelijking met VM's, omdat ze niet een heel besturingssysteem hoeven op te starten. Docker bereikt isolatie van bestandssystemen via een gelaagd bestandssysteem, waarbij elke container zijn eigen bestandssysteemlaag heeft bovenop een basisimage. Netwerkisolatie wordt afgehandeld met behulp van naamruimten, waardoor Docker voor elke container geïsoleerde netwerkomgevingen kan bieden zonder de overhead die gepaard gaat met VM's.

Veelgestelde vragen over Docker en virtuele machines

  1. Wat is het belangrijkste verschil tussen Docker en VM's?
  2. Docker maakt gebruik van containerisatie om de kernel van het hostbesturingssysteem te delen, waardoor deze lichter en sneller wordt, terwijl VM's een volledig gastbesturingssysteem en een hypervisor nodig hebben.
  3. Waarom worden Docker-containers als efficiënter beschouwd?
  4. Containers delen de host-besturingssysteemkernel en hebben minimale overhead, waardoor snellere opstarttijden en efficiënt gebruik van bronnen mogelijk zijn.
  5. Hoe bereikt Docker isolatie van bestandssystemen?
  6. Docker gebruikt een gelaagd bestandssysteem, waarbij elke container zijn eigen bestandssysteemlaag bovenop een basisimage heeft.
  7. Wat is een hypervisor in de context van VM's?
  8. Een hypervisor is software die hardware emuleert, waardoor meerdere besturingssystemen tegelijkertijd op één hostmachine kunnen draaien.
  9. Hoe gaat Docker om met netwerkisolatie?
  10. Docker gebruikt naamruimten om voor elke container geïsoleerde netwerkomgevingen te bieden.
  11. Waarom is het implementeren van software op een Docker-image eenvoudiger dan op een VM?
  12. Docker-images omvatten alle afhankelijkheden en configuraties, waardoor consistentie in verschillende omgevingen wordt gegarandeerd.
  13. Wat zijn enkele veelvoorkomende gebruiksscenario's voor Docker?
  14. Docker wordt vaak gebruikt voor microservices-architectuur, continue integratie/continue implementatie (CI/CD) en geïsoleerde ontwikkelomgevingen.
  15. Kunnen Docker-containers op elk besturingssysteem worden uitgevoerd?
  16. Docker-containers kunnen worden uitgevoerd op elk besturingssysteem dat Docker ondersteunt, maar ze delen de host-besturingssysteemkernel.
  17. Wat is een basisimage in Docker?
  18. Een basisimage is het startpunt voor het bouwen van Docker-containers, vaak inclusief het besturingssysteem en de basisafhankelijkheden.

Een samenvatting van Docker versus virtuele machines

Bij het vergelijken van Docker en virtuele machines ligt het belangrijkste verschil in het gebruik van bronnen en de efficiëntie van de implementatie. Virtuele machines werken met een volledig gastbesturingssysteem en hypervisor, wat leidt tot een hoger resourceverbruik. Omgekeerd delen Docker-containers de host-OS-kernel, wat resulteert in een lichtere en flexibelere oplossing. Docker realiseert geïsoleerde omgevingen via een gelaagd bestandssysteem en netwerknaamruimten, waardoor het vergelijkbare functionaliteiten als VM's kan bieden zonder de bijbehorende overhead. Dit maakt het implementeren van software op Docker-images efficiënter, consistenter en eenvoudiger te beheren in verschillende productieomgevingen.

Laatste gedachten over Docker en virtuele machines

Concluderend biedt Docker's gebruik van containerisatie een aanzienlijk voordeel ten opzichte van traditionele virtuele machines door het gebruik van bronnen te minimaliseren en implementatieprocessen te vereenvoudigen. Door de host-OS-kernel te delen en geïsoleerde bestandssystemen en netwerken te gebruiken, biedt Docker een robuuste maar lichtgewicht oplossing voor de implementatie van moderne applicaties. Het begrijpen van deze verschillen kan ontwikkelaars helpen bij het kiezen van de juiste tool voor hun behoeften, waardoor efficiënt en schaalbaar applicatiebeheer wordt gegarandeerd.