A Docker és a virtuális gépek közötti különbségek megértése

Nodejs

Bevezetés a Dockerbe és a virtuális gépekbe

A Docker és a virtuális gépek (VM-ek) egyaránt népszerű eszközök az alkalmazások telepítéséhez, de alapvetően eltérő módon működnek. Sok fejlesztő értetlenül áll afelől, hogy a Docker hogyan tud teljes fájlrendszert, elszigetelt hálózatot és egyéb szolgáltatásokat nyújtani a virtuális gépekkel kapcsolatos általános költségek nélkül.

Ennek a cikknek a célja a Docker és a hagyományos virtuális gépek közötti különbségek tisztázása, elmagyarázva, hogy a Docker miért tekintik gyakran könnyebbnek és könnyebben telepíthető szoftvernek. Belemerülünk a mögöttes technológiákba és a Docker termelési környezetben való használatának gyakorlati előnyeibe.

Parancs Leírás
FROM Megadja a Docker-tároló létrehozásához használandó alapképet.
WORKDIR Beállítja a Docker-tárolón belüli munkakönyvtárat.
COPY Fájlokat vagy könyvtárakat másol a gazdagépről a Docker-tárolóba.
RUN Parancsot hajt végre a Docker-tárolóban az összeállítási folyamat során.
EXPOSE Tájékoztatja a Dockert, hogy a tároló a megadott hálózati portokon figyel futás közben.
CMD Megadja azt a parancsot, amely a Docker-tárolóban fut az induláskor.
config.vm.box Meghatározza a Vagrant virtuális géphez használandó alapdobozt.
config.vm.network Konfigurálja a hálózati beállításokat, például a portok továbbítását a gazdagépről a virtuális gépre.
config.vm.provision Meghatározza a virtuális gép kiépítésének módját, például héjszkriptek futtatását a telepítés során.

A Dockerfile és a Vagrantfile felfedezése

A bemutatott példákban először bemutattuk, hogyan lehet Docker-fájlt létrehozni egy Node.js alkalmazás üzembe helyezéséhez. A Dockerfile úgy kezdődik, hogy megadja az alapképet a parancsot, ebben az esetben egy hivatalos Node.js futtatókörnyezet használatával. A tárolón belüli munkakönyvtár beállítása a parancsot, amely biztosítja, hogy a következő parancsok a megadott könyvtárban legyenek végrehajtva. A paranccsal lehet a package.json fájlokat és az alkalmazás kódját átvinni a tárolóba. A RUN parancs, majd telepíti a szükséges függőségeket a tárolón belül. Felfedjük azt a portot, amelyen az alkalmazás fut a parancsot, és végül a parancs határozza meg az alkalmazás futtatásához szükséges parancsot, amikor a tároló elindul.

A Vagrantfile példában a konfiguráció úgy kezdődik, hogy megadja az alapdobozt a parancsot, itt az Ubuntu 20.04 használatával. A hálózati beállítások a segítségével konfigurálhatók parancs, amely továbbítja a gazdagép 8080-as portját a vendég virtuális gép 80-as portjára, lehetővé téve a külső hozzáférést a virtuális gépen futó szolgáltatásokhoz. A A parancs egy shell-szkript futtatására szolgál, amely frissíti a csomaglistát és telepíti az Apache2-t, ellátva a virtuális gépet a szükséges szoftverekkel. Ezek a parancsok bemutatják a virtuálisgép-környezet beállításának alapvető lépéseit, és hagyományosabb megközelítést kínálnak a Docker által biztosított konténeres környezethez képest.

Dockerfile létrehozása a Node.js alkalmazástelepítéshez

Ez a példa bemutatja, hogyan lehet Docker-fájlt létrehozni egy Node.js alkalmazáshoz, bemutatva az alkalmazás Docker-tárolóban történő felépítésének és futtatásának lépéseit.

# 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"]

Virtuális gép beállítása a Vagrant segítségével

Ez a példa bemutatja, hogyan állíthat be egy virtuális gépet a Vagrant használatával egy egyszerű Vagrant-fájllal, bemutatva a virtuálisgép-környezet meghatározásának és konfigurálásának folyamatát.

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

A Docker és a virtuális gépek megértése

A Docker és a virtuális gépek (VM-ek) közötti egyik legfontosabb különbség a rendszererőforrások felhasználásában rejlik. A virtuális gépek hypervisoron futnak, amely emulálja a hardvert, és lehetővé teszi több operációs rendszer egyidejű futtatását egy gazdagépen. Ehhez minden virtuális gépnek tartalmaznia kell egy teljes vendég operációs rendszert, saját könyvtárkészletet és bináris fájlokat. Ez nemcsak jelentős rendszererőforrást emészt fel, hanem növeli a telepítés és karbantartás általános méretét és összetettségét is.

