Docker / Compose volume ба network

Compose volume ба network

Docker Compose нь volume болон network-ийг автоматаар удирддаг. Энэ хичээлд тэдгээрийн нарийн тохиргоо болон service discovery механизмыг судална.

Compose-д volume

Named volume

yaml
services:
  db:
    image: postgres:16
    volumes:
      - pg-data:/var/lib/postgresql/data

  storage:
    image: minio/minio
    volumes:
      - minio-data:/data

volumes:
  pg-data: # Энгийн тодорхойлолт
  minio-data:
    driver: local # Тодорхой driver (local анхдагч)

Compose docker volume create автоматаар ажиллуулна. Volume нэр нь projectname_volumename хэлбэртэй болно:

bash
docker volume ls
# DRIVER    VOLUME NAME
# local     myapp_pg-data
# local     myapp_minio-data

Volume driver сонголт

yaml
volumes:
  logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /var/log/myapp # Host дахь тодорхой директор

Гадны volume ашиглах

Compose-оос гадна үүссэн volume-ийг external: true-ээр ашиглана:

yaml
volumes:
  existing-data:
    external: true # Compose үүсгэхгүй, байгаа volume ашиглана
bash
# Эхлээд гараар үүсгэсэн байх ёстой
docker volume create existing-data

Bind mount

yaml
services:
  app:
    volumes:
      # Богино хэлбэр
      - ./src:/app/src
      - ./config.json:/app/config.json:ro

      # Урт хэлбэр (илүү тодорхой)
      - type: bind
        source: ./src
        target: /app/src
        read_only: false

      # Anonymous volume (node_modules хамгаалах)
      - /app/node_modules

Compose-д network

Анхдагч network

Compose нь projectname_default network автоматаар үүсгэнэ — тусад нь тодорхойлох шаардлагагүй.

yaml
services:
  app:
    image: myapp # projectname_default network-т орно
  db:
    image: postgres # projectname_default network-т орно

app service нь db нэрээр хандаж болно.

Custom network

yaml
services:
  nginx:
    image: nginx
    networks:
      - frontend

  app:
    image: myapp
    networks:
      - frontend
      - backend

  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true # Гаднаас хандах боломжгүй
код
Интернет → nginx (frontend) → app (frontend+backend) → db (backend)

db нь frontend network-т байхгүй тул nginx шууд хандаж чадахгүй.

Network alias

Service нэмэлт нэрээр хандах боломж:

yaml
services:
  db:
    image: postgres:16
    networks:
      backend:
        aliases:
          - database
          - postgres-main

networks:
  backend:

app service нь db, database, postgres-main гурван нэрийн аль нэгээр хандаж болно.

Гадны network ашиглах

yaml
networks:
  existing-net:
    external: true # Compose үүсгэхгүй, байгаа network ашиглана

Service discovery механизм

Compose-д service нэр нь автоматаар DNS нэр болно. Нэмэлт тохиргоогүйгээр container-ууд хоорондоо нэрээр хандана.

Жишээ: app нь db-д хандах:

yaml
services:
  app:
    environment:
      DB_HOST: db # "db" service-ийн DNS нэр
      REDIS_URL: redis://cache:6379 # "cache" service-ийн DNS нэр

  db:
    image: postgres:16

  cache:
    image: redis:7-alpine

Container дотроос ping db хийж шалгаж болно:

bash
docker compose exec app ping db
# PING db (172.20.0.3): 56 data bytes

Бүтэн жишээ — 3 давхаргат архитектур

yaml
services:
  # --- Frontend давхарга ---
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - static-files:/usr/share/nginx/html:ro
    networks:
      - frontend
    depends_on:
      - api
    restart: unless-stopped

  # --- Backend давхарга ---
  api:
    build: ./api
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - REDIS_HOST=cache
      - DB_PASSWORD=${DB_PASSWORD}
    networks:
      - frontend
      - backend
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    restart: unless-stopped

  # --- Data давхарга ---
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    volumes:
      - pg-data:/var/lib/postgresql/data
      - ./db/init:/docker-entrypoint-initdb.d:ro
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      retries: 5
    restart: unless-stopped

  cache:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    networks:
      - backend
    command: redis-server --appendonly yes
    restart: unless-stopped

networks:
  frontend:
  backend:
    internal: true

volumes:
  pg-data:
  redis-data:
  static-files:

Ажиллуулах:

bash
docker compose up -d

# Бүх service-ийн төлөв
docker compose ps

# Network шалгах
docker network ls
docker network inspect myapp_backend

Volume ба network устгах

bash
# Service зогсоох (volume, network хадгална)
docker compose stop

# Service, network устгах (volume хадгална)
docker compose down

# Бүгдийг устгах (volume ч устгана)
docker compose down -v

# Image ч устгах
docker compose down -v --rmi all

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

docker compose up, down, logs, exec, ps, build зэрэг өдөр тутмын командуудыг дэлгэрэнгүй судална.