1-bo‘lim
Konteyner nima?
Konteyner va virtual mashina farqi, Docker qanday paydo bo'lgan va u qanday muammoni hal qiladi.
Ushbu bo‘lim mundarijasi
Har bir jamoada bir marta shunday suhbat bo'lgan:
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.
Buni isbotlash oson. Host yadrosi versiyasini va konteyner ichidagi yadro versiyasini solishtiramiz:
uname -r
docker run --rm alpine:3.21 uname -r
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 mashina | Konteyner | |
|---|---|---|
| Yadro | Har biriga alohida | Host yadrosi baham ko'riladi |
| Hajmi | Gigabaytlarda | Megabaytlarda |
| Ishga tushishi | Daqiqa yoki o'nlab soniya | Soniyaning ulushi |
| Ajratish darajasi | To'liq (apparat darajasida) | Jarayon darajasida |
| Boshqa OT ishlatish | Mumkin (Linux ustida Windows) | Mumkin emas |
| Bir serverda nechta | O'nlab | Yuzlab |
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:
| Mexanizm | Nima qiladi |
|---|---|
| Namespace | Jarayon nimani "ko'rishini" cheklaydi |
| cgroup | Jarayon qancha resurs olishini cheklaydi |
| Union fayl tizimi | Obraz 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:
docker run --rm alpine:3.21 ps -e
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:
docker run --rm alpine:3.21 ls /
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? #
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.
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:
docker --version
docker run --rm hello-world
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? #
docker run --rm alpine:3.21 echo salom
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:
docker images alpine:3.21 --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
docker images hello-world --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
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) | |
|---|---|---|
| Nima | O'zgarmas shablon | Ishlayotgan nusxa |
| O'xshatish | Dastur fayli | Ishga tushgan jarayon |
| Nechta bo'ladi | Bitta | Bir obrazdan yuzlab |
| O'zgaradimi | Yo'q | Ha, lekin o'chirilsa yo'qoladi |
Oxirgi qatorni sinab ko'ramiz:
docker run --rm alpine:3.21 sh -c 'echo test > /tmp/f; cat /tmp/f'
docker run --rm alpine:3.21 cat /tmp/f
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 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
- 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 -rhostda 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.
docker --versionbilan o'rnatilgan versiyani tekshiring.docker run --rm hello-worldni ikki marta ishga tushiring va chiqishdagi farqni toping.uname -rni hostda vaalpine:3.21konteynerida solishtiring.- Konteyner ichida
ps -eni bajaring - nechta jarayon ko'rinadi? ls /ni hostda va konteynerda solishtirib, farqni yozing.docker imagesbilan obrazlar hajmini ko'ring.- Konteynerda fayl yarating, chiqing va yangi konteynerda uni qidiring - natijani tushuntiring.
docker run --rm alpine:3.21 cat /etc/os-releaseni bajaring - qaysi distributiv ko'rinadi?- Hozirgi loyihangizni konteynerga joylash foyda berarmidi? Uchta sabab yozing.
- Konteyner va virtual mashina farqini o'z so'zlaringiz bilan besh qatorda tushuntiring.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.