Docker va Podman: amaliy ishlash
Linux containerlari va namespaces va cgroups maqolalari konteynerning kernel darajasidagi mexanizmini — namespace va cgroups — nazariy jihatdan ko'rsatadi. Bu maqola shu nazariyaning ustiga quriladi: real konteynerni yaratish, ishga tushirish va boshqarish uchun ikkita eng ko'p tarqalgan vosita — Docker va Podman — bilan amaliy ishlashni ko'rsatadi.
O'quv maqsadlari
Maqolani tugatgach:
docker runbilan konteyner ishga tushira, uning holatini tekshira va to'xtata olasiz;- oddiy
Dockerfileyozib, undan obraz (image) qura olasiz; - volume va port mapping orqali konteynerni host bilan bog'lay olasiz;
- Docker va Podman arxitekturasidagi asosiy farqni (daemon bor-yo'qligi) tushunasiz;
- Docker buyruqlarini Podman'ga deyarli o'zgarishsiz ko'chira olasiz.
Docker: daemon asosidagi model
Docker dockerd deb nomlangan doimiy ishlab turuvchi fon jarayoni (daemon) orqali ishlaydi. docker buyrug'i bu daemon bilan Unix socket orqali gaplashadigan client, xolos.
O'rnatish (Ubuntu)
docker guruhiga qo'shilgach, sudosiz docker buyrug'ini ishlatish uchun yangi login sessiyasi kerak bo'ladi.
Warning
docker guruhiga qo'shilgan foydalanuvchi amalda root bilan tenglashtiriladi — daemon root huquqida ishlaydi va konteyner orqali host fayl tizimiga (masalan, -v /:/host bilan) kirish mumkin. Bu guruhga faqat ishonchli foydalanuvchini qo'shing.
Birinchi konteyner
--rm konteyner tugagach uni avtomatik o'chiradi — sinov uchun qulay, disk to'planib qolishining oldini oladi.
Interaktiv konteyner:
-i— interaktiv stdin;-t— pseudo-terminal ajratish.
Konteynerlarni boshqarish
docker ps faqat ishlayotgan, -a esa to'xtagan konteynerlarni ham ko'rsatadi.
stop konteynerni to'xtatadi (jarayon o'chadi, konteyner obyekti qoladi), rm esa to'xtagan konteyner obyektini butunlay o'chiradi.
Fon rejimida ishga tushirish va portni ochish
-d— detached, fon rejimi;-p 8080:80— host portini (8080) konteyner ichidagi portga (80) bog'laydi.
Dockerfile: o'z obrazingizni qurish
FROM— asos obraz;WORKDIR— konteyner ichidagi ishchi katalog;COPY— hostdagi faylni obrazga nusxalash;CMD— konteyner ishga tushganda bajariladigan sukut buyruq.
mkdir -p ~/lab/docker-demo && cd ~/lab/docker-demo
printf 'print("Salom, konteynerdan")\n' > app.py
cat <<'EOF' > Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
EOF
docker build -t demo-app:1.0 .
docker run --rm demo-app:1.0
docker build -t demo-app:1.0 . — joriy katalogdagi Dockerfiledan demo-app:1.0 nomli obraz quradi. . — build kontekstining yo'li.
Volume: konteyner ichidagi ma'lumotni saqlash
Konteyner o'chirilganda uning ichidagi yozilgan fayllar ham yo'qoladi. Doimiy saqlanishi kerak bo'lgan ma'lumot uchun volume ishlatiladi:
docker volume create demo-data
docker run --rm -v demo-data:/data alpine sh -c 'echo "salom" > /data/note.txt'
docker run --rm -v demo-data:/data alpine cat /data/note.txt
Ikkinchi docker run — birinchisidan mustaqil, yangi konteyner, lekin bir xil demo-data volume orqali fayl saqlanib qolgan.
Hostdagi katalogni to'g'ridan-to'g'ri bog'lash (bind mount):
mkdir -p ~/lab/docker-demo/data
docker run --rm -v "$HOME/lab/docker-demo/data:/data" alpine sh -c 'echo "host bilan bog'\''langan" > /data/note.txt'
cat ~/lab/docker-demo/data/note.txt
Podman: daemonsiz muqobil
Podman Docker bilan deyarli bir xil buyruq sintaksisiga ega, lekin arxitektura darajasida asosiy farq bor: Podman doimiy fon daemoniga muhtoj emas, har bir podman buyrug'i o'z jarayoni sifatida ishlaydi va odatiy holatda rootless (root huquqisiz) konteyner ishga tushira oladi.
docker (client) ──socket──> dockerd (doimiy daemon, root)
podman (mustaqil jarayon, rootless bo'lishi mumkin) ──to'g'ridan-to'g'ri──> konteyner
O'rnatish va asosiy ishlatish
Aksariyat Docker buyruqlari docker o'rniga podman yozib, o'zgarishsiz ishlaydi:
podman run -d --name web -p 8080:80 nginx:alpine
podman ps
podman logs web
podman stop web && podman rm web
podman build ham xuddi shunday Dockerfiledan foydalanadi:
Docker va Podman taqqoslash
| Xususiyat | Docker | Podman |
|---|---|---|
| Doimiy fon daemoni | Kerak (dockerd) |
Kerak emas |
| Rootless ishlash | Qo'shimcha sozlash bilan mumkin | Odatiy holatda qo'llab-quvvatlanadi |
| Buyruq sintaksisi | docker <buyruq> |
Deyarli bir xil, podman <buyruq> |
| systemd bilan integratsiya | Qo'shimcha vosita kerak | podman generate systemd bilan native |
| Docker Compose fayllarini ishlatish | To'g'ridan-to'g'ri | podman-compose yoki Podman'ning Kubernetes YAML qo'llab-quvvatlashi orqali |
Rootless model xavfsizlik nuqtai nazaridan foydali: konteyner ichidagi jarayon buzilsa ham, u hostda root huquqiga ega bo'lmaydi — bu Docker'ning standart (daemon root) modelidan farqli.
Ko'p uchraydigan xatolar
Konteyner ichidagi ma'lumotni doimiy deb hisoblash
Volume yoki bind mount ishlatilmasa, konteyner o'chirilganda (docker rm) uning yozgan fayllari ham yo'qoladi.
docker guruhini imtiyoz nazoratisiz tarqatish
docker guruhiga qo'shilgan foydalanuvchi root bilan teng — bu odatdagi Linux guruh a'zoligidan farqli, sudo'siz ham deyarli to'liq nazorat beradi.
-p va EXPOSEni chalkashtirish
Dockerfiledagi EXPOSE faqat hujjatlashtiruvchi ma'lumot; portni haqiqatan hostga ochadigan narsa — docker run -p.
Ishlatilmagan obraz va konteynerlarni tozalamaslik
Vaqt o'tishi bilan eski obrazlar disk joyini sezilarli egallab olishi mumkin.
Amaliy mashqlar
nginx:alpineobrazini-d -p 8080:80bilan ishga tushiring,curl localhost:8080bilan tekshiring, so'ngdocker logsvadocker stop/rmbilan tozalang.- Shu maqoladagi
Dockerfilega o'xshab, o'z Python yoki Bash skriptingizni konteynerlashtiring va undan obraz quring. - Volume yaratib, ikkita alohida
docker runchaqirig'i orasida ma'lumot saqlanib qolishini tasdiqlang. - Bir xil buyruqlarni avval
docker, keyinpodmanbilan bajarib, natijalarni solishtiring.
Xulosa
Docker daemon asosida ishlaydi va docker buyrug'i shu daemon bilan gaplashadigan client, xolos; Podman esa daemonsiz, ko'pincha rootless modelda ishlaydi, lekin buyruq sintaksisi deyarli bir xil. docker run, docker build va volume/port mapping — ikkalasida ham amaliy konteyner ishlatishning asosiy vositalari. Keyingi qadam sifatida Linux CI/CD'da maqolasi shu obrazlarni avtomatlashtirilgan pipeline ichida qurish va joylashtirishni ko'rsatadi.