1-bo‘lim

Konteyner nima?

Konteyner va virtual mashina farqi, Docker qanday paydo bo'lgan va u qanday muammoni hal qiladi.

🕑 14 daqiqa o‘qish 📄 1 163 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Virtual mashinadan farqi
  2. Konteyner nimadan iborat?
  3. Docker qanday paydo bo'ldi?
  4. Birinchi konteyner
  5. Nima uchun bu tez?
  6. Obraz va konteyner - bir xil narsa emas
  7. Qachon konteyner kerak emas?
  8. Xulosa

Har bir jamoada bir marta shunday suhbat bo'lgan:

Natija
Dasturchi : Mening kompyuterimda ishlayapti-ku.
Admin     : Serverda ishlamayapti.
Dasturchi : Demak serverda nimadir boshqacha.

Va ular haq. Serverda Python 3.9, mahalliy kompyuterda 3.12. Serverda libssl ning eski versiyasi. Serverda muhit o'zgaruvchisi boshqacha.

Konteyner shu farqni yo'q qiladi: ilova o'z kutubxonalari, o'z fayl tizimi va o'z sozlamalari bilan birga bitta to'plamga joylanadi. Bu to'plam dasturchining noutbukida ham, serverda ham bir xil ishlaydi.

Virtual mashinadan farqi #

Ko'pchilik konteynerni "yengil virtual mashina" deb tushunadi. Bu noto'g'ri - ular tubdan boshqacha ishlaydi.

Virtual mashina va konteyner Virtual mashina Ilova A | Ilova B Kutubxonalar Mehmon OT + yadro har biriga alohida - GB larda Gipervizor Konteyner Ilova A | Ilova B Kutubxonalar Konteyner ish vaqti Host operatsion tizimi - BITTA yadro konteynerlar shu yadroni baham ko'radi, VM lar esa o'zinikini olib yuradi Jismoniy server
Konteyner yadroni baham ko'radi - shuning uchun yengil va tez

Buni isbotlash oson. Host yadrosi versiyasini va konteyner ichidagi yadro versiyasini solishtiramiz:

Terminal
uname -r
docker run --rm alpine:3.21 uname -r
Natija
6.18.33.2-microsoft-standard-WSL2
6.18.33.2-microsoft-standard-WSL2

Bir xil. Konteyner o'z yadrosini ishga tushirmaydi - u hostnikini ishlatadi. Virtual mashina bo'lganida, ikkinchi qator butunlay boshqa versiyani ko'rsatgan bo'lardi.

Virtual mashinaKonteyner
YadroHar biriga alohidaHost yadrosi baham ko'riladi
HajmiGigabaytlardaMegabaytlarda
Ishga tushishiDaqiqa yoki o'nlab soniyaSoniyaning ulushi
Ajratish darajasiTo'liq (apparat darajasida)Jarayon darajasida
Boshqa OT ishlatishMumkin (Linux ustida Windows)Mumkin emas
Bir serverda nechtaO'nlabYuzlab
Konteyner VM ning o'rnini bosmaydi

Ular turli masalalarni hal qiladi.

Sizga to'liq ajratish kerak bo'lsa yoki boshqa operatsion tizim kerak bo'lsa - virtual mashina.

Bir xil Linux ustida ko'p ilovani zich joylashtirish kerak bo'lsa - konteyner.

Amalda ikkalasi birga ishlatiladi: bulutdagi virtual mashina ichida o'nlab konteyner.

Konteyner nimadan iborat? #

Konteyner - sehr emas. U Linux yadrosining uchta imkoniyatidan foydalanadigan oddiy jarayon:

MexanizmNima qiladi
NamespaceJarayon nimani "ko'rishini" cheklaydi
cgroupJarayon qancha resurs olishini cheklaydi
Union fayl tizimiObraz qatlamlarini bitta ildizga birlashtiradi

Namespace ta'sirini darhol ko'rish mumkin. Hostda ps -e o'nlab jarayonni ko'rsatadi. Endi shu buyruqni konteyner ichida bajaramiz:

Terminal
docker run --rm alpine:3.21 ps -e
Natija
PID   USER     TIME  COMMAND
    1 root      0:00 ps -e

Konteyner ichida bitta jarayon ko'rinadi - va uning raqami 1. Konteyner uchun u dunyodagi birinchi jarayon. Hostdagi qolgan jarayonlar hammasi joyida ishlayapti, shunchaki bu namespace dan ko'rinmaydi.

