Docker / Docker Compose үндэс

Docker Compose үндэс

Өмнөх хичээлүүдэд олон container ажиллуулахад маш урт docker run командууд бичсэн. Docker Compose нь бүгдийг нэг YAML файлд тодорхойлж, нэг командаар ажиллуулдаг хэрэгсэл.

Яагаад Compose хэрэгтэй вэ?

Compose байхгүй үед (12-р хичээлийн жишээ):

bash
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 байхад:

bash
docker compose up -d

Нэг командаар бүгд ажиллана.

docker-compose.yml бүтэц

yaml
services: # Container-уудын тодорхойлолт
  service_name:
    # ... тохиргоо

networks: # Custom network-ууд (заавал биш)
  network_name:
    driver: bridge

volumes: # Named volume-ууд (заавал биш)
  volume_name:

services

Аппликейшний бүрэлдэхүүн хэсэг бүр нэг service. Service нэр нь DNS нэр болно — container-ууд хоорондоо нэрээр хандана.

yaml
services:
  web: # "web" нэрээр хандаж болно
    image: nginx

  api: # "api" нэрээр хандаж болно
    image: myapp:1.0

  db: # "db" нэрээр хандаж болно
    image: postgres:16

networks

Compose автоматаар default network үүсгэдэг — бүх service тэр network-т орно. Өөрийн network тодорхойлж болно:

yaml
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

volumes

Named volume тодорхойлох:

yaml
volumes:
  pg-data: # Анхдагч driver (local)
  redis-data:
    driver: local

Хамгийн энгийн жишээ

docker-compose.yml:

yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
bash
docker compose up

http://localhost:8080 — Nginx welcome хуудас.

Nginx + статик сайт

yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro

./html директорт index.html файл тавихад шууд харагдана.

Хэд хэдэн service

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

env
POSTGRES_PASSWORD=supersecret
POSTGRES_DB=myapp_db
APP_PORT=3000

docker-compose.yml:

yaml
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-т орно — нэрээр хандах боломжтой.

yaml
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-д энэ шаардлагагүй болсон:

yaml
# ✅ Орчин үеийн хэлбэр (version талбаргүй)
services:
  web:
    image: nginx

# ⚠️ Хуучин хэлбэр (ажиллана, гэхдээ шаардлагагүй)
version: "3.8"
services:
  web:
    image: nginx

Compose суулгах

Docker Desktop суулгасан бол Compose аль хэдийн байна:

bash
docker compose version
# Docker Compose version v2.27.0

Linux-т тусад нь суулгах:

bash
sudo apt install docker-compose-plugin

Анхаар: docker-compose (хуучин v1) ба docker compose (шинэ v2) хоёр ялгаатай. Шинэ docker compose (зай бүхий) ашиглана.

Дараагийн хичээлд:

Service-ийн тохиргооны бүх сонголтыг нарийвчлан судлах — build, depends_on, restart, healthcheck зэрэг.