Dockerfile asoslari — FROM, COPY, RUN, CMD, docker build

~15 daq · Docker · Dockerfile — o'z image ingiz

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.json dagi aniq versiyalar; npm install dan qat'iyroq va tezroq. Image larda — doim ci
  • --omit=dev — production image ga dev paketlar (nodemon, eslint) kerak emas
  • Avval package.json, keyin kod — tartib ataylab: kod o'zgarganda npm ci qayta 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: COPY faqat shu papkadan
  • FROM — asos (aniq teg); WORKDIR — ishchi papka
  • COPY — fayllarni image ga; RUN — build paytida buyruq
  • CMD — konteyner ishga tushganda; bittasi ishlaydi
  • Node.js: avval package*.json → npm ci --omit=dev → keyin COPY . .
  • Kod o'zgarsa — qayta build

Keyingi dars

13-dars: Instruksiyalar — WORKDIR, ENV, ARG, EXPOSE, USER, ENTRYPOINT