Dockerfile asoslari — FROM, COPY, RUN, CMD, docker build
Muammodan boshlaylik
Tayyor image lar (nginx, mysql) — ajoyib. Lekin sizning ilovangiz — Node.js API, Laravel sayti, Python bot — Docker Hub da yo'q. Uni qanday konteynerga aylantirish kerak?
4-darsda docker commit ni ko'rdik va nima uchun yomonligini aytdik: image qanday yasalgani hech qayerda yozilmagan. To'g'ri yo'l — Dockerfile: image ni qanday yasashni qadam-baqadam yozilgan retsept. Kod sifatida, Git da, istalgan vaqtda takrorlanadigan.
Birinchi Dockerfile
Oddiy Node.js server. server.js:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ xabar: 'Salom, Docker!', vaqt: new Date() }));
});
server.listen(3000, '0.0.0.0', () => console.log('Server 3000-portda'));
Xuddi shu papkada — Dockerfile (kengaytmasiz, bosh harf bilan):
FROM node:22-alpine
WORKDIR /app
COPY server.js .
CMD ["node", "server.js"]
Image yasash:
docker build -t salom-api .
[+] Building 4.2s (8/8) FINISHED
=> [1/3] FROM docker.io/library/node:22-alpine
=> [2/3] WORKDIR /app
=> [3/3] COPY server.js .
=> exporting to image
=> => naming to docker.io/library/salom-api
Ishga tushirish:
docker run -d --name api -p 3000:3000 salom-api
curl http://localhost:3000
# {"xabar":"Salom, Docker!","vaqt":"2026-11-05T..."}
Sizning ilovangiz — endi image. Uni istalgan Docker o'rnatilgan kompyuterda bir xil ishga tushirish mumkin.
Buyruqni tahlil qilamiz
docker build -t salom-api .
| Qism | Ma'nosi |
|---|---|
docker build |
Dockerfile dan image yasash |
-t salom-api |
Teg (nom); -t salom-api:1.0 — versiya bilan |
. |
Build konteksti — Docker ga yuboriladigan papka (COPY faqat shu papkadan oladi) |
Boshqa nomdagi Dockerfile: docker build -f Dockerfile.dev -t ilova:dev .
Asosiy instruksiyalar
FROM — asos image
FROM node:22-alpine
Har bir Dockerfile FROM bilan boshlanadi. Siz noldan emas, tayyor image ustiga qurasiz: OS + Node.js allaqachon bor. Aniq teg — 5-darsdagi qoida.
WORKDIR — ishchi papka
WORKDIR /app
Keyingi barcha buyruqlar (COPY, RUN, CMD) shu papkada. Papka yo'q bo'lsa — yaratiladi. RUN cd /app emas — har bir RUN alohida ishlaydi va cd keyingisiga o'tmaydi.
COPY — fayllarni image ga
COPY server.js . # bitta fayl → /app/server.js
COPY package*.json ./ # naqsh bilan
COPY src/ ./src/ # papka
COPY . . # butun kontekst (ehtiyot bo'ling — 15-dars)
Manba — build kontekstiga nisbatan; manzil — konteyner ichida (WORKDIR ga nisbatan).
RUN — build paytida buyruq bajarish
RUN npm install
RUN apk add --no-cache curl
RUN — image yasalayotganda bajariladi; natijasi image qatlamiga yoziladi. Paket o'rnatish, kompilyatsiya.
CMD — konteyner ishga tushganda
CMD ["node", "server.js"]
CMD — image yasalganda emas, konteyner ishga tushganda bajariladi. Faqat bitta CMD ishlaydi (oxirgisi). docker run image boshqa-buyruq uni almashtiradi (6-dars).
RUN |
CMD |
|
|---|---|---|
| Qachon | Build paytida | Konteyner ishga tushganda |
| Nechta | Istalgancha | Bitta (oxirgisi) |
| Natija | Image qatlami | Konteynerning asosiy jarayoni |
Haqiqiy Node.js loyihasi
package.json bilan Express ilova:
FROM node:22-alpine
WORKDIR /app
# 1. Avval faqat package fayllar — kesh uchun (14-dars)
COPY package.json package-lock.json ./
# 2. Bog'liqliklar
RUN npm ci --omit=dev
# 3. Keyin kod
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
npm ci—package-lock.jsondagi aniq versiyalar;npm installdan qat'iyroq va tezroq. Image larda — doimci--omit=dev— production image ga dev paketlar (nodemon, eslint) kerak emas- Avval
package.json, keyin kod — tartib ataylab: kod o'zgargandanpm ciqayta bajarilmaydi. 14-darsda batafsil
.dockerignore (15-dars) — node_modules va .git ni kontekstdan chiqarish uchun — majburiy:
node_modules
.git
.env
Image ni yangilash
Kodni o'zgartirdingiz — image avtomatik o'zgarmaydi. Qayta yasash kerak:
docker build -t salom-api .
docker rm -f api
docker run -d --name api -p 3000:3000 salom-api
Ishlab chiqish paytida har o'zgarishda qayta build — noqulay. 20 va 30-darslarda kodni konteynerga ulab, hot reload bilan ishlashni ko'ramiz. Dockerfile — asosan production va jamoa uchun.
Nima uchun shunday?
Nima uchun Dockerfile ni yozish docker commit dan yaxshiroq — natija bir xil image-ku?
Natija o'xshash, lekin Dockerfile — hujjat va kod. Uni o'qib, image ichida nima borligini aniq bilasiz. Git da — kim, qachon, nima uchun o'zgartirgani ko'rinadi. Kod reviewda tekshiriladi. Bir yildan keyin asos image xavfsizlik yangilanishi oldi — bitta docker build va yangi, xavfsiz image tayyor. commit qilingan image esa — "qora quti": uni takrorlash uchun qaysi buyruqlar bajarilganini eslash kerak. Bu "Infrastructure as Code" tamoyilining eng oddiy ko'rinishi.
Xulosa
Eslab qoling:
Dockerfile— image retsepti;docker build -t nom ..— build konteksti:COPYfaqat shu papkadanFROM— asos (aniq teg);WORKDIR— ishchi papkaCOPY— fayllarni image ga;RUN— build paytida buyruqCMD— konteyner ishga tushganda; bittasi ishlaydi- Node.js: avval
package*.json→npm ci --omit=dev→ keyinCOPY . . - Kod o'zgarsa — qayta build
Keyingi dars
13-dars: Instruksiyalar — WORKDIR, ENV, ARG, EXPOSE, USER, ENTRYPOINT