Skip to content

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 run bilan konteyner ishga tushira, uning holatini tekshira va to'xtata olasiz;
  • oddiy Dockerfile yozib, 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.

docker (client) ──socket──> dockerd (daemon, root huquqida) ──> konteynerlar

O'rnatish (Ubuntu)

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"

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

docker run --rm hello-world

--rm konteyner tugagach uni avtomatik o'chiradi — sinov uchun qulay, disk to'planib qolishining oldini oladi.

Interaktiv konteyner:

docker run -it --rm ubuntu:24.04 bash
  • -i — interaktiv stdin;
  • -t — pseudo-terminal ajratish.

Konteynerlarni boshqarish

docker ps
docker ps -a

docker ps faqat ishlayotgan, -a esa to'xtagan konteynerlarni ham ko'rsatadi.

docker stop <konteyner-id-yoki-nom>
docker rm <konteyner-id-yoki-nom>

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

docker run -d --name web -p 8080:80 nginx:alpine
curl -s http://localhost:8080 | head -n 5
  • -d — detached, fon rejimi;
  • -p 8080:80 — host portini (8080) konteyner ichidagi portga (80) bog'laydi.
docker logs web
docker stop web && docker rm web

Dockerfile: o'z obrazingizni qurish

FROM python:3.12-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
  • 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
Salom, konteynerdan

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
salom

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

sudo apt install podman
podman run --rm hello-world

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:

podman build -t demo-app:1.0 .
podman run --rm demo-app:1.0

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

docker system df
docker image prune

Vaqt o'tishi bilan eski obrazlar disk joyini sezilarli egallab olishi mumkin.

Amaliy mashqlar

  1. nginx:alpine obrazini -d -p 8080:80 bilan ishga tushiring, curl localhost:8080 bilan tekshiring, so'ng docker logs va docker stop/rm bilan tozalang.
  2. Shu maqoladagi Dockerfilega o'xshab, o'z Python yoki Bash skriptingizni konteynerlashtiring va undan obraz quring.
  3. Volume yaratib, ikkita alohida docker run chaqirig'i orasida ma'lumot saqlanib qolishini tasdiqlang.
  4. Bir xil buyruqlarni avval docker, keyin podman bilan 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.

Manbalar