Docker Compose үндэс
Өмнөх хичээлүүдэд олон container ажиллуулахад маш урт docker run командууд бичсэн. Docker Compose нь бүгдийг нэг YAML файлд тодорхойлж, нэг командаар ажиллуулдаг хэрэгсэл.
Яагаад Compose хэрэгтэй вэ?
Compose байхгүй үед (12-р хичээлийн жишээ):
docker network create appnet
docker run -d \
--name postgres \
--network appnet \
-v pg-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=mydb \
postgres:16
docker run -d \
--name redis \
--network appnet \
redis:7-alpine
docker run -d \
--name app \
--network appnet \
-p 3000:3000 \
--env-file .env \
myapp:1.0
Compose байхад:
docker compose up -d
Нэг командаар бүгд ажиллана.
docker-compose.yml бүтэц
services: # Container-уудын тодорхойлолт
service_name:
# ... тохиргоо
networks: # Custom network-ууд (заавал биш)
network_name:
driver: bridge
volumes: # Named volume-ууд (заавал биш)
volume_name:
services
Аппликейшний бүрэлдэхүүн хэсэг бүр нэг service. Service нэр нь DNS нэр болно — container-ууд хоорондоо нэрээр хандана.
services:
web: # "web" нэрээр хандаж болно
image: nginx
api: # "api" нэрээр хандаж болно
image: myapp:1.0
db: # "db" нэрээр хандаж болно
image: postgres:16
networks
Compose автоматаар default network үүсгэдэг — бүх service тэр network-т орно. Өөрийн network тодорхойлж болно:
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes
Named volume тодорхойлох:
volumes:
pg-data: # Анхдагч driver (local)
redis-data:
driver: local
Хамгийн энгийн жишээ
docker-compose.yml:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
docker compose up
http://localhost:8080 — Nginx welcome хуудас.
Nginx + статик сайт
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
./html директорт index.html файл тавихад шууд харагдана.
Хэд хэдэн service
services:
frontend:
image: nginx:alpine
ports:
- "80:80"
backend:
image: node:20-alpine
working_dir: /app
command: node server.js
ports:
- "3000:3000"
database:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Compose файлын байршил
myproject/
├── docker-compose.yml ← Энд байна
├── .env ← Compose автоматаар уншина
├── app/
│ ├── Dockerfile
│ └── index.js
└── nginx/
└── nginx.conf
Compose командыг docker-compose.yml байгаа директорт ажиллуулна.
.env файлтай хамтран ажиллах
Compose docker-compose.yml-тэй нэг директорт байгаа .env файлыг автоматаар уншина:
.env:
POSTGRES_PASSWORD=supersecret
POSTGRES_DB=myapp_db
APP_PORT=3000
docker-compose.yml:
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
app:
image: myapp:1.0
ports:
- "${APP_PORT}:3000"
${VARIABLE} синтакс нь .env файлаас утга авна.
Compose ба Docker network
Compose нь projectname_default нэртэй network автоматаар үүсгэнэ. Бүх service тэр network-т орно — нэрээр хандах боломжтой.
services:
app:
image: myapp
environment:
DB_HOST: db # "db" service-ийн нэр = DNS нэр
db:
image: postgres:16
app container дотор db нэрээр PostgreSQL-д хандана.
version талбар (хуучирсан)
Хуучин Compose файлуудад version: "3.8" байдаг. Орчин үеийн Docker Compose-д энэ шаардлагагүй болсон:
# ✅ Орчин үеийн хэлбэр (version талбаргүй)
services:
web:
image: nginx
# ⚠️ Хуучин хэлбэр (ажиллана, гэхдээ шаардлагагүй)
version: "3.8"
services:
web:
image: nginx
Compose суулгах
Docker Desktop суулгасан бол Compose аль хэдийн байна:
docker compose version
# Docker Compose version v2.27.0
Linux-т тусад нь суулгах:
sudo apt install docker-compose-plugin
Анхаар: docker-compose (хуучин v1) ба docker compose (шинэ v2) хоёр ялгаатай. Шинэ docker compose (зай бүхий) ашиглана.
Дараагийн хичээлд:
Service-ийн тохиргооны бүх сонголтыг нарийвчлан судлах — build, depends_on, restart, healthcheck зэрэг.