06 β Docker nima: konteynerlar¶
β¬ οΈ Oldingi: 05 β Ilovani qo'lda serverga joylash Β· π README Β· Keyingi: 07 β Konteyner bilan ishlash β‘οΈ
Bu bobda: 05-bobdagi "menda ishlaydi" og'rig'idan boshlab Docker'ning yechimini ko'ramiz β ilova va uning barcha bog'liqliklarini bitta portativ paketga jamlash; konteyner va virtual mashina o'rtasidagi arxitektura farqini (yadro bo'lishish, namespace/cgroups izolyatsiyasi) jadval bilan taqqoslaymiz; image, container va registry uchta asosiy tushunchasini o'xshatishlar bilan ochamiz; Docker arxitekturasini (CLI β daemon β registry) va
docker runortida nima bo'lishini ko'rsatamiz; Docker'ni o'rnatibdocker run hello-worldbilan birinchi konteynerni ishga tushiramiz; va nega Docker butun DevOps zanjirining poydevori ekanini tushunamiz.
Muammo: "menda ishlaydi-ku!"¶
05-bobda ilovani VPS'ga qo'lda joyladik va og'riqni o'z terimizda his qildik. Eng achchiq lahzasini eslang: laptopda ilova bekam-ko'st ishlaydi, lekin serverda ishga tushganda β qulaydi.
Sabablari tanish:
- Laptopda Node.js 22, serverda 18. Ilova yangi sintaksisni ishlatadi β server uni tushunmaydi.
- Laptopda kerakli kutubxona o'rnatilgan, serverda yo'q.
- Operatsion tizim boshqacha: laptopda Windows/macOS, serverda Ubuntu β yo'l ajratuvchilari, muhit o'zgaruvchilari, fayl ruxsatlari farq qiladi.
- "U fayl" lokalda bor edi, lekin Git'ga qo'shilmagan ekan.
Natija β dasturchining mashhur jumlasi: "Menda ishlaydi-ku!" (works on my machine). Muammo ilovada emas β muhitda. Ilova o'zi yashayotgan muhitga bog'lanib qolgan, lekin biz faqat kodni ko'chirdik, muhitni emas.
π Asosiy g'oya. Ilovaning faqat kodini emas, balki butun ishlash muhitini β til versiyasi, kutubxonalar, tizim paketlari, sozlamalar β birga olib yursak, "qaysi mashinada" degan savol yo'qoladi. Aynan shuni Docker qiladi.
Yechim: ilovani muhiti bilan paketlash¶
Docker ilovani va uning barcha bog'liqliklarini (dependencies) bitta yengil, izolyatsiyalangan, portativ paketga β konteynerga β joylaydi. Bu paketning ichida ilovangiz kutgan hamma narsa bor: to'g'ri til versiyasi, kerakli kutubxonalar, kerakli tizim utilitalari.
Yaxshi o'xshatish β dengiz konteyneri. Ilgari yuklarni har xil shaklda kemaga ortishar, har biriga alohida yondashuv kerak edi. Standart metall konteyner kashf qilingach, ichida nima borligi (kiyim, mashina, banan) ahamiyatsiz bo'lib qoldi β har qanday kema, poyezd, kran bir xil ishlaydi. Docker konteyneri ham xuddi shunday: ichidagi ilova Node, Python, PHP yoki Java ekani Docker'ni qiziqtirmaydi β tashqi "shakl" har joyda bir xil.
Konteyner ichida ishlaydigan narsa β laptopingizda ham, hamkasbingiz mashinasida ham, test serverida ham, production serverida ham aynan bir xil ishlaydi. "Menda ishlaydi" endi "hamma joyda ishlaydi"ga aylanadi.
π‘ Konteyner butun operatsion tizimni o'z ichiga olmaydi β bu uni yengil qiladi. U faqat ilova va uning bog'liqliklarini oladi, OS yadrosini esa host mashinadan ijaraga oladi. Bu farq keyingi bo'limning markazida.
Konteyner vs virtual mashina¶
Docker'dan oldin "izolyatsiyalangan muhit" deganda virtual mashina (VM) tushunilardi. VM ham ilovani ajratadi, lekin butunlay boshqacha β og'irroq β usulda. Farqni arxitektura darajasida ko'raylik.
Quyidagi diagrammada chap tomonda virtual mashinalar steki, o'ng tomonda Docker konteynerlari steki ko'rsatilgan β e'tibor bering, qaysi qatlam takrorlanadi va qaysisi bo'lishiladi:
Virtual mashina fizik mashina (yoki uning yadrosi) ustida gipervizor (hypervisor β VMware, VirtualBox, KVM) ishlaydi. Har bir VM o'zining to'liq mehmon operatsion tizimini (guest OS β to'liq Linux yoki Windows, yadrosi bilan) olib yuradi. Uchta ilova kerak bo'lsa β uchta to'liq OS ko'tarasiz.
Konteynerda gipervizor ham, mehmon OS ham yo'q. Konteynerlar host mashinaning bitta yadrosini bo'lishadi (share). Docker Engine ularni shu bitta yadro ustida bir-biridan ajratib turadi. Izolyatsiya ikkita Linux yadrosi mexanizmi bilan amalga oshadi:
- namespaces β har bir konteyner alohida "ko'rinish" oladi: o'ziga xos protsesslar ro'yxati, tarmoq, fayl tizimi nuqtai nazari. Konteyner o'zini yolg'iz mashinada deb hisoblaydi.
- cgroups (control groups) β har bir konteyner qancha CPU, xotira, I/O ishlatishi mumkinligini cheklaydi.
π Yadro bo'lishilgani uchun konteynerlar megabaytlarda o'lchanadi va soniyalarda (ko'pincha millisoniyalarda) ishga tushadi; VM esa gigabaytlarda o'lchanadi va daqiqalarda yuklanadi.
| Xususiyat | Virtual mashina | Konteyner (Docker) |
|---|---|---|
| Izolyatsiya birligi | To'liq mehmon OS + yadro | Protsess (namespace + cgroups) |
| Yadro | Har VM o'zinikini olib yuradi | Host yadrosini bo'lishadi |
| Hajm | Gigabaytlar (GB) | Megabaytlar (MB) |
| Ishga tushish | Daqiqalar | Soniya / millisoniya |
| Zichlik (bitta serverda) | O'nlab | Yuzlab / minglab |
| Ko'tarish yuki (overhead) | Yuqori (to'liq OS) | Past (faqat ilova) |
| Izolyatsiya kuchi | Kuchliroq (alohida yadro) | Yetarli (jarayon darajasida) |
β οΈ Konteyner VM'dan xavfsizroq emas β yadro bo'lishilgani sababli izolyatsiya VM darajasida qattiq emas. Lekin amaliyotda deyarli barcha ilovalar uchun bu izolyatsiya yetarli, foydasi esa juda katta. Konteyner VM'ni o'rnini bosmaydi β ko'pincha VM (yoki bulutdagi server) ichida Docker ishlaydi.
π‘ Linux yadrosi konteynerning sharti bo'lgani uchun, Windows va macOS'da Docker ichida kichik Linux virtual mashinasi ishlaydi va konteynerlar shu yadroni bo'lishadi. Shuning uchun Windows'da Docker Desktop WSL2 (Linux quyi tizimi) ustida turadi.
Uchta asosiy tushuncha: image, container, registry¶
Docker bilan ishlashda uchta so'z doimo qaytariladi. Ularni hozir mustahkam yodda saqlab qolsangiz, qolgani osonlashadi.
Image β o'zgarmas shablon¶
Image (obraz) β ilova va uning muhitining o'zgarmas (read-only) shabloni. Uni:
- retsept deb tasavvur qiling β ovqat tayyorlash uchun aniq yo'riqnoma va masolliklar ro'yxati;
- yoki dasturlashdan class (sinf) deb β ob'ekt yaratish uchun chizma.
Image bir marta tuziladi va o'zgarmaydi. Ichida: asos OS qatlami (masalan Alpine Linux), til runtime'i (Node.js), ilovangiz kodi va bog'liqliklari.
βΉοΈ Image qatlamlardan (layers) tashkil topadi β har bir qadam (asos, kutubxonalar, kod) alohida qatlam. Qatlamlar boshqa image'lar bilan bo'lishiladi va keshlanadi, shu sababli image'lar tez tuziladi va kam joy egallaydi. Qatlamlarni 08-bobda chuqur ochamiz β hozir shuni bilsangiz yetadi: image = qatlamlar stegi.
Container β ishlaydigan nusxa¶
Container (konteyner) β image'dan ishga tushirilgan jonli nusxa. Davom etamiz:
- agar image = retsept bo'lsa, container = shu retsept bo'yicha pishirilgan taom;
- agar image = class bo'lsa, container = shu class'dan yaratilgan object (nusxa, instance).
Bitta image'dan bir nechta konteyner ishga tushirishingiz mumkin β bir retseptdan ko'p taom kabi. Har bir konteyner o'zining yozish mumkin bo'lgan qatlamiga ega, lekin asos image o'zgarmasligicha qoladi.
IMAGE (o'zgarmas shablon β 1 dona)
|
docker run docker run docker run
| | |
container 1 container 2 container 3 (jonli nusxalar)
Registry β image'lar ombori¶
Registry (registr) β image'lar saqlanadigan va almashinadigan markaziy ombor. Git uchun GitHub nima bo'lsa, Docker image'lar uchun registry shu.
- Docker Hub (
hub.docker.com) β eng katta, ochiq registry.nginx,node,pythonkabi rasmiy image'lar shu yerda. - GHCR β GitHub Container Registry (
ghcr.io). O'z image'laringizni GitHub hisobingizga bog'lab saqlash uchun qulay; CI/CD bilan zo'r ishlaydi (buni 14-bobda ishlatamiz).
Quyidagi diagramma uchchala tushunchaning bog'lanishini ko'rsatadi β registry'dan image'ni pull qilamiz, image'dan run bilan konteyner tug'iladi:
π Uchovini bitta jumlada: registry'da image saqlanadi β uni docker pull bilan tortib olasiz β docker run bilan undan container ishga tushadi.
Docker arxitekturasi: orqada nima bo'ladi¶
Siz docker buyrug'ini terganingizda aslida ikkita qism gaplashadi. Diagrammada oqimni kuzating:
- Docker CLI (client) β siz teradigan
docker ...buyrug'i. U faqat so'rov yuboradi, hech narsa ishga tushirmaydi. - Docker daemon (
dockerd) β fonda doimo ishlaydigan xizmat. Asl ish shu yerda: image'larni quradi/saqlaydi, konteynerlarni ishga tushiradi va boshqaradi, registry bilan gaplashadi. CLI daemon'ga REST API orqali murojaat qiladi. - Registry β daemon kerakli image'ni mahalliy topa olmasa, registry'dan tortib oladi.
Misol uchun docker run nginx terganingizda orqada quyidagilar ketma-ket bo'ladi:
- CLI daemon'ga "
nginximage'idan konteyner ishga tushir" so'rovini yuboradi. - Daemon
nginximage'ini mahalliy qidiradi. Topa olmasa β registry'dan (Docker Hub)pullqiladi. - Daemon shu image'dan yangi konteyner yaratadi.
- Daemon konteynerga namespace/cgroups izolyatsiyasini berib, ichidagi protsessni ishga tushiradi.
- Konteyner chiqishini (log) CLI'ga qaytaradi.
βΉοΈ "Daemon ishlamayapti" (Cannot connect to the Docker daemon) xatosini ko'rsangiz β bu CLI daemon'ni topa olmagani; Docker Desktop'ni (yoki Linux'da dockerd xizmatini) ishga tushiring.
O'rnatish va birinchi konteyner¶
Docker'ni o'rnatish¶
- Windows / macOS: Docker Desktop β grafik ilova. Windows'da WSL2 ni yoqishni so'raydi (Linux yadrosi uchun). O'rnatib, ishga tushiring β yuqori panelda Docker belgisi turg'un bo'lsa, daemon tayyor.
- Linux: Docker Engine β to'g'ridan-to'g'ri serverga. Ubuntu'da rasmiy repozitoriydan o'rnatish tavsiya etiladi (paket menejeridagi eski versiya emas):
# Ubuntu uchun (rasmiy convenience skript β production'da bosqichma-bosqich qo'llanmani afzal ko'ring)
curl -fsSL https://get.docker.com | sh
# Joriy foydalanuvchini docker guruhiga qo'shing (sudo'siz ishlatish uchun)
sudo usermod -aG docker $USER
# Keyin tizimdan chiqib qayta kiring
β οΈ Linux'da sudo siz docker ishlatish uchun foydalanuvchini docker guruhiga qo'shasiz. Bu guruh aslida root'ga teng huquq beradi (daemon root bilan ishlaydi), shuni xavfsizlik nuqtai nazaridan yodda tuting.
O'rnatilganini tekshiring:
π Docker Engine 29.x β joriy (2026) versiya. Versiya raqami biroz farq qilishi normal; muhimi docker --version xatosiz versiyani ko'rsatishi.
Birinchi konteyner: hello-world¶
Docker'ning rasmiy minimal test image'ini ishga tushiramiz. Bu image hech narsa qilmaydi β faqat bitta xabar chiqaradi va to'xtaydi, demak xavfsiz:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:96498ffd522e70807ab6384a5c0485a79b9c7c08ca79ba08623edcad1054e62d
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.
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.
Bu chiqishni e'tibor bilan o'qing β Docker o'zining ishlash mantig'ini sizga aytib bermoqda! Birinchi qator (Unable to find image ... locally) β daemon image'ni mahalliy topa olmadi, shuning uchun Docker Hub'dan pull qildi. Keyin yuqorida ko'rgan to'rt qadam aynan ro'y berdi. Tabriklaymiz β birinchi konteyneringiz ishladi.
π‘ Ikkinchi marta docker run hello-world qilsangiz, image allaqachon mahalliy bo'lgani uchun Pulling ... qatorlari bo'lmaydi va konteyner darhol ishga tushadi.
Haqiqiy konteyner: nginx web-server¶
hello-world chiqarib to'xtadi. Endi fonda yashaydigan haqiqiy xizmatni ishga tushiramiz β Nginx web-serverini. Bu yerda yangi bayroqlar ishtirok etadi:
-d(detached) β fonda ishlasin, terminalni egallab olmasin;--name nginx-testβ konteynerga eslab qolish oson nom beramiz;-p 8088:80β host'ning8088-portini konteyner ichidagi80-portga ulaymiz (chapda host, o'ngda konteyner).
Unable to find image 'nginx:1.27-alpine' locally
1.27-alpine: Pulling from library/nginx
Status: Downloaded newer image for nginx:1.27-alpine
351352bd7b2a350dfcc9ed6dec833ebe4f66b229d0bb1a7285e1f3e43cd35a25
Oxirgi uzun satr β konteynerning to'liq ID'si. Ishlab turganini ko'ramiz:
Endi brauzerda http://localhost:8088 ni oching β Nginx'ning xush kelibsiz sahifasini ko'rasiz. Terminaldan ham tekshirish mumkin:
200 β server javob bermoqda. E'tibor bering: laptopingizga Nginx o'rnatmadingiz, sozlamadingiz β bitta buyruq bilan to'liq web-server ishga tushdi. Tugatgach, konteynerni majburan to'xtatib o'chiramiz:
π nginx:1.27-alpine dagi :1.27-alpine β bu tag: aniq versiya (1.27) va kichik Alpine Linux asosida. Tag ko'rsatmasangiz Docker :latest ni oladi β production'da bu xavfli, chunki "latest" vaqt o'tib boshqa versiyaga aylanib qoladi. Versiyani har doim aniq belgilang.
β οΈ Yuqorida 8088-portni tanladik, chunki ko'p qo'llanmalardagi 8080 ko'pincha band bo'ladi. Agar bind: address already in use xatosini ko'rsangiz β port boshqa dastur tomonidan band; boshqa port tanlang (-p 9000:80).
Nega Docker DevOps'ning poydevori¶
Docker shunchaki bitta qulay vosita emas β u butun zamonaviy DevOps amaliyotining tagida turadi. Sabablari:
- Portativlik β laptop = test serveri = production. Konteyner har joyda bir xil ishlaydi, "menda ishlaydi" muammosi yo'qoladi.
- Izolyatsiya β bir serverda o'nlab ilova bir-biriga xalal bermay yashaydi. Biriga Node 18, ikkinchisiga Node 22 kerak bo'lsa β muammo emas, har biri o'z konteynerida.
- Takrorlanuvchanlik (reproducibility) β image o'zgarmas, shu sababli bugun qurilgan image bir yildan keyin ham aynan o'sha tarzda ishga tushadi.
- Tez deploy β konteyner soniyalarda ishga tushadi; yangi versiyani chiqarish β yangi image'ni
pullqilib qayta ishga tushirish, xolos. - Mikroservislar poydevori β har bir kichik xizmatni alohida konteynerga joylash tabiiy bo'ladi.
- CI/CD va Kubernetes poydevori β keyingi boblarda ko'radigan GitHub Actions pipeline'lari image quradi, Kubernetes esa minglab konteynerni orkestratsiya qiladi. Ikkalasi ham Docker tushunchalariga (image, container, registry) tayanadi.
Shuning uchun bu kitobda Docker β markaziy. Endi konteynerlarni qanday boshqarishni β to'xtatish, log ko'rish, ichiga kirish, port va muhit o'zgaruvchilarini berishni β keyingi bobda batafsil o'rganamiz.
06-bob mashqlari¶
Quyidagi mashqlar uchun Docker o'rnatilgan va daemon ishlab turishi kerak. Har bir buyruqni o'zingiz tering va chiqishini kuzating.
Oson¶
- (Oson)
docker --versionni ishga tushiring va versiyani qayd eting. Docker Engine 29.x ekanini tasdiqlang. - (Oson)
docker run hello-worldni ishga tushiring. Chiqishdagi 4 qadamni o'qing va ularni Docker arxitekturasi (CLI β daemon β registry) bilan bog'lang. - (Oson) O'z so'zlaringiz bilan image va container o'rtasidagi farqni tushuntiring. Bitta image'dan nechta container ishga tushirsa bo'ladi?
- (Oson) Konteyner virtual mashinadan nimasi bilan yengilroq? Bitta jumlada (yadro bilan bog'lab) ayting.
O'rta¶
- (O'rta) Quyidagi tushunchalarni to'g'ri o'xshatishga ulang: image / container / registry β retsept / taom / oziq-ovqat do'koni. Nega aynan shunday?
-
(O'rta)
docker run -d --name web -p 8088:80 nginx:1.27-alpineni ishga tushiring,docker psbilan tekshiring, brauzerda yokicurlbilan ochib ko'ring, so'ngdocker rm -f webbilan o'chiring.Yechim
docker run -d --name web -p 8088:80 nginx:1.27-alpine docker ps curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8088 # 200 qaytishi kerak docker rm -f web-dkonteynerni fonda ishlatadi,-p 8088:80host portini (8088) konteyner portiga (80) bog'laydi.curl200qaytarsa β Nginx javob bermoqda.docker rm -fishlab turgan konteynerni majburan to'xtatib o'chiradi. -
(O'rta)
-p 8088:80dagi ikki raqamdan qaysi biri host porti, qaysi biri konteyner porti? Agar8088band bo'lsa nima xato chiqadi va qanday hal qilasiz?Yechim
Format
host:container, ya'ni chapdagi8088β host (sizning mashinangiz) porti, o'ngdagi80β konteyner ichidagi port. Agar host porti band bo'lsa,dockerbind: address already in use(yokiOnly one usage of each socket address ...) xatosini beradi. Yechim β bo'sh boshqa port tanlash, masalan-p 9000:80, so'nghttp://localhost:9000ga kirish. -
(O'rta)
nginx:1.27-alpineifodasidaginginx,1.27vaalpineqismlari nimani anglatadi? Nega tag'ni:latestqoldirgandan ko'ra aniq versiya yozish yaxshi?Yechim
nginxβ image nomi (repozitoriy);1.27β versiya;alpineβ kichik Alpine Linux asosi (yengil image). To'liq:nginx:1.27-alpineβ bu tag.:latestvaqt o'tishi bilan boshqa (yangi) versiyaga ishora qila boshlaydi, shu sababli bugun ishlagan deploy ertaga kutilmaganda boshqacha versiyani tortib, sinishi mumkin. Aniq versiya β takrorlanuvchanlik (reproducibility) kafolati.
Qiyin¶
-
(Qiyin)
docker run hello-worldterganingizda CLI, daemon va registry o'rtasida nima yuz berishini 4-5 qadamda batafsil yozing.Yechim
- CLI (
docker) daemon'ga REST API orqali "hello-world:latestimage'idan konteyner ishga tushir" so'rovini yuboradi. - Daemon (
dockerd) image'ni mahalliy keshda qidiradi. Topa olmasa β - daemon registry'dan (Docker Hub) image'ni
pullqiladi (qatlamlarni yuklaydi). - Daemon shu image'dan yangi container yaratadi va unga namespace/cgroups izolyatsiyasini beradi.
- Daemon konteyner ichidagi protsessni ishga tushiradi; protsess xabar chiqaradi va tugaydi; daemon chiqishni CLI'ga, CLI esa terminalga qaytaradi.
- CLI (
-
(Qiyin) Konteyner va VM stack'larini yodingizdan chizing: ikkalasida ham eng pastda nima turadi, qaysi qatlam VM'da takrorlanadi-yu konteynerda bo'lishiladi?
Yechim
VIRTUAL MASHINA KONTEYNER (Docker) ---------------- ------------------ App A | App B | App C App A | App B | App C GuestOS|GuestOS|GuestOS --- (mehmon OS yo'q) --- -------- Hypervisor ------- ------ Docker Engine ------ -------- Host OS ---------- ------ Host OS (1 yadro) -- -------- Hardware --------- ------ Hardware -----------Eng pastda ikkalasida ham Hardware va Host OS. VM'da har ilova o'z to'liq mehmon OS'ini (guest OS, yadrosi bilan) takrorlaydi va ular gipervizor ustida turadi. Konteynerda mehmon OS umuman yo'q β barcha konteynerlar bitta host yadrosini bo'lishadi, Docker Engine ularni namespace/cgroups bilan ajratadi. Shu sababli konteyner yengilroq va tezroq.
-
(Qiyin)
docker run nginx:1.27-alpine(bayroqsiz) vadocker run -d nginx:1.27-alpineo'rtasida terminal xulqi qanday farq qiladi? Birinchisidan qanday chiqasiz?Yechim
Bayroqsiz
docker run nginx:1.27-alpinekonteynerni frontda (attached) ishga tushiradi: Nginx loglari to'g'ridan-to'g'ri terminalga oqadi va terminal band bo'lib qoladi β konteyner ishlab turganicha boshqa buyruq tera olmaysiz. UndanCtrl+Cbilan chiqasiz (bu konteynerni to'xtatadi).-d(detached) bilan konteyner fonda ishlaydi, terminal darhol bo'shaydi va sizga konteyner ID'sini qaytaradi; loglarni keyindocker logsbilan ko'rasiz (07-bobda). -
(Qiyin) Bir hamkasbingiz "Docker konteyneri β bu yengil virtual mashina" deydi. Bu ta'rif nega texnik jihatdan noto'g'ri? Tuzating.
Yechim
Ta'rif noto'g'ri, chunki konteyner virtual mashina emas β uning ichida alohida operatsion tizim yadrosi yo'q. VM gipervizor ustida o'zining to'liq mehmon OS'ini (yadrosi bilan) ishlatadi; konteyner esa host mashinaning yadrosini bo'lishadi va faqat jarayon darajasida (namespace + cgroups bilan) izolyatsiyalanadi. To'g'ri ta'rif: konteyner β host yadrosini bo'lishadigan, izolyatsiyalangan jarayon (va uning fayl tizimi), "yengil VM" emas. Aynan yadroni bo'lishish konteynerni MB'larda va soniyalarda ishlaydigan qiladi.
-
(Qiyin) Konteynerlar VM'dan xavfsizlik jihatidan kuchsizroq, deyiladi. Nega? Bu amaliyotda Docker'dan voz kechishni anglatadimi?
Yechim
Konteynerlar bitta host yadrosini bo'lishgani uchun, yadroda jiddiy zaiflik bo'lsa β nazariy jihatdan bir konteyner host'ga yoki boshqa konteynerga "chiqib" ketishi (escape) mumkin; VM esa alohida yadro bilan qattiqroq devor quradi. Lekin bu Docker'dan voz kechish demas: amaliyotda namespace/cgroups izolyatsiyasi aksariyat ilovalar uchun yetarli, foydasi (portativlik, tezlik, zichlik) esa juda katta. Xavfsizlikni image skani (Trivy), eng kam huquq, ishonchli base image va yangilab turish bilan kuchaytiramiz (bularni keyingi boblarda ko'ramiz). Yuqori izolyatsiya talab qilinsa, konteynerlarni alohida VM'lar ichida ishlatish odatiy yondashuv.
β¬ οΈ Oldingi: 05 β Ilovani qo'lda serverga joylash Β· π README Β· Keyingi: 07 β Konteyner bilan ishlash β‘οΈ