CPU ба memory хязгаарлалт
Хязгаарлалтгүй container нь хөрш container-уудын нөөцийг залгиж болно. Нэг апп санах ой дүүргэвэл бүх сервис унана. Нөөцийн хязгаарлалт тавих нь production-д заавал хийх ёстой.
Memory хязгаарлалт
# 512MB хязгаарлалт
docker run -d --memory 512m --name myapp myimage
# 1GB
docker run -d --memory 1g --name myapp myimage
# Swap-тай хамт
docker run -d --memory 512m --memory-swap 1g --name myapp myimage
--memory-swap нь нийт санах ой + swap. Дээрх жишээнд:
- RAM: 512MB
- Swap: 512MB (нийт 1GB — RAM)
Swap унтраах:
docker run -d --memory 512m --memory-swap 512m myapp
# memory == memory-swap → swap байхгүй
OOMKilled — санах ой дүүрсэн
Container-ийн апп хязгаараас илүү санах ой ашиглавал Linux kernel SIGKILL дохио илгээнэ — OOMKilled (Out Of Memory Killed):
docker inspect --format='{{.State.OOMKilled}}' mycontainer
# true ← OOMKilled болсон
docker inspect --format='{{.State.ExitCode}}' mycontainer
# 137 ← SIGKILL-ийн exit код
OOMKilled болсон container-ийг илрүүлэх:
# Бүх container-ийн OOM төлөв
docker inspect $(docker ps -aq) --format='{{.Name}} OOM:{{.State.OOMKilled}}'
OOMKilled шийдэх алхмууд
# 1. Хичнээн санах ой ашигласныг харах
docker stats --no-stream mycontainer
# 2. Хязгаарыг нэмэх
docker run -d --memory 1g myimage
# 3. Эсвэл аппликейшний санах ой хэрэглээг оновчлох
CPU хязгаарлалт
# 0.5 CPU core (50%)
docker run -d --cpus 0.5 --name myapp myimage
# 1.5 CPU core
docker run -d --cpus 1.5 --name myapp myimage
# CPU хязгаарлалтгүй — хэвийн ажиллагааг бус зөвхөн priority тохируулах
docker run -d --cpu-shares 512 myapp # анхдагч 1024
--cpus нь хэдэн CPU core ашиглахыг хязгаарлана. 0.5 гэдэг нь 2 core дээр 25% + 25%, эсвэл 1 core дээр 50% гэсэн утгатай.
Хязгаарлалт шалгах
# Тохируулсан хязгаарлалтыг харах
docker inspect --format='{{.HostConfig.Memory}}' mycontainer
# 536870912 (512MB байт-аар)
docker inspect --format='{{.HostConfig.NanoCpus}}' mycontainer
# 500000000 (0.5 CPU — nano CPU-аар)
# Бодит хэрэглээ
docker stats --no-stream mycontainer
Docker Compose-д resource хязгаарлалт
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
reservations:
cpus: "0.25"
memory: 256M
db:
image: postgres:16
deploy:
resources:
limits:
cpus: "1.0"
memory: 1G
reservations:
cpus: "0.5"
memory: 512M
limits — хамгийн их ашиглаж болох
reservations — баталгаатай нөөцлөгдөх (хамгийн бага)
Анхааруулга: deploy.resources нь Swarm mode-д бүрэн дэмжигддэг. docker compose up дээр --compatibility flag шаардагдах тохиолдол бий:
docker compose --compatibility up
Эсвэл шууд mem_limit / cpus ашиглах:
services:
app:
image: myapp
mem_limit: 512m
cpus: 0.5
Практик жишээ: апп + database нөөц
services:
nginx:
image: nginx:alpine
mem_limit: 64m
cpus: 0.1
app:
build: .
mem_limit: 512m
cpus: 0.5
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
mem_limit: 1g
cpus: 1.0
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
retries: 5
Нөөцийн хэрэглээ хянах
# Бүх container-ийн нөөц бодит цагт
docker stats
# Нэг удаа хэвлэх
docker stats --no-stream
# Форматлах
docker stats --no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"
Гаралт:
NAME CPU % MEM USAGE / LIMIT MEM %
app 12.3% 145MiB / 512MiB 28.3%
db 3.1% 312MiB / 1GiB 30.5%
nginx 0.1% 8MiB / 64MiB 12.5%
Зөвлөмж
| Сервис | Memory | CPU | | ----------- | --------- | -------- | | Node.js апп | 256–512MB | 0.25–0.5 | | Python апп | 256–512MB | 0.25–0.5 | | PostgreSQL | 512MB–2GB | 0.5–1.0 | | Redis | 128–256MB | 0.1–0.25 | | Nginx | 32–64MB | 0.1 |
Эдгээр нь зөвхөн эхлэлийн утгууд — docker stats-аар хэмжиж, тохируулна.
Дараагийн хичээлд:
GitHub Actions ашиглан CI/CD pipeline-д Docker image автоматаар build ба push хийх.