„Docker“ ir virtualių mašinų skirtumų supratimas

„Docker“ ir virtualių mašinų skirtumų supratimas
„Docker“ ir virtualių mašinų skirtumų supratimas

Įvadas į Docker ir virtualias mašinas

„Docker“ ir virtualios mašinos (VM) yra populiarūs programų diegimo įrankiai, tačiau jie veikia iš esmės skirtingai. Daugelį kūrėjų glumina, kaip „Docker“ gali pateikti visą failų sistemą, izoliuotą tinklą ir kitas funkcijas be papildomų išlaidų, paprastai susijusių su VM.

Šiuo straipsniu siekiama paaiškinti skirtumus tarp „Docker“ ir tradicinių virtualių mašinų, paaiškinant, kodėl „Docker“ dažnai laikoma lengvesne ir lengviau diegiama programine įranga. Mes gilinsimės į pagrindines technologijas ir praktinę „Docker“ naudojimo gamybos aplinkoje naudą.

komandą apibūdinimas
FROM Nurodomas pagrindinis vaizdas, naudojamas kuriant Docker konteinerį.
WORKDIR Nustato darbo katalogą Docker konteineryje.
COPY Kopijuoja failus arba katalogus iš pagrindinio kompiuterio į Docker konteinerį.
RUN Vykdo komandą Docker konteineryje kūrimo proceso metu.
EXPOSE Informuoja Docker, kad konteineris klausosi nurodytų tinklo prievadų vykdymo metu.
CMD Nurodo komandą, kuri bus paleista Docker konteineryje, kai ji paleidžiama.
config.vm.box Apibrėžia pagrindinį langelį, naudojamą „Vagrant“ virtualiajai mašinai.
config.vm.network Konfigūruojami tinklo nustatymai, pvz., prievadų peradresavimas iš pagrindinio kompiuterio į VM.
config.vm.provision Nurodoma, kaip parengti virtualią mašiną, pvz., paleisti apvalkalo scenarijus sąrankos metu.

„Dockerfile“ ir „Vagrantfile“ tyrinėjimas

Pateiktuose pavyzdžiuose pirmiausia pademonstravome, kaip sukurti Dockerfile, skirtą Node.js programai diegti. „Dockerfile“ prasideda nurodant pagrindinį vaizdą su FROM komandą, šiuo atveju naudojant oficialų Node.js vykdymo laiką. Darbinis katalogas konteinerio viduje nustatomas naudojant WORKDIR komanda, kuri užtikrina, kad paskesnės komandos būtų vykdomos nurodytame kataloge. The COPY komanda naudojama paketų.json failams ir programos kodui perkelti į konteinerį. The RUN tada komanda įdiegia reikiamas priklausomybes konteinerio viduje. Atskleidžiame prievadą, kuriame programa veikia, naudodami EXPOSE komandą ir galiausiai CMD komanda apibrėžia komandą paleisti programą, kai paleidžiamas konteineris.

„Vagrantfile“ pavyzdyje konfigūracija pradedama nurodant pagrindinį langelį su config.vm.box komanda, čia naudojant Ubuntu 20.04. Tinklo nustatymai sukonfigūruojami naudojant config.vm.network komanda, kuri persiunčia pagrindinio kompiuterio 8080 prievadą į svečio VM 80 prievadą, suteikdama išorinę prieigą prie paslaugų, veikiančių VM. The config.vm.provision komanda naudojama paleisti apvalkalo scenarijų, kuris atnaujina paketų sąrašą ir įdiegia „Apache2“, aprūpindamas VM reikiama programine įranga. Šios komandos parodo pagrindinius VM aplinkos nustatymo veiksmus ir siūlo tradicinį metodą, palyginti su Docker teikiama konteinerine aplinka.

„Node.js“ programos diegimo „Docker“ failo kūrimas

Šiame pavyzdyje parodyta, kaip sukurti „Node.js“ programos „Dockerfile“ failą, parodomi veiksmai, kaip sukurti ir paleisti programą „Docker“ konteineryje.

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

Virtualios mašinos nustatymas naudojant „Vagrant“.

Šiame pavyzdyje parodyta, kaip nustatyti virtualią mašiną naudojant „Vagrant“ su paprastu „Vagrantfile“, parodydamas VM aplinkos apibrėžimo ir konfigūravimo procesą.

# -*- 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 ir virtualiųjų mašinų supratimas

Vienas iš pagrindinių Docker ir virtualių mašinų (VM) skirtumų yra tai, kaip jos naudoja sistemos išteklius. VM veikia hipervizoriuje, kuris emuliuoja aparatinę įrangą ir leidžia pagrindiniame kompiuteryje vienu metu veikti kelioms operacinėms sistemoms. Tam reikia, kad kiekviena VM turėtų pilną svečio operacinę sistemą, savo bibliotekų rinkinį ir dvejetainius failus. Tai ne tik sunaudoja daug sistemos išteklių, bet ir padidina bendrą diegimo ir priežiūros dydį bei sudėtingumą.