Ezzel szemben a Docker kihasználja a konténerezési technológiát, amely lehetővé teszi több konténer megosztását ugyanazon az operációs rendszer kernelén. Minden tároló elszigetelt folyamatként fut a felhasználói térben. Ez azt jelenti, hogy a konténerek sokkal könnyebben és gyorsabban indíthatók el, mint a virtuális gépek, mivel nem kell a teljes operációs rendszert elindítani. A Docker a fájlrendszer elkülönítését egy réteges fájlrendszeren keresztül éri el, ahol minden tárolónak saját fájlrendszer-rétege van az alapkép tetején. A hálózati elkülönítést névterek segítségével kezelik, így a Docker minden egyes tárolóhoz elkülönített hálózati környezetet biztosít a virtuális gépekhez kapcsolódó többletterhelés nélkül.

  1. Mi az elsődleges különbség a Docker és a virtuális gépek között?
  2. A Docker konténerezést használ a gazdagép operációs rendszer kernelének megosztására, ami könnyebbé és gyorsabbá teszi azt, míg a virtuális gépek teljes vendég operációs rendszert és hypervisort igényelnek.
  3. Miért tartják hatékonyabbnak a Docker konténereket?
  4. A tárolók megosztják a gazdagép operációs rendszer kernelt, és minimális többletköltséggel rendelkeznek, ami gyorsabb indítási időt és hatékony erőforrás-kihasználást tesz lehetővé.
  5. Hogyan éri el a Docker a fájlrendszer elkülönítését?
  6. A Docker réteges fájlrendszert használ, ahol minden tárolónak saját fájlrendszer-rétege van az alapkép tetején.
  7. Mit jelent a hypervisor a virtuális gépek kontextusában?
  8. A hypervisor olyan szoftver, amely emulálja a hardvert, és lehetővé teszi több operációs rendszer egyidejű futtatását egyetlen gazdagépen.
  9. Hogyan kezeli a Docker a hálózati elkülönítést?
  10. A Docker névtereket használ, hogy elkülönített hálózati környezeteket biztosítson minden egyes tárolóhoz.
  11. Miért egyszerűbb a szoftverek üzembe helyezése egy Docker lemezképre, mint egy virtuális gépre?
  12. A Docker képek minden függőséget és konfigurációt magukba foglalnak, biztosítva a konzisztenciát a különböző környezetekben.
  13. Melyek a Docker általános használati esetei?
  14. A Dockert általában mikroszolgáltatás-architektúrához, folyamatos integrációhoz/folyamatos telepítéshez (CI/CD) és elszigetelt fejlesztői környezetekhez használják.
  15. A Docker konténerek bármelyik operációs rendszeren futhatnak?
  16. A Docker-tárolók bármely Dockert támogató operációs rendszeren futhatnak, de megosztják a gazdagép operációs rendszer kernelt.
  17. Mi az alapkép a Dockerben?
  18. Az alapkép a Docker-tárolók építésének kiindulópontja, amely gyakran tartalmazza az operációs rendszert és az alapvető függőségeket.

A Docker és a virtuális gépek összefoglalása

A Docker és a virtuális gépek összehasonlításakor az elsődleges különbség az erőforrás-kihasználásukban és a telepítési hatékonyságukban rejlik. A virtuális gépek teljes vendég operációs rendszerrel és hipervizorral működnek, ami nagyobb erőforrás-felhasználáshoz vezet. Ezzel szemben a Docker-tárolók megosztják a gazdagép operációs rendszer kernelt, ami könnyebb és agilisabb megoldást eredményez. A Docker egy réteges fájlrendszeren és hálózati névtereken keresztül ér el elszigetelt környezeteket, lehetővé téve, hogy a virtuális gépekhez hasonló funkciókat biztosítson a kapcsolódó többletterhelés nélkül. Ez hatékonyabbá, konzisztensebbé és könnyebben kezelhetővé teszi a szoftverek Docker-képfájlokba történő telepítését a különböző éles környezetekben.

Összefoglalva, a Docker konténerhasználata jelentős előnyt kínál a hagyományos virtuális gépekkel szemben az erőforrás-felhasználás minimalizálása és a telepítési folyamatok egyszerűsítése révén. A gazdagép operációs rendszer kernelének megosztásával, valamint elszigetelt fájlrendszerek és hálózatok felhasználásával a Docker robusztus, de könnyű megoldást kínál a modern alkalmazások telepítéséhez. E különbségek megértése segíthet a fejlesztőknek az igényeiknek megfelelő eszköz kiválasztásában, ami hatékony és méretezhető alkalmazáskezelést biztosít.