Docker nima? Konteynerlar
Tasavvur qiling: siz ilovangizni yozdingiz, o'z kompyuteringizda mukammal ishlaydi. Ammo uni hamkasbingizga yoki serverga jo'natsangiz โ ishlamaydi. Docker aynan shu muammoni hal qiladi: u ilovani barcha kerakli narsalari bilan birga konteyner ichiga o'raydi, shunda u har qanday joyda bir xil ishlaydi. Ushbu darsda Docker nima ekanini, konteyner va virtual mashina farqini hamda asosiy tushunchalarni chuqur o'rganamiz.
Muammo: 'mening kompyuterimda ishlaydi'
Dasturchilar orasida mashhur ibora bor: 'It works on my machine' โ ya'ni 'mening kompyuterimda ishlaydi'. Bu shunchaki hazil emas, balki real muammo. Nega bir xil kod bir joyda ishlab, boshqa joyda ishlamaydi?
- Sizda Node.js 20-versiyasi, serverda esa 16-versiyasi bo'lishi mumkin;
- Sizda ma'lumotlar bazasi o'rnatilgan, serverda esa yo'q;
- Operatsion tizim boshqacha (siz macOS, server Linux);
- Muhit o'zgaruvchilari (environment variables) yoki kutubxona versiyalari farq qiladi.
Har bir kompyuter โ bu o'ziga xos, boshqacha sozlangan muhit. Ilovani yangi joyga ko'chirganda, uni yana qo'lda sozlash kerak bo'ladi. Bu vaqt oladi va xatolarga to'la.
Yechim: konteyner
Konteyner (container) โ bu ilova va uning ishlashi uchun zarur bo'lgan hamma narsa (kod, kutubxonalar, ishga tushirish muhiti, sozlamalar) birga o'ralgan yengil, izolyatsiyalangan paket. Konteyner o'z ichida to'liq muhitni olib yuradi.
Yuk tashish konteynerini tasavvur qiling: ichida nima borligidan qat'i nazar, u standart o'lchamda va har qanday kema, poyezd yoki yuk mashinasiga mos keladi. Docker konteyneri ham xuddi shunday โ ichidagi ilovadan qat'i nazar, u Docker o'rnatilgan har qanday kompyuterda bir xil ishlaydi.
Virtual mashina va konteyner farqi
Ko'pchilik virtual mashina (VM) haqida eshitgan. VM ham izolyatsiyalangan muhit yaratadi, ammo u butunlay boshqa yondashuv. Farqni tushunish muhim.
Virtual mashina โ bu haqiqiy kompyuter ichida ishlaydigan to'liq boshqa kompyuter. Uning o'z operatsion tizimi (mehmon OS), o'z virtual xotirasi va disklari bor. Bir VM bir necha gigabayt joy egallaydi va yuklanishi bir necha daqiqa vaqt oladi.
Konteyner esa asosiy operatsion tizimning o'zagini (kernel) baham ko'radi. U alohida OS ko'tarib yurmaydi โ faqat ilova va uning bog'liqliklarini o'raydi. Shu sababli konteyner o'nlab megabaytdan iborat bo'lishi va soniyalarda ishga tushishi mumkin.
- VM: og'ir (GB'larda), sekin yuklanadi (daqiqalar), har biri to'liq OS'ga ega;
- Konteyner: yengil (MB'larda), tez ishga tushadi (soniyalar), asosiy OS o'zagini baham ko'radi;
- Bitta kompyuterda bir vaqtning o'zida bir nechta VM ishlatish qiyin, ammo o'nlab konteynerni bemalol ishga tushirish mumkin.
Image (obraz) va container (konteyner) farqi
Docker'da eng chalkash, ammo eng muhim tushunchalar โ image va container. Ular bir-biriga bog'liq, lekin bir xil narsa emas.
Image (obraz) โ bu shablon, ya'ni 'qolip'. U ilovaning muzlatilgan holati: kod, kutubxonalar va sozlamalarning o'zgarmas nusxasi. Image'ni disk fayl (masalan, dastur o'rnatuvchisi) deb tasavvur qiling โ u shunchaki turadi va o'zi ishlamaydi.
Container (konteyner) โ bu image'dan ishga tushirilgan tirik nusxa. Image'ni ishga tushirganingizda undan konteyner tug'iladi. Bitta image'dan bir nechta konteyner yaratish mumkin โ xuddi bitta o'rnatuvchi fayldan dasturni bir necha marta o'rnatgandek.
- Image โ o'zgarmas shablon (retseptga o'xshaydi);
- Container โ ishlab turgan nusxa (retsept bo'yicha pishirilgan taomga o'xshaydi);
- Bitta image'dan โ ko'p konteyner yaratish mumkin;
- Image diskda saqlanadi, konteyner esa xotirada ishlaydi.
class va new bilan yaratilgan obyektga o'xshaydi.Docker Hub โ image'lar ombori
Docker Hub โ bu tayyor image'lar saqlanadigan ulkan onlayn ombor (registry). Bu xuddi npm (JavaScript kutubxonalari uchun) yoki App Store (ilovalar uchun) kabi. U yerda minglab tayyor image'lar bor.
nodeโ Node.js o'rnatilgan tayyor muhit;nginxโ mashhur veb-server;postgres,mysql,mongoโ ma'lumotlar bazalari;ubuntu,alpineโ asosiy operatsion tizim image'lari.
Bu image'larni docker pull buyrug'i bilan yuklab olib, darhol ishlatishingiz mumkin. Ya'ni PostgreSQL ma'lumotlar bazasini o'rnatish uchun uni qo'lda sozlashingiz shart emas โ Docker Hub'dan tayyor image'ni olib, bitta buyruq bilan ishga tushirasiz.
Nega Docker foydali?
Endi Docker qanday amaliy foyda berishini umumlashtiraylik:
- Bir xillik: ilova har qanday joyda (noutbuk, server, bulut) bir xil ishlaydi โ 'mening kompyuterimda ishlaydi' muammosi yo'qoladi;
- Tez sozlash: yangi loyihaga qo'shilgan hamkasb bitta buyruq bilan butun muhitni ishga tushira oladi;
- Izolyatsiya: har bir ilova o'z konteynerida โ biri ikkinchisiga xalaqit bermaydi, versiyalar to'qnashmaydi;
- Yengillik: konteynerlar VM'dan ancha yengil va tez;
- Tozalik: konteynerni o'chirsangiz, hech qanday iz qolmaydi โ kompyuteringiz 'iflos' bo'lmaydi.
Ayniqsa veb-dasturlashda Docker keng qo'llaniladi: backend, ma'lumotlar bazasi, kesh va boshqa xizmatlar โ hammasi alohida konteynerlarda ishga tushiriladi va bir-biri bilan bog'lanadi.
Xulosa
- Docker 'mening kompyuterimda ishlaydi' muammosini hal qiladi โ ilovani hamma joyda bir xil ishlashini ta'minlaydi;
- Konteyner โ ilova va uning barcha bog'liqliklarini o'z ichiga olgan yengil, izolyatsiyalangan paket;
- Konteyner asosiy OS o'zagini baham ko'radi, VM esa to'liq alohida OS ko'taradi โ shuning uchun konteyner yengilroq va tezroq;
- Image โ o'zgarmas shablon (klass kabi), container โ undan ishga tushirilgan tirik nusxa (obyekt kabi);
- Docker Hub โ tayyor image'lar ombori (npm yoki App Store kabi);
- Docker bir xillik, tez sozlash, izolyatsiya va tozalik keltiradi.