Compose volume ба network
Docker Compose нь volume болон network-ийг автоматаар удирддаг. Энэ хичээлд тэдгээрийн нарийн тохиргоо болон service discovery механизмыг судална.
Compose-д volume
Named volume
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 хэлбэртэй болно:
docker volume ls
# DRIVER VOLUME NAME
# local myapp_pg-data
# local myapp_minio-data
Volume driver сонголт
volumes:
logs:
driver: local
driver_opts:
type: none
o: bind
device: /var/log/myapp # Host дахь тодорхой директор
Гадны volume ашиглах
Compose-оос гадна үүссэн volume-ийг external: true-ээр ашиглана:
volumes:
existing-data:
external: true # Compose үүсгэхгүй, байгаа volume ашиглана
# Эхлээд гараар үүсгэсэн байх ёстой
docker volume create existing-data
Bind mount
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 автоматаар үүсгэнэ — тусад нь тодорхойлох шаардлагагүй.
services:
app:
image: myapp # projectname_default network-т орно
db:
image: postgres # projectname_default network-т орно
app service нь db нэрээр хандаж болно.
Custom network
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 нэмэлт нэрээр хандах боломж:
services:
db:
image: postgres:16
networks:
backend:
aliases:
- database
- postgres-main
networks:
backend:
app service нь db, database, postgres-main гурван нэрийн аль нэгээр хандаж болно.
Гадны network ашиглах
networks:
existing-net:
external: true # Compose үүсгэхгүй, байгаа network ашиглана
Service discovery механизм
Compose-д service нэр нь автоматаар DNS нэр болно. Нэмэлт тохиргоогүйгээр container-ууд хоорондоо нэрээр хандана.
Жишээ: app нь db-д хандах:
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 хийж шалгаж болно:
docker compose exec app ping db
# PING db (172.20.0.3): 56 data bytes
Бүтэн жишээ — 3 давхаргат архитектур
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:
Ажиллуулах:
docker compose up -d
# Бүх service-ийн төлөв
docker compose ps
# Network шалгах
docker network ls
docker network inspect myapp_backend
Volume ба network устгах
# 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 зэрэг өдөр тутмын командуудыг дэлгэрэнгүй судална.