Priešingai, „Docker“ naudoja konteinerių kūrimo technologiją, kuri leidžia keliems konteineriams bendrinti tą patį operacinės sistemos branduolį. Kiekvienas konteineris veikia kaip atskiras procesas vartotojo erdvėje. Tai reiškia, kad konteineriai yra daug lengvesni ir greičiau paleidžiami, palyginti su VM, nes jiems nereikia paleisti visos OS. „Docker“ pasiekia failų sistemos izoliaciją per sluoksniuotą failų sistemą, kur kiekvienas konteineris turi savo failų sistemos sluoksnį pagrindinio vaizdo viršuje. Tinklo izoliacija tvarkoma naudojant vardų sritis, todėl „Docker“ gali teikti atskiras tinklo aplinkas kiekvienam konteineriui be papildomų išlaidų, susijusių su VM.

Dažnai užduodami klausimai apie Docker ir virtualias mašinas

  1. Koks yra pagrindinis skirtumas tarp „Docker“ ir „VM“?
  2. „Docker“ naudoja konteinerį, kad bendrintų pagrindinio kompiuterio OS branduolį, todėl jis tampa lengvesnis ir greitesnis, o virtualioms mašinoms reikalinga visavertė svečių OS ir hipervizorius.
  3. Kodėl Docker konteineriai laikomi efektyvesniais?
  4. Sudėtiniai elementai dalijasi pagrindinio kompiuterio OS branduoliu ir turi minimalias pridėtines išlaidas, todėl paleisties laikas yra greitesnis ir ištekliai efektyviai naudojami.
  5. Kaip „Docker“ pasiekia failų sistemos izoliaciją?
  6. „Docker“ naudoja sluoksniuotą failų sistemą, kur kiekvienas konteineris turi savo failų sistemos sluoksnį pagrindinio vaizdo viršuje.
  7. Kas yra hipervizorius VM kontekste?
  8. Hipervizorius yra programinė įranga, imituojanti aparatinę įrangą, leidžianti kelioms operacinėms sistemoms vienu metu veikti viename pagrindiniame kompiuteryje.
  9. Kaip „Docker“ tvarko tinklo izoliaciją?
  10. „Docker“ naudoja vardų sritis, kad kiekvienam konteineriui pateiktų atskiras tinklo aplinkas.
  11. Kodėl programinės įrangos diegimas „Docker“ atvaizde yra lengvesnis nei VM?
  12. „Docker“ vaizdai apima visas priklausomybes ir konfigūracijas, užtikrindami nuoseklumą įvairiose aplinkose.
  13. Kokie yra įprasti Docker naudojimo atvejai?
  14. „Docker“ dažniausiai naudojamas mikropaslaugų architektūrai, nuolatiniam integravimui / nuolatiniam diegimui (CI / CD) ir izoliuotoms kūrimo aplinkoms.
  15. Ar „Docker“ konteineriai gali veikti bet kurioje OS?
  16. „Docker“ konteineriai gali veikti bet kurioje OS, palaikančioje „Docker“, tačiau jie bendrina pagrindinio kompiuterio OS branduolį.
  17. Kas yra pagrindinis Docker vaizdas?
  18. Bazinis vaizdas yra pradinis taškas kuriant „Docker“ konteinerius, dažnai apimančius OS ir pagrindines priklausomybes.

Apibendrinant Docker vs. Virtual Machines

Lyginant „Docker“ ir virtualias mašinas, pagrindinis skirtumas yra jų išteklių panaudojimas ir diegimo efektyvumas. Virtualios mašinos veikia su pilna svečių operacine sistema ir hipervizoriumi, todėl sunaudojama daugiau išteklių. Ir atvirkščiai, „Docker“ konteineriai dalijasi pagrindinio kompiuterio OS branduoliu, todėl sprendimas yra lengvesnis ir judresnis. „Docker“ sukuria izoliuotas aplinkas per sluoksniuotą failų sistemą ir tinklo vardų sritis, leidžiančias teikti panašias funkcijas kaip VM be susijusių papildomų išlaidų. Dėl to programinės įrangos diegimas „Docker“ atvaizduose yra efektyvesnis, nuoseklesnis ir lengviau valdomas įvairiose gamybos aplinkose.

Paskutinės mintys apie Docker ir virtualias mašinas

Apibendrinant galima pasakyti, kad „Docker“ konteinerių naudojimas suteikia didelį pranašumą prieš tradicines virtualias mašinas, nes sumažina išteklių naudojimą ir supaprastina diegimo procesus. Bendrindamas pagrindinio kompiuterio OS branduolį ir naudodamas izoliuotas failų sistemas bei tinklą, „Docker“ suteikia tvirtą, bet lengvą sprendimą, skirtą šiuolaikiniam programų diegimui. Šių skirtumų supratimas gali padėti kūrėjams pasirinkti tinkamą įrankį, atitinkantį jų poreikius, užtikrinant efektyvų ir keičiamą programų valdymą.