Úvod do Docker a virtuálnych strojov
Docker a virtuálne stroje (VM) sú populárne nástroje na nasadenie aplikácií, ale fungujú zásadne odlišnými spôsobmi. Mnoho vývojárov je zmätených tým, ako môže Docker poskytnúť kompletný súborový systém, izolované siete a ďalšie funkcie bez režijných nákladov, ktoré sú zvyčajne spojené s VM.
Cieľom tohto článku je objasniť rozdiely medzi Dockerom a tradičnými virtuálnymi strojmi a vysvetliť, prečo sa Docker často považuje za ľahší a jednoduchší na nasadenie softvéru. Ponoríme sa do základných technológií a praktických výhod používania Docker v produkčnom prostredí.
Príkaz | Popis |
---|---|
FROM | Určuje základný obrázok, ktorý sa má použiť na vytvorenie kontajnera Docker. |
WORKDIR | Nastaví pracovný adresár v kontajneri Docker. |
COPY | Skopíruje súbory alebo adresáre z hostiteľského počítača do kontajnera Docker. |
RUN | Počas procesu zostavovania vykoná príkaz v kontajneri Docker. |
EXPOSE | Informuje Docker, že kontajner počúva na špecifikovaných sieťových portoch počas behu. |
CMD | Určuje príkaz, ktorý sa má spustiť v kontajneri Docker pri spustení. |
config.vm.box | Definuje základný box, ktorý sa má použiť pre virtuálny počítač Vagrant. |
config.vm.network | Konfiguruje nastavenia siete, ako je napríklad presmerovanie portov z hostiteľa do virtuálneho počítača. |
config.vm.provision | Určuje spôsob poskytovania virtuálneho počítača, napríklad spúšťanie skriptov shellu počas inštalácie. |
Skúmanie Dockerfile a Vagrantfile
V poskytnutých príkladoch sme najskôr demonštrovali, ako vytvoriť súbor Dockerfile na nasadenie aplikácie Node.js. Dockerfile začína špecifikovaním základného obrázka s v tomto prípade pomocou oficiálneho runtime Node.js. Nastavenie pracovného adresára vo vnútri kontajnera sa dosiahne pomocou príkaz, ktorý zabezpečí vykonanie nasledujúcich príkazov v zadanom adresári. The príkaz sa používa na prenos súborov package.json a kódu aplikácie do kontajnera. The RUN príkaz potom nainštaluje potrebné závislosti do kontajnera. Odhalíme port, na ktorom aplikácia beží pomocou príkaz a nakoniec, príkaz definuje príkaz na spustenie aplikácie pri spustení kontajnera.
V príklade Vagrantfile sa konfigurácia začína špecifikovaním základného poľa s príkaz, tu pomocou Ubuntu 20.04. Nastavenia siete sa konfigurujú pomocou príkaz, ktorý preposiela port 8080 na hostiteľovi na port 80 na hosťovanom VM, čím umožňuje externý prístup k službám bežiacim na VM. The príkaz sa používa na spustenie skriptu shellu, ktorý aktualizuje zoznam balíkov a nainštaluje Apache2, čím poskytne virtuálnemu počítaču potrebný softvér. Tieto príkazy predstavujú základné kroky na nastavenie prostredia VM a ponúkajú tradičnejší prístup v porovnaní s kontajnerovým prostredím, ktoré poskytuje Docker.
Vytvorenie súboru Docker pre nasadenie aplikácie Node.js
Tento príklad ukazuje, ako vytvoriť súbor Dockerfile pre aplikáciu Node.js, pričom ukazuje kroky na zostavenie a spustenie aplikácie v kontajneri Docker.
# 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"]
Nastavenie virtuálneho počítača pomocou Vagrant
Tento príklad ukazuje, ako nastaviť virtuálny počítač pomocou Vagrant s jednoduchým súborom Vagrantfile, demonštruje proces definovania a konfigurácie prostredia VM.
# -*- 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
Pochopenie Docker a virtuálnych strojov
Jeden z kľúčových rozdielov medzi Dockerom a virtuálnymi strojmi (VM) spočíva v tom, ako využívajú systémové prostriedky. Virtuálne počítače bežia na hypervízore, ktorý emuluje hardvér a umožňuje súbežné spustenie viacerých operačných systémov na hostiteľskom počítači. To si vyžaduje, aby každý VM obsahoval úplný hosťujúci operačný systém, vlastnú sadu knižníc a binárne súbory. To nielenže spotrebúva značné systémové prostriedky, ale zvyšuje aj celkovú veľkosť a zložitosť nasadenia a údržby.
Naproti tomu Docker využíva technológiu kontajnerizácie, ktorá umožňuje viacerým kontajnerom zdieľať rovnaké jadro operačného systému. Každý kontajner beží ako izolovaný proces v užívateľskom priestore. To znamená, že kontajnery sú oveľa ľahšie a rýchlejšie sa spúšťajú v porovnaní s VM, pretože nemusia spúšťať celý OS. Docker dosahuje izoláciu súborového systému prostredníctvom vrstveného súborového systému, kde každý kontajner má svoju vlastnú vrstvu súborového systému na vrchu základného obrazu. Izolácia siete sa rieši pomocou menných priestorov, čo umožňuje Dockeru poskytovať izolované sieťové prostredia pre každý kontajner bez réžie spojenej s VM.
- Aký je hlavný rozdiel medzi Dockerom a VM?
- Docker používa kontajnerizáciu na zdieľanie jadra hostiteľského OS, čím je ľahší a rýchlejší, zatiaľ čo virtuálne počítače vyžadujú úplný hosťovský OS a hypervízor.
- Prečo sú kontajnery Docker považované za efektívnejšie?
- Kontajnery zdieľajú jadro hostiteľského OS a majú minimálnu réžiu, čo umožňuje rýchlejšie spúšťanie a efektívne využitie zdrojov.
- Ako Docker dosiahne izoláciu súborového systému?
- Docker používa vrstvený súborový systém, kde každý kontajner má svoju vlastnú vrstvu súborového systému na vrchu základného obrazu.
- Čo je hypervízor v kontexte VM?
- Hypervízor je softvér, ktorý emuluje hardvér a umožňuje súbežné spustenie viacerých operačných systémov na jednom hostiteľskom počítači.
- Ako Docker zvláda izoláciu siete?
- Docker používa menné priestory na poskytovanie izolovaných sieťových prostredí pre každý kontajner.
- Prečo je nasadenie softvéru do obrazu Docker jednoduchšie ako do virtuálneho počítača?
- Obrázky Docker zapuzdrujú všetky závislosti a konfigurácie, čím zaisťujú konzistenciu v rôznych prostrediach.
- Aké sú niektoré bežné prípady použitia Dockera?
- Docker sa bežne používa pre architektúru mikroslužieb, nepretržitú integráciu/nepretržité nasadenie (CI/CD) a izolované vývojové prostredia.
- Môžu kontajnery Docker bežať na akomkoľvek OS?
- Kontajnery Docker môžu bežať na akomkoľvek OS, ktorý podporuje Docker, ale zdieľajú jadro hostiteľského OS.
- Čo je základný obrázok v Dockeri?
- Základný obrázok je východiskovým bodom pre vytváranie kontajnerov Docker, často vrátane operačného systému a základných závislostí.
Zhrnutie Docker vs. virtuálne stroje
Pri porovnaní Dockeru a virtuálnych strojov spočíva primárny rozdiel v ich využití zdrojov a efektívnosti nasadenia. Virtuálne stroje fungujú s plnohodnotným hosťujúcim operačným systémom a hypervízorom, čo vedie k vyššej spotrebe zdrojov. Naopak, kontajnery Docker zdieľajú jadro hostiteľského OS, čo vedie k ľahšiemu a agilnejšiemu riešeniu. Docker dosahuje izolované prostredia prostredníctvom vrstveného súborového systému a sieťových menných priestorov, čo mu umožňuje poskytovať podobné funkcie ako virtuálne počítače bez súvisiacej réžie. Vďaka tomu je nasadenie softvéru do obrazov Docker efektívnejšie, konzistentnejšie a ľahšie spravovateľné v rôznych produkčných prostrediach.
Záverom možno povedať, že používanie kontajnerov spoločnosťou Docker ponúka významnú výhodu oproti tradičným virtuálnym strojom tým, že minimalizuje spotrebu zdrojov a zjednodušuje procesy nasadenia. Zdieľaním jadra hostiteľského OS a využívaním izolovaných súborových systémov a sietí poskytuje Docker robustné a zároveň ľahké riešenie pre nasadenie moderných aplikácií. Pochopenie týchto rozdielov môže pomôcť vývojárom vybrať si ten správny nástroj pre ich potreby a zabezpečiť efektívnu a škálovateľnú správu aplikácií.