Docker — ilovalarni container ichida ishga tushirish va boshqarish uchun ishlatiladigan platforma. Docker yordamida dastur kodi, kutubxonalar, sozlamalar va kerakli runtime muhit bitta standart paketga yig‘iladi.
Docker dastur bir kompyuterda ishlasa, boshqa serverda ham xuddi shu muhitda ishlashiga yordam beradi. Bu ishlab chiqish, test, deployment va DevOps jarayonlarida keng qo‘llanadi.
Vazifasi
Docker ilovani alohida va boshqariladigan muhitda ishga tushirish uchun ishlatiladi.
Docker quyidagi vazifalarni bajaradi:
- ilovani container ichida ishga tushirish;
- dependency va runtime muhitni bir joyga yig‘ish;
- local va server muhitlarini yaqinlashtirish;
- deployment jarayonini soddalashtirish;
- service’larni alohida containerlarda yuritish;
- Docker image yaratish;
- containerlarni ishga tushirish, to‘xtatish va o‘chirish;
- microservice arxitekturasini boshqarish;
- CI/CD jarayonlari bilan ishlash;
- serverdagi ilovalarni izolyatsiya qilish.
Masalan, backend API, PostgreSQL, Redis va Nginx alohida Docker containerlarda ishlashi mumkin.
Docker qanday ishlaydi?
Docker ilovani image asosida container sifatida ishga tushiradi. Image ichida ilova uchun kerakli fayllar, kutubxonalar va ishga tushirish sozlamalari bo‘ladi.
Oddiy jarayon:
- dasturchi
Dockerfileyozadi; - Docker shu fayl asosida image yaratadi;
- image’dan container ishga tushiriladi;
- container ichida ilova ishlaydi;
- kerak bo‘lsa port, volume va network ulanadi;
- container serverda mustaqil jarayon sifatida ishlaydi.
Docker host operatsion tizim kernelidan foydalanadi, lekin ilova uchun alohida izolyatsiyalangan muhit yaratadi.
Container
Container — Docker image asosida ishga tushgan yengil izolyatsiyalangan muhit. Container ichida ilova va uning kerakli dependency’lari ishlaydi.
Container quyidagilarni o‘z ichiga olishi mumkin:
- dastur kodi;
- runtime;
- kutubxonalar;
- environment variable’lar;
- konfiguratsiya;
- ishga tushirish buyrug‘i;
- port sozlamalari;
- volume ulanishlari.
Masalan, Python backend ilovasi alohida containerda, Redis esa boshqa containerda ishlashi mumkin.
Image
Image — container yaratish uchun ishlatiladigan tayyor shablon. Image ichida ilova ishlashi uchun kerakli fayllar va sozlamalar bo‘ladi.
Image quyidagilarni o‘z ichiga oladi:
- base image;
- dependency’lar;
- ilova fayllari;
- runtime muhiti;
- konfiguratsiya;
- default command;
- layerlar.
Masalan, python:3.12, node:20, postgres:16, redis:7 kabi image’lar Docker Hub’da mavjud.
Dockerfile
Dockerfile — Docker image qanday yaratilishini belgilaydigan matnli fayl. Unda image uchun kerakli buyruqlar ketma-ket yoziladi.
Dockerfile ichida quyidagi buyruqlar uchraydi:
FROM— base image tanlash;WORKDIR— ishchi papkani belgilash;COPY— fayllarni image ichiga ko‘chirish;RUN— build vaqtida buyruq bajarish;ENV— environment variable berish;EXPOSE— portni ko‘rsatish;CMD— container ishga tushganda bajariladigan buyruq;ENTRYPOINT— asosiy bajariladigan jarayonni belgilash.
Dockerfile image yaratish jarayonining asosiy konfiguratsiyasi hisoblanadi.
Base image
Base image — yangi Docker image yaratishda asos sifatida ishlatiladigan image. U odatda operatsion tizim yoki runtime muhitini beradi.
ubuntu;debian;alpine;python;node;nginx;postgres;redis.
Masalan, Python backend uchun python:3.12-slim base image sifatida ishlatilishi mumkin.
Layer
Layer — Docker image ichidagi qatlam. Dockerfile’dagi ko‘p buyruqlar image ichida alohida layer hosil qiladi.
Layerlar quyidagi maqsadlarda ishlatiladi:
- image tarixini saqlash;
- cache’dan foydalanish;
- build jarayonini tezlashtirish;
- o‘zgarishlarni qatlamlarga ajratish;
- image hajmini boshqarish.
Masalan, dependency o‘rnatish alohida layer, kodni ko‘chirish esa boshqa layer bo‘lishi mumkin.
Docker build
docker build — Dockerfile asosida image yaratish uchun ishlatiladigan buyruq.
Misol:
docker build -t my-app .
Bu buyruq joriy papkadagi Dockerfile’dan my-app nomli image yaratadi.
Build jarayonida Dockerfile’dagi buyruqlar ketma-ket bajariladi va image hosil bo‘ladi.
Docker run
docker run — image asosida yangi container ishga tushirish uchun ishlatiladi.
Misol:
docker run -p 8000:8000 my-app
Bu buyruq my-app image’dan container yaratadi va hostdagi 8000-portni containerdagi 8000-portga bog‘laydi.
docker run orqali containerga port, volume, environment variable va network sozlamalari berilishi mumkin.
Docker ps
docker ps — ishlayotgan containerlar ro‘yxatini ko‘rsatadi.
Misol:
docker ps
Barcha containerlarni, jumladan to‘xtaganlarini ham ko‘rish uchun:
docker ps -a
Bu buyruqlar container nomi, ID’si, image’i, holati va portlarini ko‘rsatadi.
Docker stop
docker stop — ishlayotgan container’ni to‘xtatish uchun ishlatiladi.
Misol:
docker stop container_name
Container to‘xtatilganda uning jarayoni tugaydi, lekin container o‘chirilmaydi. Uni keyin qayta ishga tushirish mumkin.
Docker start
docker start — to‘xtagan container’ni qayta ishga tushirish uchun ishlatiladi.
Misol:
docker start container_name
Bu buyruq mavjud container’ni image’dan qayta yaratmasdan ishga tushiradi.
Docker rm
docker rm — container’ni o‘chirish uchun ishlatiladi.
Misol:
docker rm container_name
Container o‘chirilganda uning runtime holati yo‘qoladi. Agar ma’lumot volume’da saqlanmagan bo‘lsa, container ichidagi vaqtinchalik ma’lumotlar ham yo‘qolishi mumkin.
Docker rmi
docker rmi — Docker image’ni o‘chirish uchun ishlatiladi.
Misol:
docker rmi image_name
Image o‘chirilsa, undan yangi container yaratib bo‘lmaydi. Lekin shu image’dan avval yaratilgan containerlar alohida mavjud bo‘lishi mumkin.
Docker logs
docker logs — container loglarini ko‘rish uchun ishlatiladi.
Misol:
docker logs container_name
Real vaqt rejimida log ko‘rish uchun:
docker logs -f container_name
Loglar ilova xatolari, server chiqishlari va container ichidagi jarayonlarni kuzatishda ishlatiladi.
Docker exec
docker exec — ishlayotgan container ichida buyruq bajarish uchun ishlatiladi.
Misol:
docker exec -it container_name bash
Yoki:
docker exec -it container_name sh
Bu buyruq container ichiga terminal orqali kirish imkonini beradi.
Port mapping
Port mapping — host kompyuter portini container portiga bog‘lash jarayoni.
Misol:
-p 8080:80
Bu yerda:
8080— host porti;80— container ichidagi port.
Masalan, Nginx container ichida 80-portda ishlasa, hostda 8080-port orqali ochilishi mumkin.
Volume
Volume — container ma’lumotlarini container tashqarisida saqlash uchun ishlatiladigan Docker mexanizmi. Container o‘chirilsa ham volume ichidagi ma’lumotlar saqlanib qolishi mumkin.
Volume quyidagi ma’lumotlar uchun ishlatiladi:
- database fayllari;
- media fayllar;
- loglar;
- konfiguratsiya;
- upload qilingan fayllar;
- persistent storage.
Masalan, PostgreSQL ma’lumotlari volume’da saqlansa, container qayta yaratilganda ham database yo‘qolmaydi.
Bind mount
Bind mount — host kompyuterdagi papkani container ichiga ulash usuli. Bu local development jarayonida ko‘p ishlatiladi.
Misol:
-v /home/user/app:/app
Bu holatda hostdagi /home/user/app papkasi container ichidagi /app papkasiga ulanadi.
Bind mount orqali kodni hostda o‘zgartirib, container ichida darhol ko‘rish mumkin.
Network
Docker network — containerlar bir-biri bilan aloqa qilishi uchun ishlatiladigan tarmoq mexanizmi.
Docker network orqali:
- containerlar nomi orqali bir-birini topadi;
- backend database bilan ulanadi;
- Nginx backendga so‘rov yuboradi;
- microservice’lar o‘zaro ishlaydi;
- tashqi va ichki tarmoqlar ajratiladi.
Masalan, backend container postgres containerga db:5432 orqali ulanishi mumkin.
Docker Compose
Docker Compose — bir nechta containerdan iborat ilovalarni bitta konfiguratsiya fayli orqali boshqarish vositasi. Compose fayli odatda docker-compose.yml yoki compose.yml deb nomlanadi.
Docker Compose orqali quyidagilar boshqariladi:
- service’lar;
- image’lar;
- build sozlamalari;
- portlar;
- volume’lar;
- network’lar;
- environment variable’lar;
- dependency tartibi.
Masalan, backend, frontend, PostgreSQL, Redis va Nginx bitta Compose faylida tariflanishi mumkin.
Service
Docker Compose’da service — ishga tushiriladigan alohida container turi. Har bir service ma’lum image yoki build konfiguratsiyasiga ega bo‘ladi.
Service misollari:
backend;frontend;db;redis;nginx;worker;scheduler.
Compose’da har bir service o‘z porti, volume’i, environment variable’lari va network sozlamalariga ega bo‘lishi mumkin.
Compose up
docker compose up — Compose faylidagi service’larni ishga tushirish uchun ishlatiladi.
Misol:
docker compose up -d
Bu yerda -d containerlarni background rejimida ishga tushiradi.
Build bilan birga ishga tushirish:
docker compose up -d --build
Bu buyruq image’larni qayta build qilib, containerlarni ishga tushiradi.
Compose down
docker compose down — Compose orqali ishga tushgan service’larni to‘xtatish va o‘chirish uchun ishlatiladi.
Misol:
docker compose down
Bu buyruq container va networklarni o‘chiradi. Volume’lar alohida parametr berilmasa saqlanib qolishi mumkin.
Environment variables
Docker’da environment variable’lar ilova sozlamalarini tashqaridan berish uchun ishlatiladi.
Environment variable misollari:
DATABASE_URL;SECRET_KEY;DEBUG;REDIS_URL;PORT;API_URL;POSTGRES_USER;POSTGRES_PASSWORD.
Bu qiymatlar Dockerfile, docker run, Compose fayli yoki .env fayl orqali berilishi mumkin.
.env fayl
.env fayl Docker Compose bilan environment variable’larni saqlash uchun ishlatiladi.
.env ichida quyidagilar bo‘lishi mumkin:
Compose fayl .env ichidagi qiymatlarni o‘qib, service sozlamalarida ishlatishi mumkin.
Docker Hub
Docker Hub — Docker image’larni saqlash va ulashish uchun ishlatiladigan public registry. Unda rasmiy va foydalanuvchi yaratgan image’lar mavjud.
Docker Hub’da quyidagi image’lar uchraydi:
nginx;postgres;redis;mysql;node;python;ubuntu;alpine.
Docker Hub’dan image olish uchun docker pull ishlatiladi.
Docker registry
Docker registry — Docker image’larni saqlaydigan xizmat. Docker Hub registry’ning eng mashhur ko‘rinishlaridan biri.
Registry turlari:
- Docker Hub;
- GitHub Container Registry;
- GitLab Container Registry;
- Amazon ECR;
- Google Artifact Registry;
- Azure Container Registry;
- private registry.
CI/CD pipeline image yaratib, registry’ga push qilishi va server shu image’dan foydalanishi mumkin.
Docker pull
docker pull — registry’dan image yuklab olish uchun ishlatiladi.
Misol:
docker pull postgres:16
Bu buyruq Docker Hub’dan postgres image’ining 16-versiyasini yuklab oladi.
Docker push
docker push — local image’ni registry’ga yuborish uchun ishlatiladi.
Misol:
docker push username/my-app:latest
Push qilingan image boshqa server yoki CI/CD pipeline tomonidan ishlatilishi mumkin.
Image tag
Image tag — image versiyasi yoki variantini bildiradigan belgi.
Misollar:
latest;1.0.0;16;3.12-slim;alpine;production;dev.
Masalan, postgres:16 image nomi postgres, tag esa 16 ekanini bildiradi.
Container restart policy
Restart policy — container to‘xtab qolsa, Docker uni qayta ishga tushirishi kerak yoki yo‘qligini belgilaydi.
Restart policy turlari:
no;always;unless-stopped;on-failure.
Masalan, server qayta ishga tushganda backend container ham avtomatik ishga tushishi uchun restart policy ishlatiladi.
Healthcheck
Healthcheck — container ichidagi ilova ishlayotganini tekshirish mexanizmi. Docker healthcheck orqali container sog‘lom yoki muammoli ekanini aniqlashi mumkin.
Healthcheck quyidagilarni tekshirishi mumkin:
Container holati healthy, unhealthy yoki starting ko‘rinishida bo‘lishi mumkin.
Docker va virtual machine farqi
Docker container va virtual machine o‘xshash maqsadlarda ishlatilishi mumkin, lekin ular texnik jihatdan farq qiladi.
Farqlar:
- Docker container host kernelidan foydalanadi;
- Virtual machine alohida operatsion tizim ishlatadi;
- container odatda yengilroq bo‘ladi;
- virtual machine ko‘proq resurs talab qiladi;
- container tezroq ishga tushadi;
- virtual machine kuchliroq izolyatsiya beradi.
Docker ko‘p hollarda ilovalarni tez va yengil ishga tushirish uchun ishlatiladi.
Docker va microservice
Docker microservice arxitekturasida keng ishlatiladi. Har bir service alohida container sifatida ishlashi mumkin.
Microservice loyihada containerlar:
- authentication service;
- payment service;
- notification service;
- user service;
- API gateway;
- database;
- cache;
- worker.
Har bir service alohida build, deploy va scale qilinishi mumkin.
Docker va backend
Backend ilovalar Docker orqali alohida container sifatida ishga tushiriladi. Bu backend uchun kerakli runtime, dependency va sozlamalarni bir joyga yig‘ishga yordam beradi.
Backend container ichida quyidagilar bo‘lishi mumkin:
- Python, Node.js, Go yoki boshqa runtime;
- backend kodi;
- dependency’lar;
- environment variable’lar;
- start command;
- API port;
- migration buyruqlari.
Masalan, FastAPI yoki Django backend Docker containerda uvicorn yoki gunicorn orqali ishlashi mumkin.
Docker va frontend
Frontend loyihalarda Docker build va deployment jarayonida ishlatilishi mumkin.
Frontend uchun Docker quyidagilarda qo‘llanadi:
- Node.js muhitida build qilish;
- static fayllarni yaratish;
- Nginx orqali frontendni serve qilish;
- SSR frontend ilovalarni ishga tushirish;
- development environment yaratish;
- CI/CD build jarayoni.
Masalan, React build fayllari Docker image ichidagi Nginx orqali foydalanuvchiga berilishi mumkin.
Docker va database
Database’lar ham Docker container ichida ishlashi mumkin. Bu local development va test muhiti uchun ko‘p ishlatiladi.
Docker’da ishlatiladigan database image’lari:
- PostgreSQL;
- MySQL;
- MariaDB;
- MongoDB;
- Redis;
- SQLite uchun maxsus container shart emas;
- Elasticsearch.
Database container bilan ishlaganda ma’lumotlar volume orqali saqlanadi.
Docker va Nginx
Nginx Docker’da reverse proxy, static file server yoki load balancer sifatida ishlatilishi mumkin.
Nginx container quyidagi vazifalarda ishlatiladi:
- frontend fayllarni serve qilish;
- backend API’ga proxy qilish;
- SSL termination;
- static fayllarni tarqatish;
- bir nechta service’ni bitta domen ostida ulash;
- load balancing.
Masalan, Nginx api.example.com so‘rovlarini backend containerga yo‘naltirishi mumkin.
Docker va CI/CD
Docker CI/CD jarayonlarida keng ishlatiladi. Pipeline koddan image yaratadi, image’ni registry’ga yuboradi va serverda yangi container ishga tushiradi.
CI/CD’da Docker orqali quyidagilar bajariladi:
- build muhitini standartlashtirish;
- Docker image yaratish;
- image taglash;
- registry’ga push qilish;
- serverda pull qilish;
- container yangilash;
- healthcheck bajarish;
- rollback uchun oldingi image’dan foydalanish.
Docker deployment jarayonini takrorlanadigan va boshqariladigan holatga keltiradi.
Docker Compose va production
Docker Compose local development, test va kichik production muhitlarda ishlatilishi mumkin. Compose bir nechta service’ni bitta faylda boshqaradi.
Production muhitda Compose quyidagilarni boshqarishi mumkin:
- backend;
- frontend;
- Nginx;
- Redis;
- PostgreSQL;
- worker;
- scheduler;
- monitoring service.
Katta tizimlarda Kubernetes yoki boshqa orchestration vositalari ham ishlatilishi mumkin.
Kubernetes bilan bog‘liqligi
Kubernetes — containerlarni katta miqyosda boshqarish uchun ishlatiladigan orchestration platforma. Docker container image’lari Kubernetes ichida ham ishlatilishi mumkin.
Kubernetes quyidagilarni boshqaradi:
- containerlarni ishga tushirish;
- scaling;
- load balancing;
- service discovery;
- rolling update;
- rollback;
- secret va config;
- cluster resurslari.
Docker container yaratish va image formatida muhim rol o‘ynasa, Kubernetes containerlarni ko‘p serverli muhitda boshqaradi.
Docker xavfsizligi
Docker containerlar izolyatsiya beradi, lekin xavfsizlik alohida e’tibor talab qiladi.
Docker xavfsizligida quyidagi tushunchalar uchraydi:
- minimal base image;
- root bo‘lmagan user;
- secrets’ni image ichiga yozmaslik;
- image scan;
- dependency scan;
- portlarni cheklash;
- private registry;
- volume ruxsatlari;
- network izolyatsiyasi;
- container permissionlari.
Docker image va containerlar production tizimga bevosita ta’sir qilishi mumkin.
Docker image hajmi
Docker image hajmi deployment tezligi va server resurslariga ta’sir qilishi mumkin. Image ichida qancha ko‘p fayl va dependency bo‘lsa, hajm ham shuncha katta bo‘ladi.
Image hajmiga ta’sir qiladigan omillar:
- base image turi;
- dependency soni;
- build cache;
- keraksiz fayllar;
- development paketlari;
- log va cache fayllar;
- multi-stage build ishlatilishi.
Masalan, alpine yoki slim image’lar odatda kichikroq bo‘ladi.
Multi-stage build
Multi-stage build — Dockerfile ichida bir nechta build bosqichidan foydalanish usuli. Bu yakuniy image hajmini kamaytirish va faqat kerakli fayllarni qoldirish uchun ishlatiladi.
Multi-stage build quyidagi holatlarda ishlatiladi:
- frontend build qilib, faqat
distpapkani olish; - Go binary yaratib, faqat binary faylni saqlash;
- development dependency’larni yakuniy image’ga qo‘shmaslik;
- build va runtime muhitlarini ajratish.
Bu usul production image’larni ixchamroq qilishda ishlatiladi.
Dasturlashdagi o‘rni
Docker zamonaviy dasturlash, DevOps va deployment jarayonlarida muhim vositalardan biridir. U ilovalarni bir xil muhitda ishga tushirish, service’larni ajratish va serverga joylashni soddalashtirish uchun ishlatiladi.
Docker quyidagi joylarda qo‘llanadi:
- frontend loyihalar;
- backend API;
- database containerlar;
- Redis va cache service’lar;
- Nginx reverse proxy;
- CI/CD pipeline;
- microservice arxitekturasi;
- local development;
- test muhiti;
- production deployment.
Docker ilova va uning muhitini container ichida standartlashtirib, dasturiy ta’minotni ishlab chiqish va ishga tushirish jarayonlarini boshqarishga yordam beradi.
Bog‘liq tushunchalar
Container, Image, Dockerfile, Docker Compose, Volume, Network, Registry, CI/CD, Nginx, Backend, Deployment, Kubernetes