Mundarija (32)
- Bu darsda
- 1. Nega bu kerak?
- 2. Konteyner nima
- 2.1 Ta'rif
- 2.2 Virtual mashina bilan farqi
- 3. Ichkarida: namespace va cgroup
- 3.1 Namespace — ko'z bog'lagich
- 3.2 Cgroup — limit
- 3.3 Kernel — umumiy
- 4. Docker qanday tuzilgan
- 4.1 Uch qism: CLI, daemon va runtime
- 4.2 docker version — ikkala tomonni ko'rish
- 4.3 Docker Engine va Docker Desktop
- 5. Windows'da Docker: WSL2 ichida Linux
- 5.1 Docker Desktop qayerda ishlaydi
- 5.2 O'rnatish qadamlari
- 6. Birinchi konteyner: hello-world
- 7. Podman va boshqa vositalar
- 8. SQL qadami: bu qismda nima quramiz
- 9. Ko'p uchraydigan xatolar
- 9.1 Docker Desktop yoqilmagan
- 9.2 Buyruqdagi xato
- 9.3 Konteyner "virtual mashina" deb o'ylash
- 9.4 Virtualizatsiya o'chiq
- 10. Mashqlar
- 1-mashq (oson): bo'sh joylarni to'ldiring
- 2-mashq (o'rta): VM yoki konteyner?
- 3-mashq (qiyin): docker version chiqishini tahlil qilish
- 4-mashq: SQL qadami — Docker'ni tayyorlash
- 11. Real ishda
- Xulosa
- Manbalar
Docker konteyner nima: virtual mashinadan farqi va Docker'ni o'rnatish
Qisqacha: Konteyner — kompyuterning umumiy kernel'ida ishlaydigan, lekin boshqa dasturlardan ajratib qo'yilgan oddiy jarayon. U o'zi bilan kerakli fayllarni (kutubxonalar, sozlamalar) olib yuradi, shuning uchun har kompyuterda bir xil ishlaydi. Virtual mashinadan farqi: konteynerda alohida operatsion tizim yo'q, shuning uchun u soniyalarda ishga tushadi va kam joy oladi. Windows'da Docker Desktop konteynerlarni WSL2 ichidagi Linux'da ishga tushiradi.
Bu darsda
- "Menda ishlaydi" muammosini va konteyner uni qanday yechishini tushuntira olasiz.
- Konteyner va virtual mashina farqini sxema bilan ko'rsata olasiz.
- Namespace va cgroup nima qilishini haqiqiy chiqish orqali ko'rasiz.
- Docker Engine, Docker CLI va Docker Desktop farqini bilasiz,
docker versionchiqishini o'qiysiz. - Docker'ni o'rnatib,
docker run hello-worldbilan tekshira olasiz; Podman nima ekanini bilasiz.
Oldin bilishingiz kerak: Operatsion tizim nima: kernel, jarayon va oqim, WSL2: Windows ichida Linux, process obyekti.
1. Nega bu kerak?
25-qismda vazifalar-api ni yozdingiz. U ma'lumotni xotirada saqlardi: server o'chsa, hamma vazifa yo'qolardi. 26-qismda unga haqiqiy ma'lumotlar bazasi ulaymiz — PostgreSQL 18.
Bazani o'rnatishning bir necha yo'li bor. To'g'ridan-to'g'ri Windows'ga o'rnatsa bo'ladi. Lekin jamoada ishlaganda muammo chiqadi:
- Sizda PostgreSQL 18, hamkasbingizda 16, serverda 17. Bitta so'rov uch joyda uch xil ishlaydi.
- Bir loyihaga 16-versiya kerak, boshqasiga 18. Ikkalasini bitta kompyuterga o'rnatish — bosh og'riq.
- Yangi xodim kelsa, birinchi kuni o'rnatish bilan o'tadi.
Dasturchilar bu holatni bitta gap bilan ataydi: "menda ishlaydi" (works on my machine). Kod sizda ishlaydi, serverda — yo'q, chunki muhit boshqa.
Hayotiy o'xshatish: dengiz porti. Yuz yil oldin har yuk o'z qopida, o'z qutisida tashilardi. Har birini alohida usulda ko'tarish kerak edi. Keyin standart temir konteyner chiqdi. Ichida nima borligi — mebelmi, mevami — kranga farqi yo'q. Kran har qanday konteynerni bir xil ko'taradi. Dasturiy konteyner ham shunday: ichida PostgreSQL yoki Node ilova bo'lsa ham, Docker uni bir xil buyruq bilan ishga tushiradi.
Bu qismning dastlabki uch darsi Docker'ning asoslari: konteyner nima, kundalik buyruqlar va ma'lumotni saqlash. To'rtinchi darsdan SQL boshlanadi. Docker'ning qolgan qismi (Dockerfile, Compose, deploy) 33-qismda.
Maslahat: Bu qismdagi buyruqlar ostida «Ishga tushir» tugmasi yo'q — ularni o'z terminalingizda yozasiz. Ostidagi chiqishlarni biz o'zimiz ishga tushirib oldik: Windows 11, Docker Desktop 4.94.0 (engine 29.8.2), PostgreSQL 18.6. Sizdagi ID, sana va vaqt boshqacha bo'ladi — bu normal.
2. Konteyner nima
2.1 Ta'rif
Konteyner (container) — boshqa dasturlardan ajratib qo'yilgan jarayon. U o'z fayllarini, o'z tarmog'ini va o'z jarayonlar ro'yxatini ko'radi. Lekin aslida kompyuterning umumiy kernel'ida ishlaydi.
Operatsion tizim nima darsini eslang: har ishlayotgan dastur — alohida jarayon (process), kernel esa ularga CPU, xotira va diskni taqsimlaydi. Konteyner ham jarayon. Farqi — kernel unga "ko'z bog'lagich" taqib qo'yadi: jarayon atrofidagi boshqa dasturlarni ko'rmaydi va unga ajratilgan chegaradan chiqolmaydi.
Konteyner o'zi bilan kerakli fayllarni olib yuradi: PostgreSQL dasturi, uning kutubxonalari, sozlamalari. Shu fayllar to'plamini image deyiladi — uni keyingi darsda batafsil ko'ramiz. Hozircha shuni biling: bitta image'dan istalgan kompyuterda bir xil konteyner chiqadi.
2.2 Virtual mashina bilan farqi
WSL2 darsida virtual mashina (VM, virtual machine) bilan tanishgansiz: kompyuter ichidagi "soxta kompyuter", ichida to'liq operatsion tizim va o'z kernel'i bor. Konteyner ham ajratadi, lekin boshqacha.
Sxemaga pastdan yuqoriga qarang. Chapda har VM o'z operatsion tizimini ko'tarib yuradi. O'ngda konteynerlar bitta umumiy kernel'ni bo'lishadi:
flowchart BT
HW["Kompyuter: CPU, RAM, disk"] --> HV["Gipervizor"]
HV --> G1["Mehmon OS + o'z kernel'i"]
G1 --> V1["VM ichidagi ilova"]
HW --> K["Host OS: umumiy kernel"]
K --> E["Docker Engine"]
E --> C1["Konteyner: Postgres"]
E --> C2["Konteyner: Node ilova"]Gipervizor (hypervisor) — bir kompyuterda bir nechta VM'ni ishga tushiradigan dastur. Windows'da u Hyper-V deb ataladi va WSL2 shundan foydalanadi.
| Xususiyat | Virtual mashina | Konteyner |
|---|---|---|
| Ichida | to'liq OS + kernel | ilova + uning fayllari |
| Ishga tushish | o'nlab soniya, daqiqa | soniyalar |
| Hajm | gigabaytlar | o'nlab–yuzlab MB |
| Ajratish kuchi | juda kuchli (alohida kernel) | kuchli, lekin kernel umumiy |
Oxirgi qator muhim. Konteynerlar kernel'ni bo'lishadi. Kernel'dagi jiddiy zaiflik orqali konteynerdan "qochish" nazariy jihatdan mumkin. Shuning uchun begona, ishonchsiz kodni ajratishda VM kuchliroq. O'z ilovangizni ishga tushirish uchun esa konteyner yetarli va ancha yengil.
Tekshirib ko'ring: Konteyner ichida Windows dasturini ishga tushirish mumkinmi, agar host — Linux bo'lsa?
Javob
Yo'q. Konteyner host'ning kernel'idan foydalanadi, o'z kernel'i yo'q. Linux kernel'i Windows dasturini bajara olmaydi. Windows dasturi uchun Windows kernel'i kerak — ya'ni VM yoki Windows host. Shu sababli Docker Desktop Windows'da ham Linux konteynerlari uchun avval Linux VM ko'taradi (pastda ko'ramiz).
3. Ichkarida: namespace va cgroup
Linux kernel'ida konteynerni yasaydigan ikkita asosiy imkoniyat bor. Ularni sodda tushuntiramiz va haqiqiy chiqishda ko'ramiz.
3.1 Namespace — ko'z bog'lagich
Nom fazosi (namespace) — kernel jarayonga dunyoning faqat bir qismini ko'rsatadigan mexanizm. Jarayonlar, fayl tizimi, tarmoq, kompyuter nomi — har biri uchun alohida namespace bor.
Misol: oddiy kompyuterda yuzlab jarayon ishlaydi. Konteyner ichidagi jarayon esa faqat o'zini ko'radi. Buni tekshiramiz. ps — jarayonlar ro'yxatini chiqaradigan Linux buyrug'i:
docker run --rm postgres:18 ps -o pid,commNatija:
PID COMMAND
1 psKonteyner ichida faqat bitta jarayon bor — ps ning o'zi, va uning raqami (PID) — 1. Linux'da PID 1 odatda tizimni boshlaydigan birinchi jarayon. Konteyner ichida esa birinchi jarayon — siz bergan buyruq. Hostdagi yuzlab jarayon unga ko'rinmaydi.
Yana bir tekshiruv — /proc papkasida har jarayon uchun raqamli papka bo'ladi. Ularni sanaymiz (bu buyruqni Git Bash'da yozing — PowerShell ichki qo'shtirnoqlarni boshqacha uzatadi):
docker run --rm postgres:18 \
sh -c 'echo "PID: $$"; ls /proc | grep -E "^[0-9]+$" | wc -l'Natija:
PID: 1
4sh ning o'zi — PID 1. Hammasi bo'lib 4 ta raqamli papka: sh, ls, grep va wc (quvurdagi to'rt buyruq). Ko'z bog'lagich ishlayapti.
3.2 Cgroup — limit
Cgroup (control group, resurs guruhi) — kernel jarayonlar guruhiga resurs chegarasi qo'yadigan mexanizm: qancha xotira, qancha CPU, qancha disk tezligi. Namespace "nimani ko'radi"ni hal qiladi, cgroup — "qancha oladi"ni.
Konteynerga 256 MB xotira chegarasini beramiz va konteyner ichidan o'sha chegarani o'qiymiz:
docker run --rm --memory 256m postgres:18 \
cat /sys/fs/cgroup/memory.maxNatija:
268435456Hisoblab ko'ring: 256 × 1024 × 1024 = 268 435 456 bayt. Docker --memory 256m ni kernel tushunadigan baytga aylantirdi va cgroup fayliga yozdi. Konteyner shu chegaradan oshsa, kernel uning jarayonini to'xtatadi. Server'da bitta konteyner butun xotirani yeb, boshqalarni o'ldirmasligi uchun aynan shu kerak.
3.3 Kernel — umumiy
Endi eng qiziq tekshiruv. Konteyner ichida qaysi operatsion tizim bor?
docker run --rm postgres:18 cat /etc/os-releaseNatija (boshi):
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"postgres:18 image'i Debian 13 asosida qurilgan. Endi kernel'ni so'raymiz. uname -a — kernel haqida ma'lumot beradigan buyruq:
docker run --rm postgres:18 uname -aNatija:
Linux 9744e5fb3755 6.6.87.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025 x86_64 GNU/LinuxIkki narsaga qarang. Birinchidan, kernel nomida microsoft-standard-WSL2 turibdi — bu Debian'ning kernel'i emas, WSL2 ning kernel'i. Konteynerdagi fayllar Debian'niki, kernel esa host'niki. Ikkinchidan, 9744e5fb3755 — kompyuter nomi o'rnida konteyner ID'si turibdi. Bu ham namespace ishi: konteynerning o'z kompyuter nomi bor.
Tekshirib ko'ring:
--memory 512mbersangiz,memory.maxfaylida qanday son bo'ladi?
Javob
512 × 1024 × 1024 = 536 870 912. Docker m harfini mebibayt (1024 × 1024 bayt) deb tushunadi, 1 000 000 emas. Xuddi shunday g — 1024 × 1024 × 1024 bayt.
4. Docker qanday tuzilgan
4.1 Uch qism: CLI, daemon va runtime
Docker — konteynerlarni yaratish, ishga tushirish va tarqatish uchun vositalar to'plami. Siz faqat docker ... buyrug'ini yozasiz, lekin ichkarida bir nechta dastur ishlaydi:
flowchart LR
CLI["docker CLI"] -->|"API so'rovi"| D["dockerd daemon"]
D --> CT["containerd"]
CT --> R["runc"]
R --> P["Konteyner jarayoni"]- Docker CLI — terminalda yozadigan
dockerbuyrug'i. U o'zi konteyner yaratmaydi — faqat so'rov yuboradi. - Daemon (
dockerd) — fonda doim ishlab turadigan xizmat. Daemon — foydalanuvchi bilan bevosita gaplashmaydigan, fonda xizmat qiladigan dastur. CLI unga API orqali "konteyner yarat" deydi. - containerd va runc — konteynerni haqiqatda yaratadigan pastki qatlam. runc kernel'dan namespace va cgroup so'raydi.
CLI va daemon — mijoz va server. Bu HTTP server darsidagi model bilan bir xil: mijoz so'rov yuboradi, server bajaradi. Shuning uchun Docker CLI boshqa kompyuterdagi daemon'ga ham ulana oladi.
4.2 docker version — ikkala tomonni ko'rish
Bu buyruq mijozni ham, serverni ham ko'rsatadi. Chiqish uzun — birinchi o'qishda faqat ikkita OS/Arch qatorini toping:
docker versionNatija:
Client:
Version: 29.8.2
API version: 1.56
Go version: go1.26.8
Git commit: 7fc2dff
Built: Wed Sep 30 19:35:42 2026
OS/Arch: windows/amd64
Context: desktop-linux
Server: Docker Desktop 4.94.0 (241994)
Engine:
Version: 29.8.2
API version: 1.56 (minimum version 1.40)
Go version: go1.26.8
Git commit: 8af9fe3
Built: Wed Sep 30 19:32:25 2026
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.3.6
GitCommit: ee2735368117d2eb259779949d5e75cdafec9761
runc:
Version: 1.5.1
GitCommit: v1.5.1-0-g8f2685a4
docker-init:
Version: 0.19.0
GitCommit: de40ad0Eng muhim qatorlar — OS/Arch. Mijoz: windows/amd64 — CLI Windows dasturi. Server: linux/amd64 — daemon Linux'da ishlaydi. Bitta buyruq chiqishida ikki xil operatsion tizim. Pastroqda sxemadagi containerd va runc ham ko'rinib turibdi.
Qolgan qatorlar:
Version: 29.8.2— Docker Engine versiyasi. Mijoz va server versiyasi bir xil bo'lishi shart emas.API version— mijoz va server gaplashadigan til versiyasi.minimum version 1.40— server shundan eski mijozlarni ham qabul qiladi.Context: desktop-linux— CLI qaysi daemon'ga ulanayotgani. Docker Desktop o'rnatilganda shunday nomlanadi.
4.3 Docker Engine va Docker Desktop
Ikki nom ko'p chalkashtiriladi:
| Nom | Nima | Qayerda |
|---|---|---|
| Docker Engine | daemon + CLI + containerd, ochiq kodli | Linux'da to'g'ridan |
| Docker Desktop | Engine + Linux VM + grafik oyna + qo'shimchalar | Windows, macOS (Linux'da ham bor) |
Linux server'da konteyner kernel'ga to'g'ridan ulanadi — VM kerak emas. Windows va macOS'da esa Linux kernel'i yo'q. Shuning uchun Docker Desktop yashirin Linux VM ko'taradi va daemon'ni o'sha yerda ishlatadi.
Diqqat: Docker Desktop'ning litsenziyasi bor. Shaxsiy foydalanish, ta'lim va kichik kompaniyalar uchun bepul. Katta kompaniyalar (rasmiy shartlarda: 250 dan ortiq xodim yoki yillik daromadi 10 mln dollardan ko'p) pullik obuna oladi. Docker Engine'ning o'zi esa ochiq kodli va bepul. Shartlar o'zgarishi mumkin — ishga kirganda kompaniyangiz qoidasini so'rang.
5. Windows'da Docker: WSL2 ichida Linux
5.1 Docker Desktop qayerda ishlaydi
WSL2 darsida wsl --list --verbose ro'yxatida docker-desktop degan distributiv bo'lishi mumkinligini aytgan edik. Mana u:
wsl -l -vNatija:
NAME STATE VERSION
* docker-desktop Running 2docker-desktop — Docker Desktop yaratgan kichik Linux distributivi. VERSION 2 — WSL2 ustida. Daemon shu yerda ishlaydi. «Kernel — umumiy» bo'limida ko'rgan 6.6.87.2-microsoft-standard-WSL2 kernel'i — aynan shu VM'ning kernel'i.
Demak, Windows'dagi to'liq zanjir shunday: Windows'dagi docker CLI → WSL2 VM ichidagi dockerd → Linux kernel'idagi namespace va cgroup → konteyner.
5.2 O'rnatish qadamlari
Bu qadamlar Docker rasmiy hujjati bo'yicha (2026-10). Kurs mashinasida Docker oldindan o'rnatilgan edi, shuning uchun o'rnatish jarayonini biz qadamma-qadam sinab ko'rmadik.
- Talablar. Windows 10/11, 64-bit. BIOS'da virtualizatsiya yoqilgan bo'lsin (Task Manager → Performance → CPU → "Virtualization: Enabled").
- WSL2. WSL2 darsida o'rnatgansiz. Yangilab qo'ying: PowerShell'da
wsl --update. - Docker Desktop. docs.docker.com saytidan Windows uchun o'rnatuvchini yuklab oling. O'rnatishda "Use WSL 2 instead of Hyper-V" belgisi yoqilgan qolsin.
- Qayta yuklash. O'rnatuvchi so'rasa — kompyuterni qayta yuklang.
- Ishga tushirish. Start menyusidan Docker Desktop'ni oching. Shartlarni o'qib qabul qiling. Pastki chap burchakda "Engine running" yozuvi chiqquncha kuting.
- Tekshirish. Terminalda
docker version—Server:bo'limi chiqishi kerak.
Linux'da (masalan Ubuntu server) Docker Desktop shart emas: Docker Engine apt orqali o'rnatiladi. Dastur o'rnatish va paket menejerlari darsidagi usul bilan, docs.docker.com dagi Ubuntu bo'limiga qarab. macOS'da — Docker Desktop. Bu ikkalasini ham biz sinamadik.
Maslahat: Docker Desktop yoqilganda, avval
--restartsiyosati bilan yaratilgan konteynerlar ham avtomatik yonadi. Kompyuter sekinlashsa, Docker Desktop oynasida "Containers" ro'yxatiga qarang — sizga kerak bo'lmagan konteyner ishlab turgan bo'lishi mumkin.--restartni keyingi darsda ko'ramiz.
6. Birinchi konteyner: hello-world
Docker to'g'ri o'rnatilganini tekshirishning an'anaviy usuli. Chiqishda raqamlangan to'rt qadamga qarang — Docker ularda o'zi nima qilganini aytib beradi:
docker run --rm hello-worldNatija:
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/Xabarning o'zi butun darsni qisqacha aytib beradi. Tarjimasi:
- Docker mijozi (CLI) Docker daemon'iga murojaat qildi.
- Daemon
hello-worldimage'ini Docker Hub'dan yuklab oldi. - Daemon shu image'dan yangi konteyner yaratdi. Konteyner siz o'qiyotgan matnni chiqaradigan dasturni ishga tushirdi.
- Daemon chiqishni mijozga uzatdi, mijoz esa terminalingizga.
Docker Hub — image'lar saqlanadigan ochiq ombor (registry). Uni keyingi darsda ko'ramiz. --rm bayrog'i — "ish tugagach konteynerni o'chir" degani. Usiz har docker run to'xtagan konteynerni qoldiradi va ular yig'ilib boradi.
Birinchi marta ishga tushirganda, matndan oldin Unable to find image 'hello-world:latest' locally va yuklash qatorlari ham chiqadi. Biz image'ni oldindan yuklab qo'ygan edik, shuning uchun bizda ular yo'q.
Tekshirib ko'ring:
hello-worldmatni kimning ekranga chiqargan matni: Docker CLI'ningmi yoki konteyner ichidagi dasturning?
Javob
Konteyner ichidagi dasturning. U o'z "standart chiqishi"ga yozdi. Daemon shu chiqishni ushlab, CLI'ga uzatdi, CLI esa terminalga chiqardi. Xabardagi 4-qadam aynan shuni aytadi. CLI faqat vositachi.
7. Podman va boshqa vositalar
Docker — yagona konteyner vositasi emas. Konteyner image'lari va ishga tushirish qoidalari OCI (Open Container Initiative) standartida yozilgan. Shuning uchun boshqa vositalar ham o'sha image'larni ishlata oladi.
- Podman — Red Hat'ning ochiq kodli vositasi. Daemon'siz ishlaydi va sukut bo'yicha root huquqisiz (rootless) konteyner yaratadi. Buyruqlari Docker'nikiga deyarli bir xil:
podman run,podman ps. Ba'zilar hattoalias docker=podmanqilib qo'yadi. - Docker Desktop o'rniga ishlatiladigan boshqa vositalar ham bor: Rancher Desktop, macOS'da OrbStack va Colima.
Kursda Docker'ni ishlatamiz — ish e'lonlarida va hujjatlarda u eng ko'p uchraydi. Podman va qolganlarini biz sinamadik. Bu yerdagi ma'lumot ularning rasmiy hujjatlaridan.
8. SQL qadami: bu qismda nima quramiz
Bu qism davomida vazifalar ilovasi uchun PostgreSQL bazasini loyihalaysiz. 25-qismdagi xotiradagi saqlash o'rniga — jadvallar, cheklovlar, so'rovlar. Qism oxirida sxemada foydalanuvchilar, vazifalar, teglar va izohlar bo'ladi. Keyin Node orqali unga ulanib, so'rovlarni tezlashtirishni o'rganasiz.
Postgres'ni Docker konteynerida ishga tushiramiz. Sababi «Nega bu kerak?» bo'limida: sizda ham, bizda ham, keyinchalik serverda ham aynan bir xil PostgreSQL 18.6.
Bu darsda baza hali yo'q va commit qilinmaydi. Sizning vazifangiz — Docker'ni o'rnatib, ishlayotganini tekshirish (4-mashq).
9. Ko'p uchraydigan xatolar
9.1 Docker Desktop yoqilmagan
Eng ko'p uchraydigan holat: Docker o'rnatilgan, lekin Docker Desktop ishga tushirilmagan. Biz shuni ataylab qilib ko'rdik (Docker Desktop yopiq):
docker versionNatija:
Client:
Version: 29.8.2
API version: 1.56
Go version: go1.26.8
Git commit: 7fc2dff
Built: Wed Sep 30 19:35:42 2026
OS/Arch: windows/amd64
Context: desktop-linux
failed to connect to the docker API at npipe:////./pipe/dockerDesktopLinuxEngine; check if the path is correct and if the daemon is running: open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.Tarjimasi: "Docker API'ga npipe:////./pipe/dockerDesktopLinuxEngine orqali ulanib bo'lmadi; yo'l to'g'riligini va daemon ishlayotganini tekshiring: tizim ko'rsatilgan faylni topa olmadi".
Client: qismi chiqdi — CLI ishlayapti. Server: qismi yo'q — daemon javob bermadi. Named pipe (nomli quvur) — Windows'da ikki dastur gaplashadigan kanal. Daemon yoqilmaganda u kanal mavjud emas. Yechim: Docker Desktop'ni oching va "Engine running" ni kuting. docker ps va boshqa buyruqlar ham xuddi shu xatoni beradi.
9.2 Buyruqdagi xato
Docker buyruq nomini tekshiradi. Harflarni almashtirib yozsak (biz ishga tushirdik):
docker rnu hello-worldNatija:
docker: unknown command: docker rnu
Run 'docker --help' for more informationTarjimasi: "noma'lum buyruq". Buyruqlar ro'yxati — docker --help.
9.3 Konteyner "virtual mashina" deb o'ylash
"Konteynerga kirib, ichida Ubuntu o'rnatdim, endi u server" — noto'g'ri tasavvur. Konteyner — bitta asosiy jarayon atrofidagi ajratilgan muhit. Asosiy jarayon tugasa, konteyner ham to'xtaydi. hello-world matnini chiqardi va darhol to'xtadi — bu xato emas, xuddi shunday bo'lishi kerak.
9.4 Virtualizatsiya o'chiq
BIOS'da virtualizatsiya o'chiq bo'lsa, WSL2 ham, Docker Desktop ham ishga tushmaydi. Docker Desktop bu haqda oyna chiqaradi. Bu holatni biz sinab ko'rmadik — aniq xabar matnini bera olmaymiz. Belgisi: Task Manager → Performance → CPU da "Virtualization: Disabled". Yechim: kompyuter BIOS/UEFI sozlamalarida Intel VT-x yoki AMD-V ni yoqish.
10. Mashqlar
Mashqlar kurs/mashqlar/26/01-konteyner/ da.
1-mashq (oson): bo'sh joylarni to'ldiring
- Jarayonga dunyoning faqat bir qismini ko'rsatadigan kernel mexanizmi — .
- Jarayonga xotira va CPU chegarasini qo'yadigan mexanizm — .
- Fonda ishlab, CLI'dan so'rov qabul qiladigan Docker xizmati — .
--memory 256mbilanmemory.maxdagi son — .- Konteyner ichida birinchi jarayonning PID'i — .
Yechim
Namespace — "nimani ko'radi", cgroup — "qancha oladi". Daemon (dockerd) — server tomoni, CLI — mijoz. 256 × 1024 × 1024 = 268 435 456. Konteyner ichida PID 1 — siz bergan buyruq, chunki konteynerning o'z jarayonlar namespace'i bor.
2-mashq (o'rta): VM yoki konteyner?
Har holat uchun nima mosroq: VM yoki konteyner? Bir gap bilan asoslang.
- Noutbukda PostgreSQL 16 va 18 ni bir vaqtda ishlatish kerak.
- Linux server'da Windows Server dasturini ishga tushirish kerak.
- Foydalanuvchilar yuborgan noma'lum kodni ishga tushiradigan onlayn sinov xizmati.
- Har push'da testlarni toza muhitda tez ishga tushirish.
Yechim
- Konteyner — ikkita konteyner, har biri o'z versiyasi bilan, soniyalarda ishga tushadi.
- VM — Windows dasturiga Windows kernel'i kerak, Linux konteyner uni bera olmaydi.
- VM (yoki qo'shimcha himoyali sandbox) — begona kod uchun alohida kernel kuchliroq to'siq. Konteyner kernel'ni bo'lishadi.
- Konteyner — tez ishga tushadi, har safar image'dan toza holatda yaratiladi.
Qoida: o'z ilovangiz va muhitni bir xil qilish — konteyner. Boshqa OS yoki ishonchsiz kod — VM.
3-mashq (qiyin): docker version chiqishini tahlil qilish
Docker'ni tekshiradigan skriptlar ko'pincha docker version chiqishini o'qiydi. dockerHolati(matn) funksiyasini yozing. U chiqish matnini oladi va obyekt qaytaradi: { mijoz, server }. mijoz — Client: bo'limidagi Version. server — Server: bo'limi bo'lsa, Engine: ostidagi Version, bo'lmasa null.
Ishora: matnni split("\n") bilan qatorlarga bo'ling. Version: bilan boshlanadigan qatorni trim() qilingan holda qidiring. Server bor-yo'qligini Server: so'zi bilan bilasiz (matn ichida qidirish, kesish va bo'lish). Ikki namuna — darsdagi haqiqiy chiqishlarning qisqartmasi.
Yechim
function dockerHolati(matn) {
const qatorlar = matn.split("\n").map((q) => q.trim());
const versiyalar = qatorlar
.filter((q) => q.startsWith("Version:"))
.map((q) => q.slice("Version:".length).trim());
const serverBor = matn.includes("\nServer:");
return {
mijoz: versiyalar[0] ?? null,
server: serverBor ? versiyalar[1] ?? null : null,
};
}
const ishlayapti = [
"Client:",
" Version: 29.8.2",
" OS/Arch: windows/amd64",
"",
"Server: Docker Desktop 4.94.0 (241994)",
" Engine:",
" Version: 29.8.2",
" OS/Arch: linux/amd64",
].join("\n");
const ochiq = [
"Client:",
" Version: 29.8.2",
" Context: desktop-linux",
"failed to connect to the docker API at npipe:...",
].join("\n");
console.log(dockerHolati(ishlayapti));
console.log(dockerHolati(ochiq));Konsolda:
{ mijoz: '29.8.2', server: '29.8.2' }
{ mijoz: '29.8.2', server: null }Server bo'limi bo'lsa, ikkinchi Version: — Engine versiyasi (containerd va runc versiyalari undan keyin keladi). Bo'lmasa — null, ya'ni daemon ishlamayapti. Real skriptlarda matnni tahlil qilish o'rniga docker version --format "{{.Server.Version}}" ishlatiladi — Docker kerakli qiymatni o'zi beradi. Lekin chiqishni o'qiy olish baribir foydali: xato xabarlari formatlanmagan matn bo'ladi.
4-mashq: SQL qadami — Docker'ni tayyorlash
- Docker Desktop'ni o'rnating («O'rnatish qadamlari» bo'limi).
docker versionni ishga tushiring.ClientvaServerversiyalarini, ikkalaOS/Archni yozib oling.docker run --rm hello-worldni ishga tushiring.docker run --rm --memory 128m postgres:18 cat /sys/fs/cgroup/memory.maxnatijasini oldindan hisoblang, keyin tekshiring.wsl -l -vdadocker-desktopbormi?
Yechim
1–3. Bizdagi natijalar darsda: engine 29.8.2, mijoz windows/amd64, server linux/amd64. Sizda versiya boshqacha bo'lishi mumkin. Kursdagi chiqishlar 29.8.2 da olingan — eskiroq versiyada ba'zi chiqishlar (masalan docker images ustunlari) farq qilishi mumkin. hello-world dan oldin yuklash qatorlari chiqadi — bu birinchi ishga tushirish.
128 × 1024 × 1024 = 134217728. Birinchi marta
postgres:18image'i yuklanadi — internet tezligiga qarab bir necha daqiqa. Keyingi safar darhol ishlaydi.Windows'da Docker Desktop WSL2 bilan o'rnatilgan bo'lsa — ha,
docker-desktop Running 2. Docker Desktop yopiq bo'lsa, holatiStoppedbo'ladi.
11. Real ishda
- Lokal muhit: jamoalar bazani, Redis'ni, navbat serverini Docker'da ko'taradi. Yangi xodim bitta buyruq bilan butun muhitni oladi. Buni 33-qismda Docker Compose bilan qilasiz.
- Server va bulut: ko'p ilovalar konteynerda deploy qilinadi. IlmHamroh'ning o'zi ham server'da Docker konteynerlarida ishlaydi: veb, API va baza — alohida konteynerlar.
- CI: GitHub Actions va boshqa CI tizimlari testlarni toza konteynerlarda ishga tushiradi.
- Intervyu savollari: "Konteyner va VM farqi?", "Namespace va cgroup nima qiladi?", "Docker Windows'da qanday ishlaydi?". Yaxshi javob: "konteyner — ajratilgan jarayon, kernel umumiy; Windows'da Linux VM ichida".
Xulosa
- Konteyner — namespace bilan ajratilgan va cgroup bilan cheklangan oddiy jarayon; kernel host bilan umumiy.
- VM o'z kernel'ini olib yuradi — og'irroq, lekin kuchliroq ajratadi; konteyner yengil va tez.
- Docker = CLI (mijoz) +
dockerddaemon (server) + containerd va runc;docker versionikkala tomonni ko'rsatadi. - Windows'da Docker Desktop daemon'ni WSL2 ichidagi Linux VM'da ishlatadi (
docker-desktopdistributivi). docker run --rm hello-world— o'rnatishni tekshirish; Podman — Docker'ga mos, daemon'siz muqobil.
Keyingi dars: Image, container va registry: asosiy buyruqlar — PostgreSQL 18 image'ini yuklab, konteyner ishga tushirasiz, loglarini o'qiysiz va ichiga kirasiz.
Manbalar
- Docker hujjati — What is Docker (arxitektura: client, daemon, registry): https://docs.docker.com/get-started/docker-overview/
- Docker hujjati — Install Docker Desktop on Windows: https://docs.docker.com/desktop/setup/install/windows-install/
- Docker hujjati — Docker Desktop license agreement: https://docs.docker.com/subscription/desktop-license/
- Docker hujjati — Resource constraints (
--memory): https://docs.docker.com/engine/containers/resource_constraints/ - Linux man-pages — namespaces(7), cgroups(7): https://man7.org/linux/man-pages/man7/namespaces.7.html
- Podman hujjati: https://docs.podman.io/
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!