Dockerfile үндэс
Dockerfile бол Docker image хэрхэн бүтээхийг заасан зааврын файл. Текст файл бөгөөд мөр бүр нь нэг зааврыг агуулна.
Dockerfile-ийн үндсэн зааврууд
FROM — суурь image
Dockerfile-ийн эхний заавар. Бусад бүх зааврын суурь image-ийг тодорхойлно.
FROM ubuntu:22.04
FROM node:20-alpine
FROM python:3.12-slim
scratch ашиглавал хоосон image-аас эхэлнэ (C/Go binary-д хэрэглэнэ).
RUN — команд ажиллуулах
Build явцад shell команд ажиллуулна. Шинэ layer үүснэ.
RUN apt update && apt install -y curl
RUN npm install
RUN pip install flask
Нэг RUN заавраар хэд хэдэн команд ажиллуулахад && ашиглана — layer цөөн байх тусам image жижиг.
COPY — файл хуулах
Host машинаас image-д файл хуулна.
COPY package.json .
COPY src/ ./src/
COPY . .
Эхний аргумент хуулах эх файл (host), хоёр дахь нь очих газар (image).
ADD — өргөтгөсөн хуулах
COPY-тэй адил боловч нэмэлт боломжтой:
# URL-аас файл татаж хуулах
ADD https://example.com/file.tar.gz /tmp/
# .tar.gz файлыг автоматаар задлах
ADD archive.tar.gz /app/
Ихэнх тохиолдолд COPY ашиглахыг зөвлөдөг — ADD хүлээгдэхгүй зан гаргадаг.
WORKDIR — ажлын директор
Дараах зааврууд хаана ажиллахыг тодорхойлно. Директор байхгүй бол автоматаар үүснэ.
WORKDIR /app
RUN npm install # /app дотор ажиллана
COPY . . # /app дотор хуулна
EXPOSE — port зарлах
Container ямар port сонсохыг баримтжуулна. Бодит port нээхгүй — зөвхөн мэдээлэл.
EXPOSE 3000
EXPOSE 8080
Бодит port нээхийн тулд docker run -p ашиглана (9-р хичээлд үзнэ).
ENV — environment variable
ENV NODE_ENV=production
ENV PORT=3000
ENV DB_HOST=localhost DB_PORT=5432
Container ажиллах үед эдгээр хувьсагч байна.
CMD — үндсэн команд
Container эхлэхэд ажиллах үндсэн командыг тодорхойлно. Зөвхөн нэг CMD байна.
CMD ["node", "server.js"]
CMD ["python", "app.py"]
CMD ["nginx", "-g", "daemon off;"]
JSON хэлбэр (["команд", "аргумент"]) ашиглахыг зөвлөдөг.
ENTRYPOINT — оролтын цэг
CMD-тэй адил боловч docker run-д аргумент дамжуулахад ашиглана.
ENTRYPOINT ["node"]
CMD ["server.js"]
docker run myapp # node server.js ажиллана
docker run myapp other.js # node other.js ажиллана
Энгийн Node.js Dockerfile
Дараах файл бүтэцтэй Node.js аппликейшний жишээ:
myapp/
├── Dockerfile
├── package.json
├── package-lock.json
└── server.js
server.js:
const http = require("http");
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("Сайн уу, Docker!\n");
});
server.listen(3000, () => {
console.log("Сервер 3000 port-д ажиллаж байна");
});
package.json:
{
"name": "myapp",
"version": "1.0.0",
"main": "server.js"
}
Dockerfile:
# 1. Суурь image — Node.js 20 LTS, Alpine Linux дээр
FROM node:20-alpine
# 2. Ажлын директор тохируулах
WORKDIR /app
# 3. package.json эхлээд хуулах (cache ашиглахын тулд)
COPY package*.json ./
# 4. Dependencies суулгах
RUN npm install
# 5. Бусад файл хуулах
COPY . .
# 6. Port зарлах
EXPOSE 3000
# 7. Аппликейшн эхлүүлэх
CMD ["node", "server.js"]
Build хийх:
docker build -t myapp:1.0 .
Ажиллуулах:
docker run -p 3000:3000 myapp:1.0
Browser-т http://localhost:3000 нээхэд "Сайн уу, Docker!" харагдана.
.dockerignore файл
.gitignore-тэй адил — image-д хуулахгүй файлуудыг жагсаана.
node_modules
.git
.env
*.log
README.md
node_modules хуулахгүй байх нь чухал — image дотор npm install хийж суулгана.
Dockerfile шилдэг туршлага
1. Суурь image жижиг байлга:
# Муу — 1.1GB
FROM ubuntu:22.04
# Сайн — 180MB
FROM node:20
# Хамгийн сайн — 40MB
FROM node:20-alpine
2. Layer-ийг оновчтой эрэмбэлэх:
# Муу — код өөрчлөгдөх бүрт npm install давтагдана
COPY . .
RUN npm install
# Сайн — package.json өөрчлөгдөөгүй бол cache ашиглана
COPY package*.json ./
RUN npm install
COPY . .
3. RUN командуудыг нэгтгэх:
# Муу — 3 давхарга
RUN apt update
RUN apt install -y curl
RUN apt clean
# Сайн — 1 давхарга
RUN apt update && apt install -y curl && apt clean && rm -rf /var/lib/apt/lists/*
Дараагийн хичээлд:
Layer ба cache-ийн механизмыг нарийвчлан судлж, image-ийн хэмжээг хэрхэн багасгахыг үзнэ.