Fayl tizimi ham alohida:

Terminal
docker run --rm alpine:3.21 ls /
Natija
bin
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

Hostda boot, init, lib32, lost+found kabi papkalar ham bor - konteynerda ular yo'q. Konteyner o'zining minimal fayl tizimini ko'radi.

Docker qanday paydo bo'ldi? #

Solomon Hykes - Docker asoschisi va birinchi muallifi

Konteyner g'oyasi Docker dan ancha oldin paydo bo'lgan. 1979-yilda Unix ga chroot qo'shildi - u jarayonning ildiz papkasini o'zgartirar edi. Keyin FreeBSD jails, Solaris Zones, Google da yozilgan cgroups va LXC keldi.

Lekin bu vositalardan foydalanish qiyin edi. Har birini qo'lda sozlash kerak, tayyor obrazni boshqaga berish yo'li yo'q edi.

2013-yilning mart oyida Solomon Hykes PyCon konferensiyasida besh daqiqalik chiqish qildi. U o'sha paytdagi kompaniyasi - dotCloud ichida yozilgan vositani ko'rsatdi. Vosita LXC ustiga ikkita oddiy narsa qo'shgan edi: obraz formati va uni almashish usuli.

Shu ikki qo'shimcha hamma narsani o'zgartirdi.

Konteynerlar tarixi 1979 chroot ildizni almashtirish 2000 FreeBSD jails to'liqroq ajratish 2008 cgroups + LXC yadroda konteyner 2013 Docker obraz + almashish 2015 OCI standarti format bir kompaniyaniki emas 2017 containerd CNCF ga topshirildi Docker texnologiyani ixtiro qilmadi - uni ISHLATSA BO'LADIGAN qildi. Bugun obraz formati OCI standarti, Docker esa uning eng mashhur amalga oshirilishi.
Asosiy hissa - texnologiya emas, undan foydalanish qulayligi
Docker, OCI va boshqalar

Bugun konteyner obrazi formati OCI (Open Container Initiative) standarti bilan belgilanadi. U hech qaysi kompaniyaga tegishli emas.

Shuning uchun Docker da qurilgan obraz Podman, containerd yoki Kubernetes da ham ishlaydi.

Siz Docker ni o'rganasiz, lekin bilimingiz faqat Docker ga bog'lanib qolmaydi.

Birinchi konteyner #

Nazariya yetarli. Docker to'g'ri ishlayotganini tekshiramiz:

Terminal
docker --version
docker run --rm hello-world
Natija
Docker version 29.8.0, build 88096ef
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pulling fs layer
4f55086f7dd0: Download complete
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Ikkinchi qatorga e'tibor bering: Unable to find image locally. Obraz kompyuterda yo'q edi, Docker uni avtomatik yuklab oldi.

Ikkinchi marta ishga tushirsangiz, bu qatorlar bo'lmaydi - obraz allaqachon mahalliy saqlanadi.

