Production web-ilovalar uchun Docker
Docker production web-ilovalarni ishonchli ishga tushirish uchun mos, lekin faqat docker compose up -d buyrug‘ini bajarishning o‘zi production strategiya hisoblanmaydi. Asosiy qiyinchilik containerlarni ishga tushirishda emas. Muhimi, ularni oldindan aniq natija bilan qayta build qilish, nosozliklardan keyin tiklash, ortiqcha privilege bermaslik, muhim ma’lumotlarni saqlash, resurslardan belgilangan chegarada foydalanish, foydali loglar yaratish va deploy vaqtida xavfsiz almashtirish imkonini yaratishdir.
Bitta serverda ishlaydigan kichik yoki o‘rta hajmdagi web-ilova uchun Docker Compose production deployment modeli sifatida mutlaqo maqbul bo‘lishi mumkin. Docker Compose’ning single-host production deployment uchun ishlatilishini rasmiy hujjatlarda ham ko‘rsatadi. Ammo infratuzilma bir nechta serverga kengaysa, container scheduling, failover, service discovery, rolling deployment va orchestration alohida arxitektura masalalariga aylanadi.
Qisqa javob
Docker production uchun mos, agar containerlarga kichik server sifatida emas, istalgan payt almashtirilishi mumkin bo‘lgan runtime birliklari sifatida qaralsa. Immutable image’lar yarating, ilovani faqat zarur privilege bilan ishga tushiring, state’ni container layer’dan tashqarida saqlang, health check va restart siyosatini sozlang, CPU va memory uchun limit belgilang, loglarni rotate qiling yoki tashqi tizimga yuboring, secret’larni himoyalang, faqat kerakli portlarni oching va backup hamda deployment jarayonlarini oldindan sinab qo‘ying.
Docker bu imkoniyatlarning aksariyatini beradi. Production’dagi ishonchlilik esa ularning qanchalik to‘g‘ri sozlanganiga bog‘liq.
Production uchun asosiy talablar
| Yo‘nalish | Production talabi |
|---|---|
| Image’lar | Qayta ishlab bo‘ladigan, minimal va test qilingan |
| Ilova | Amaliy jihatdan mumkin bo‘lgan joylarda stateless |
| Xavfsizlik | Non-root, least privilege, Docker access nazorati |
| Resurslar | CPU va memory limitlari |
| Tarmoq | Faqat zarur portlar ochilgan |
| State | Persistent volumes yoki tashqi managed service’lar |
| Ishonchlilik | Health check va restart policy |
| Loglar | Rotation yoki tashqi aggregation |
| Secret’lar | Image layer’laridan tashqarida saqlanadi |
| Deployment | Takrorlanadigan build, deploy va rollback jarayoni |
Production image’larni to‘g‘ri build qiling
Production image ilovani ishga tushirish uchun kerak bo‘lgan narsalarni o‘z ichiga olishi kerak, build jarayoni uchun ishlatilgan barcha vositalarni emas.
Docker compiler, development dependency va build tool’larni final runtime image’dan ajratish uchun multi-stage build’dan foydalanishni tavsiya qiladi. Kichikroq runtime image’larda odatda ortiqcha dependency kamroq bo‘ladi va attack surface ham qisqaradi. Docker, shuningdek, ishonchli va minimal base image’lardan foydalanishni hamda dependency yangilanishlari image’ga kirishi uchun ularni vaqti-vaqti bilan qayta build qilishni tavsiya qiladi. (docs.docker.com)
Oddiy namuna quyidagicha:
# syntax=docker/dockerfile:1
FROM node:24-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:24-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /app/dist ./dist
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s \
--timeout=3s \
--start-period=10s \
--retries=3 \
CMD wget -qO- http://127.0.0.1:3000/health || exit 1
CMD ["node", "dist/server.js"]
Bu universal Dockerfile emas, balki Node.js uchun misol. Muhim jihat — build va runtime bosqichlarini ajratish, faqat production dependency’larni o‘rnatish, ilovani non-root user bilan ishga tushirish va application-level health endpoint ishlatish.
Agar service uchun root privilege kerak bo‘lmasa, Docker USER ishlatishni tavsiya qiladi. (docs.docker.com)
Image’larni pin qilish
Image tag’lari o‘zgaruvchan bo‘ladi. Masalan:
FROM alpine:3.21
publisher yangi update chiqarganidan keyin boshqa underlying image’ga resolve bo‘lishi mumkin.
Docker image’ni digest orqali pin qilishni qo‘llab-quvvatlaydi:
FROM alpine:3.21@sha256:...
Bu reproducibility’ni yaxshilaydi, chunki bir xil digest har doim bir xil image content’ni bildiradi. Lekin muhim tradeoff bor: digest bilan qat’iy pin qilingan image avtomatik yangilanmaydi. Yaxshi production jarayon controlled pinning bilan automated dependency update tekshiruvlarini birlashtiradi; eski image’ni cheksiz vaqt muzlatib qo‘yish to‘g‘ri emas. (docs.docker.com)
INTERNAL LINK: How Docker Images and Layers Work
Secret’larni image ichiga joylamang
Password, private token va credential’lar image ichiga yozib qo‘yilmasligi kerak.
Docker build secret’lar uchun Dockerfile’dagi ARG yoki ENV dan foydalanmaslik haqida alohida ogohlantiradi, chunki bu qiymatlar final image yoki uning metadata’sida saqlanib qolishi mumkin. BuildKit secret mounts credential’larni build vaqtida vaqtincha taqdim etadi va final image ichida saqlamaydi. (docs.docker.com)
Docker Compose runtime secrets’ni ham qo‘llab-quvvatlaydi. Linux container’larda ular /run/secrets/ ichiga file sifatida mount qilinishi va faqat shu secret kerak bo‘lgan service’largagina berilishi mumkin. (docs.docker.com)
Asosiy prinsip oddiy: configuration environment’lar o‘rtasida o‘zgarishi mumkin, lekin application image o‘sha environment credential’larini o‘z ichiga olishi shart emas.
Container privilege’larini cheklang
Container isolation beradi, lekin bu host security’ni e’tiborsiz qoldirish mumkin degani emas.
Docker daemon’ga access ayniqsa muhim. Docker hujjatlarida odatiy rootful Docker daemon’ni boshqara oladigan user host’da amalda root darajasidagi imkoniyatlarga ega bo‘lishi mumkinligi aytiladi. Shu sababli docker group’iga a’zolik privileged access sifatida ko‘rilishi kerak. (docs.docker.com)
Web-ilovalar uchun:
- imkon bo‘lsa ilovani non-root user bilan ishga tushiring;
privileged: truedan saqlaning;- ilovaga kerak bo‘lmagan capability’larni olib tashlang;
- o‘zgartirish uchun aniq va tushunarli sabab bo‘lmasa, Docker’ning default seccomp himoyasini saqlang;
no-new-privilegesni ko‘rib chiqing;- operatsion cheklovlari sizga mos bo‘lsa, Rootless Docker’dan foydalanishni ko‘rib chiqing.
Docker’dagi rootless mode daemon va containerlarni root privilege’siz ishga tushiradi va ayrim daemon yoki runtime vulnerability’larining ta’sirini kamaytiradi. (docs.docker.com)
Docker keng privilege berish o‘rniga kerak bo‘lmagan Linux capability’larni olib tashlashni ham tavsiya qiladi. (docs.docker.com)
CPU va memory’ni cheklang
Container default holatda resource limit’ga ega emas. Limit qo‘yilmasa, u host imkon berganicha CPU yoki memory ishlatishi mumkin. Shu sababli noto‘g‘ri ishlayotgan bitta container bir xil serverdagi boshqa containerlarga ham ta’sir qilishi mumkin. (docs.docker.com)
Compose quyidagi kabi limitlarni qo‘llab-quvvatlaydi:
services:
app:
image: registry.example.com/app:1.4.0
cpus: 1.0
mem_limit: 512m
Bu qiymatlarni ko‘r-ko‘rona ko‘chirmang. Avval normal workload, kutilayotgan traffic, runtime memory behavior va failure condition’larni o‘lchang. PHP-FPM service, JVM ilovasi, Node.js process va PostgreSQL server’ining talab qiladigan limitlari keskin farq qilishi mumkin.
Limitlarning maqsadi har bir container’ni shunchaki kamroq memory ishlatishga majburlash emas, balki isolation va failure holatlarida oldindan tushunarli behavior yaratishdir.
Muhim ma’lumotlarni alohida saqlang
Container’ning writable filesystem’i vaqtinchalik. Container o‘chirilsa, faqat writable layer ichida turgan ma’lumotlar ham yo‘qoladi. (docs.docker.com)
Ilovaning persistent data’si Docker volumes, mos bind mount, object storage yoki tashqi database/storage service’da saqlanishi kerak.
Docker ko‘plab holatlarda persistent container data uchun volume’larni afzal mexanizm sifatida ko‘rsatadi. Volume ma’lum bir container’dan mustaqil yashaydi va uni backup qilish, restore qilish hamda migrate qilish mumkin. (docs.docker.com)
Bu muhim arxitektura ajratishini beradi:
Container = almashtiriladigan application runtime
Volume yoki tashqi service = persistent state
Volume’ning o‘zi backup emas. Production tizimlarga baribir rejalashtirilgan backup va undan ham muhimi, sinovdan o‘tgan restore jarayoni kerak bo‘ladi.
INTERNAL LINK: Docker Volumes Explained
Health check va tiklanish
Process ishlab turgan bo‘lsa ham, ilovaning o‘zi ishlamayotgan bo‘lishi mumkin.
Docker’dagi HEALTHCHECK instruction image ichida ilovaning haqiqatan ishlayotganini tekshiradigan command belgilash imkonini beradi. Keyin Docker starting, healthy va unhealthy kabi state’larni ko‘rsatadi. (docs.docker.com)
Web service uchun /health endpoint HTTP application request’larga javob bera olishini tekshirishi mumkin. Murakkabroq readiness check’lar dependency’larni ham tekshirishi mumkin, lekin health endpoint haddan tashqari murakkab bo‘lmasligi kerak. Aks holda tashqi service’dagi vaqtinchalik muammo keraksiz restart loop’larni keltirib chiqarishi mumkin.
Compose boshqa service’ni ishga tushirishdan oldin dependency service_healthy holatiga kelishini ham kutishi mumkin. (docs.docker.com)
Restart policy esa boshqa, lekin bog‘liq masalani hal qiladi:
restart: unless-stopped
Docker container exit qilganda yoki daemon restart bo‘lganda avtomatik qayta ishga tushirish uchun always, unless-stopped va on-failure policy’larini hujjatlashtiradi. (docs.docker.com)
Restart policy process failure’dan keyin tiklanishga yordam beradi. Lekin u monitoring o‘rnini bosmaydi va doimiy crash bo‘layotgan ilovani tuzatmaydi.
Network exposure’ni nazorat qiling
Docker port’larini publish qilishga ehtiyotkor yondashish kerak.
Masalan:
docker run -p 3000:3000 myapp
default holatda port’ni host’dagi barcha interface’larda publish qiladi. Docker hujjatlari bunday portlar tashqaridan ochilib qolishi mumkinligini aniq ko‘rsatadi. (docs.docker.com)
Agar application’ga faqat shu serverdagi reverse proxy murojaat qilishi kerak bo‘lsa, loopback interface’ga bind qilish keraksiz tashqi exposure’ni kamaytiradi:
ports:
- "127.0.0.1:3000:3000"
Database, Redis va ichki queue’lar faqat Docker’da ishlayotgani uchun public qilib ochilmasligi kerak.
INTERNAL LINK: Reverse Proxy Architecture Explained
Loglarni e’tiborsiz qoldirmang
Docker’ning default json-file logging driver’i default holatda log rotation qilmaydi. Ko‘p log chiqaradigan ilova vaqt o‘tishi bilan diskda katta hajm egallashi mumkin. Docker disk to‘lib qolishi xavfini kamaytirish uchun local logging driver’ni ko‘rib chiqishni tavsiya qiladi. (docs.docker.com)
Production muhitida quyidagi variantlardan biri ongli ravishda tanlanishi kerak:
- rotation bilan local loglar;
- loglarni boshqa tizimga yuboradigan logging driver;
- tashqi observability system.
Qaysi variant tanlanishidan qat’i nazar, loglar muammolarni tekshirish uchun yetarlicha vaqt saqlanishi kerak, lekin server diskini asta-sekin to‘ldirib yuboradigan darajada nazoratsiz qolmasligi kerak.
Amaliy Compose bazasi
Himoyasi kuchaytirilgan application service taxminan quyidagicha boshlanishi mumkin:
services:
app:
image: registry.example.com/myapp:1.4.0
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
cpus: 1.0
mem_limit: 512m
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
logging:
driver: local
Bu universal template emas, faqat boshlang‘ich nuqta. read_only: true yoziladigan directory kerak bo‘lgan ilovalarni buzishi mumkin, barcha capability’larni olib tashlash esa ayrim kerakli software’larni ishlamay qolishiga olib kelishi mumkin. Shu sababli production hardening least privilege tamoyiliga amal qilishi kerak, ilova qanday ishlashidan qat’i nazar maksimal cheklov qo‘yish tamoyiliga emas. Compose bu service-level sozlamalarni bevosita qo‘llab-quvvatlaydi. (docs.docker.com)
Production’dagi keng tarqalgan xatolar
Production’da Docker bilan bog‘liq muammolarning ko‘pi container’ning o‘zidan emas, deployment qarorlaridan kelib chiqadi. Masalan: keraksiz joyda root bilan ishga tushirish, controlled update jarayonisiz mutable latest tag’dan foydalanish, database data’ni container layer ichida saqlash, ichki portlarni public qilish, memory limit bermaslik, credential’larni image ichiga joylash, loglarning cheksiz o‘sishiga yo‘l qo‘yish yoki container restart’ni monitoring o‘rniga ishlatish.
Yana bir keng tarqalgan xato — production’da application source directory’ni host’dan mount qilish. Docker’ning production uchun Compose tavsiyalarida development-oriented code bind mount’larni olib tashlash va deploy qilingan application code’ni image ichida qoldirish tavsiya qilinadi. (docs.docker.com)
Qachon Docker Compose yetarli?
Agar bitta host yetarli bo‘lsa va jamoa shu host’ni infratuzilma chegarasi sifatida qabul qila olsa, Docker Compose production uchun mantiqli variant bo‘lishi mumkin.
Reverse proxy, application container’lar, Redis va ehtimol database’dan iborat setup operatsion jihatdan sodda bo‘lib qolishi mumkin.
Bir nechta server o‘rtasida avtomatik scheduling, node-level failover, katta service discovery, coordinated rolling deployment yoki keng horizontal scaling kerak bo‘la boshlasa, talablar o‘zgaradi. Shu nuqtada savol Docker production’da ishlaydimi yoki yo‘qmi degan savol emas. Savol containerlarni qaysi orchestration platform boshqarishi kerakligiga aylanadi.
INTERNAL LINK: Docker Compose vs Container Orchestration
SeoNest tavsiyasi
Docker production deployment’iga bitta Dockerfile sifatida emas, butun tizim sifatida qarang.
Minimal foydali production model quyidagicha:
source code → CI build and test → immutable image → registry → controlled deployment → health verification → monitoring → rollback
Persistent state’ni almashtiriladigan application container’lardan tashqarida saqlang. Privilege va ochiq portlarni cheklang. Resource limit’larni real o‘lchov asosida belgilang. Credential’larni image’dan mustaqil himoyalang. Backup’ni avtomatlashtiring va restore jarayonini test qiling.
Docker ilovani package qilishni soddalashtiradi. Bu package’ni ishonchli qiladigan narsa esa production engineering hisoblanadi.
FAQ
Docker Compose production uchun xavfsizmi?
Bo‘lishi mumkin. Docker Compose’ni production va single-host deployment uchun rasman hujjatlashtiradi. U aynan sizning ilovangiz uchun to‘g‘ri tanlovmi yoki yo‘qmi, availability, scaling va operational talablaringizga bog‘liq.
Container’larni root bilan ishga tushirish kerakmi?
Faqat ilovaga haqiqatan ham shunday privilege kerak bo‘lsa. Docker root’siz ishlay oladigan service’lar uchun USER ishlatishni tavsiya qiladi. (docs.docker.com)
Production’da latest ishlatish kerakmi?
Mutable tag aniq deployment’ni qayta takrorlashni qiyinlashtiradi. Versioned tag yoki digest pinning ko‘proq nazorat beradi, lekin update’lar faol boshqarib borilishi kerak. (docs.docker.com)
Docker volume’lar uchun backup kerakmi?
Ha. Volume container lifecycle’dan tashqarida data’ni saqlaydi, lekin avtomatik disaster recovery bermaydi.
restart: always ilovani highly available qiladimi?
Yo‘q. U yiqilgan container’ni ayni Docker host’da qayta ishga tushirishi mumkin. U host failure’dan himoya qilmaydi va ilova nima sababdan yiqilganini aniqlamaydi.
Yakun
Container muvaffaqiyatli ishga tushgani Docker production-ready degani emas. Docker production-ready tizimning bir qismiga aylanishi uchun image’lar reproducible bo‘lishi, privilege va resurslar nazorat qilinishi, state himoyalanishi, failure aniqlanishi, loglar boshqarilishi, network exposure ongli ravishda sozlanishi va deployment’ni tiklash yoki rollback qilish imkoniyati bo‘lishi kerak.
Container — tizimning almashtiriladigan qismi. Ishonchlilikni esa uning atrofidagi production arxitektura ta’minlaydi.
Sources
- Docker — Building best practices. Docker Build best practices
- Docker — Use Compose in production. Compose in production
- Docker — Docker Engine security. Docker Engine security
- Docker — Rootless mode. Docker Rootless mode
- Docker — Resource constraints. Docker resource constraints
- Docker — Configure logging drivers. Docker logging drivers
- Docker — Volumes. Docker volumes
- Docker — Build secrets. Docker build secrets
- Docker — Dockerfile reference. Dockerfile reference
- Docker — Port publishing and mapping. Docker port publishing


