Docker / Dockerfile үндэс

Dockerfile үндэс

Dockerfile бол Docker image хэрхэн бүтээхийг заасан зааврын файл. Текст файл бөгөөд мөр бүр нь нэг зааврыг агуулна.

Dockerfile-ийн үндсэн зааврууд

FROM — суурь image

Dockerfile-ийн эхний заавар. Бусад бүх зааврын суурь image-ийг тодорхойлно.

dockerfile
FROM ubuntu:22.04
FROM node:20-alpine
FROM python:3.12-slim

scratch ашиглавал хоосон image-аас эхэлнэ (C/Go binary-д хэрэглэнэ).

RUN — команд ажиллуулах

Build явцад shell команд ажиллуулна. Шинэ layer үүснэ.

dockerfile
RUN apt update && apt install -y curl
RUN npm install
RUN pip install flask

Нэг RUN заавраар хэд хэдэн команд ажиллуулахад && ашиглана — layer цөөн байх тусам image жижиг.

COPY — файл хуулах

Host машинаас image-д файл хуулна.

dockerfile
COPY package.json .
COPY src/ ./src/
COPY . .

Эхний аргумент хуулах эх файл (host), хоёр дахь нь очих газар (image).

ADD — өргөтгөсөн хуулах

COPY-тэй адил боловч нэмэлт боломжтой:

dockerfile
# URL-аас файл татаж хуулах
ADD https://example.com/file.tar.gz /tmp/

# .tar.gz файлыг автоматаар задлах
ADD archive.tar.gz /app/

Ихэнх тохиолдолд COPY ашиглахыг зөвлөдөг — ADD хүлээгдэхгүй зан гаргадаг.

WORKDIR — ажлын директор

Дараах зааврууд хаана ажиллахыг тодорхойлно. Директор байхгүй бол автоматаар үүснэ.

dockerfile
WORKDIR /app
RUN npm install    # /app дотор ажиллана
COPY . .           # /app дотор хуулна

EXPOSE — port зарлах

Container ямар port сонсохыг баримтжуулна. Бодит port нээхгүй — зөвхөн мэдээлэл.

dockerfile
EXPOSE 3000
EXPOSE 8080

Бодит port нээхийн тулд docker run -p ашиглана (9-р хичээлд үзнэ).

ENV — environment variable

dockerfile
ENV NODE_ENV=production
ENV PORT=3000
ENV DB_HOST=localhost DB_PORT=5432

Container ажиллах үед эдгээр хувьсагч байна.

CMD — үндсэн команд

Container эхлэхэд ажиллах үндсэн командыг тодорхойлно. Зөвхөн нэг CMD байна.

dockerfile
CMD ["node", "server.js"]
CMD ["python", "app.py"]
CMD ["nginx", "-g", "daemon off;"]

JSON хэлбэр (["команд", "аргумент"]) ашиглахыг зөвлөдөг.

ENTRYPOINT — оролтын цэг

CMD-тэй адил боловч docker run-д аргумент дамжуулахад ашиглана.

dockerfile
ENTRYPOINT ["node"]
CMD ["server.js"]
bash
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:

javascript
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:

json
{
  "name": "myapp",
  "version": "1.0.0",
  "main": "server.js"
}

Dockerfile:

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 хийх:

bash
docker build -t myapp:1.0 .

Ажиллуулах:

bash
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 жижиг байлга:

dockerfile
# Муу — 1.1GB
FROM ubuntu:22.04

# Сайн — 180MB
FROM node:20

# Хамгийн сайн — 40MB
FROM node:20-alpine

2. Layer-ийг оновчтой эрэмбэлэх:

dockerfile
# Муу — код өөрчлөгдөх бүрт npm install давтагдана
COPY . .
RUN npm install

# Сайн — package.json өөрчлөгдөөгүй бол cache ашиглана
COPY package*.json ./
RUN npm install
COPY . .

3. RUN командуудыг нэгтгэх:

dockerfile
# Муу — 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-ийн хэмжээг хэрхэн багасгахыг үзнэ.