Chiqishning o'zi ham qiziq: u Docker qanday ishlashini to'rt qadamda tushuntirib beradi. Mijoz (docker buyrug'i) demon ga murojaat qiladi, demon obrazni yuklab oladi, undan konteyner yaratadi va chiqishni mijozga qaytaradi.

Nima uchun bu tez? #

Terminal
docker run --rm alpine:3.21 echo salom
Natija
salom

Bu buyruq 699 millisekund ichida bajarildi - ya'ni bir soniyadan kam. Virtual mashinani ko'tarish uchun o'nlab soniya kerak bo'lardi.

Sabab oddiy: ko'tariladigan yadro yo'q. Docker shunchaki yangi namespace lar yaratib, jarayonni ishga tushiradi.

Hajmi ham shunga mos:

Terminal
docker images alpine:3.21 --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
docker images hello-world --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
Natija
alpine:3.21    12.2MB
hello-world:latest    25.9kB

Butun ishlaydigan Linux muhiti - 12 megabayt. Eng kichik virtual mashina obrazi ham kamida yuz barobar kattaroq.

Obraz va konteyner - bir xil narsa emas #

Bu darslikdagi eng muhim tushuncha, shuning uchun boshidanoq aniq qilib olamiz.

Obraz (image)Konteyner (container)
NimaO'zgarmas shablonIshlayotgan nusxa
O'xshatishDastur fayliIshga tushgan jarayon
Nechta bo'ladiBittaBir obrazdan yuzlab
O'zgaradimiYo'qHa, lekin o'chirilsa yo'qoladi

Oxirgi qatorni sinab ko'ramiz:

Terminal
docker run --rm alpine:3.21 sh -c 'echo test > /tmp/f; cat /tmp/f'
docker run --rm alpine:3.21 cat /tmp/f
Natija
test
cat: can't open '/tmp/f': No such file or directory

Birinchi konteyner faylni yaratdi va muvaffaqiyatli o'qidi. Ikkinchisi - yangi konteyner - o'sha faylni topa olmadi.

Ikkala buyruq ham bir xil obrazdan boshlandi, lekin har biri o'z yozish qatlamini oldi. Birinchisi --rm tufayli o'chib ketdi va yozilgan hamma narsa u bilan birga yo'qoldi.

Konteyner ichiga yozilgan ma'lumot vaqtinchalik

Konteyner o'chirilsa, uning ichida yozilgan hamma narsa yo'qoladi.

Bu xato emas - bu atayin shunday qilingan. Konteyner "tashlab yuboriladigan" bo'lishi kerak.

Saqlanishi kerak bo'lgan ma'lumot uchun hajm (volume) ishlatiladi - buni 8-bobda o'rganamiz.

Qachon konteyner kerak emas? #

Konteyner har bir masalaning yechimi emas.

  • Bitta oddiy statik sayt - nginx ni to'g'ridan-to'g'ri o'rnatish osonroq
  • Ish stoli ilovasi - konteyner server ilovalari uchun
  • Juda yuqori unumdorlik talab qiladigan tizim - qo'shimcha qatlam har doim biroz narx qo'shadi
  • Jamoada hech kim bilmasa - o'rganishga vaqt kerak
Konteyner qachon foyda beradi?
  • Ilovada ko'p bog'liqlik bor va ularni o'rnatish murakkab
  • Bir serverda turli versiyali ilovalar kerak
  • Bir xil muhit dasturchi, sinov va ishlab chiqarishda kerak
  • Ilovani tez ko'paytirish (masshtablash) kerak
  • CI/CD da har safar toza muhitdan boshlash kerak

Xulosa #

  • Konteyner - ilova va uning bog'liqliklari birga joylangan to'plam; u istalgan joyda bir xil ishlaydi.
  • Konteyner virtual mashina emas: u host yadrosini baham ko'radi, shuning uchun megabaytlarda va soniyaning ulushida.
  • uname -r hostda va konteynerda bir xil natija beradi - bu eng oson isbot.
  • Konteyner uchta yadro imkoniyatiga tayanadi: namespace (nimani ko'radi), cgroup (qancha resurs oladi), union fayl tizimi (qatlamlar).
  • Konteyner ichidagi jarayon PID 1 bo'ladi va hostdagi jarayonlarni ko'rmaydi.
  • Docker texnologiyani ixtiro qilmadi - chroot, jails va LXC undan oldin bor edi. U obraz formati va almashish usulini qo'shdi.
  • Bugun format OCI standarti - obrazingiz Podman va Kubernetes da ham ishlaydi.
  • Obraz o'zgarmas shablon, konteyner esa uning ishlayotgan nusxasi; bir obrazdan yuzlab konteyner ochiladi.
  • Konteyner ichiga yozilgan ma'lumot o'chirilganda yo'qoladi - saqlash uchun hajm kerak.
  • Konteyner har doim ham kerak emas: oddiy statik sayt yoki ish stoli ilovasi uchun u ortiqcha murakkablik.
Amaliy topshiriq
  1. docker --version bilan o'rnatilgan versiyani tekshiring.
  2. docker run --rm hello-world ni ikki marta ishga tushiring va chiqishdagi farqni toping.
  3. uname -r ni hostda va alpine:3.21 konteynerida solishtiring.
  4. Konteyner ichida ps -e ni bajaring - nechta jarayon ko'rinadi?
  5. ls / ni hostda va konteynerda solishtirib, farqni yozing.
  6. docker images bilan obrazlar hajmini ko'ring.
  7. Konteynerda fayl yarating, chiqing va yangi konteynerda uni qidiring - natijani tushuntiring.
  8. docker run --rm alpine:3.21 cat /etc/os-release ni bajaring - qaysi distributiv ko'rinadi?
  9. Hozirgi loyihangizni konteynerga joylash foyda berarmidi? Uchta sabab yozing.
  10. Konteyner va virtual mashina farqini o'z so'zlaringiz bilan besh qatorda tushuntiring.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.