DEV Community

Laptop Hưng Phát
Laptop Hưng Phát

Posted on Originally published at technologyspot.vn

Docker Compose tiện lợi nhưng ngốn RAM khi thiếu cấu hình chuẩn

Đóng gói toàn bộ môi trường phát triển gồm PostgreSQL, Redis, Backend API và Frontend vào Docker Compose giúp đồng nhất môi trường cục bộ, nhưng cái giá phải trả là chi phí tài nguyên và độ trễ I/O hệ thống.

Kiểm soát giới hạn tài nguyên và điều phối khởi động

Khi chạy đồng thời 4 dịch vụ, máy trạm 16GB RAM rất dễ rơi vào tình trạng tràn bộ nhớ nếu các container không được giới hạn trần tiêu thụ. Trình biên dịch frontend kết hợp cùng cơ sở dữ liệu có thể kích hoạt OOM Killer của hệ điều hành, làm sập toàn bộ phiên làm việc. Cấu hình 32GB RAM đem lại biên an toàn rộng hơn, nhưng về mặt kỹ thuật, việc cô lập tài nguyên cho từng tiến trình vẫn là quy tắc bắt buộc để tránh hiện tượng một dịch vụ chiếm dụng toàn bộ bộ nhớ đệm.

Bên cạnh RAM, cơ chế khởi động theo thứ tự cũng cần được xử lý chuẩn xác. Chỉ dùng depends_on đơn thuần sẽ khiến API khởi chạy ngay khi container database vừa tạo xong thay vì lúc socket database sẵn sàng tiếp nhận kết nối. Việc bổ sung healthcheck kết hợp condition: service_healthy giải quyết triệt để lỗi crash loop khi khởi động stack.

Xử lý nghẽn I/O trên WSL2 và mẫu compose hoàn chỉnh

Vấn đề phổ biến nhất trên môi trường Windows WSL2 là tính năng Hot Module Replacement (file watcher) của frontend phản hồi cực chậm. Bản chất nằm ở độ trễ của giao thức 9P khi Docker truy cập file qua bind mount từ phân vùng ổ đĩa Windows (/mnt/c). Giải pháp tối ưu là lưu trữ mã nguồn trực tiếp trong filesystem của Linux, đồng thời dùng anonymous volume để giữ node_modules độc lập bên trong container.

Tương tự cách tối ưu hóa chi phí vận hành thiết bị được phân tích tại TechnologySpot, việc chuẩn hóa cấu hình môi trường giúp lập trình viên kiểm soát triệt để hao phí phần cứng.

version: '3.8'
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: app_dev
      POSTGRES_PASSWORD: dev_secret
    deploy:
      resources:
        limits:
          memory: 512M
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5

  redis:
    image: redis:7-alpine
    deploy:
      resources:
        limits:
          memory: 256M

  api:
    build: ./api
    depends_on:
      postgres:
        condition: service_healthy
    deploy:
      resources:
        limits:
          memory: 1024M

  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    ports:
      - "3000:3000"
Enter fullscreen mode Exit fullscreen mode

Hãy chuyển toàn bộ thư mục dự án vào phân vùng gốc của Linux trong WSL2 và thiết lập trần RAM cho từng container ngay từ ngày đầu dựng stack.

Top comments (0)