Triển khai Dozzle trên Docker: Giám sát log container theo thời gian thực cho HomeLab

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Sự bất tiện khi phải theo dõi log thủ công

Khi chạy hàng chục dịch vụ trên máy chủ gia đình, cửa sổ terminal của bạn gần như lúc nào cũng rơi vào tình trạng hỗn loạn. Một ứng dụng bị crash, bạn phải SSH vào máy chủ, gõ lệnh docker ps để lấy tên container, rồi chạy tiếp docker logs -f --tail 100 app_name. Rắc rối thực sự bắt đầu khi bạn cần debug các dịch vụ phụ thuộc lẫn nhau—chẳng hạn như Nextcloud báo lỗi 500 khi đang tương tác với Redis và PostgreSQL. Khi đó, bạn đột nhiên phải mở cùng lúc ba cửa sổ terminal chỉ để theo dõi một luồng xử lý request duy nhất.

Các giải pháp cấp doanh nghiệp như Grafana Loki hay Elasticsearch giải quyết rất tốt bài toán tập trung log, nhưng chúng đòi hỏi phần cứng vô cùng tốn kém. Một stack ELK hay Loki có thể ngốn từ 2 GB đến 4 GB RAM ngay cả khi chưa tiếp nhận lượng truy cập đáng kể nào. Khi toàn bộ hệ thống của bạn chỉ chạy trên một chiếc mini PC 16 GB RAM hay một chiếc Raspberry Pi 5, việc dành tới một phần tư tài nguyên chỉ để thỉnh thoảng xem vài dòng vết lỗi (error trace) là điều không thực sự hợp lý.

Dozzle là gì? Stream log thời gian thực không cần lập chỉ mục (Zero-Index)

Dozzle tiếp cận vấn đề theo cách tối giản và tinh gọn nhất có thể. Nó không phân tích cú pháp (parse), lập chỉ mục (index), hay lưu trữ file log vào bất kỳ hệ cơ sở dữ liệu riêng biệt nào. Thay vào đó, Dozzle kết nối trực tiếp đến socket của Docker daemon trên máy host tại /var/run/docker.sock, đọc các luồng standard output và standard error trực tiếp từ Docker. Sau đó, nó chuyển tiếp ngay các dòng log này đến trình duyệt của bạn thông qua Server-Sent Events (SSE).

Những ưu điểm cốt lõi dành cho HomeLab

  • Tiêu tốn cực ít tài nguyên: Do không có database engine hay các tiến trình worker lập chỉ mục chạy ngầm, Dozzle ở trạng thái nghỉ chỉ tiêu tốn khoảng 15 MB đến 30 MB RAM. Mức sử dụng CPU luôn duy trì gần như bằng 0 cho đến khi có người mở một luồng xem log trực tiếp.
  • Stream trực tiếp tức thì: Tab trình duyệt nhận các sự kiện stdout và stderr chỉ trong vài mili-giây mà không cần cơ chế polling hay phải tải lại trang thủ công.
  • Bộ lọc chuỗi & Regex mạnh mẽ: Nhanh chóng cô lập các traceback bằng các từ khóa như FATAL hoặc mẫu HTTP status cụ thể như HTTP/1.1" 5[0-9]{2}.
  • Chế độ Agent đa máy chủ (Multi-Host): Kết nối các Docker engine từ xa trên các node phụ (chẳng hạn như cụm tính toán hoặc máy chủ media) vào một tab trình duyệt duy nhất.
  • Chỉ số tài nguyên trực tiếp: Biểu đồ hiển thị song song tỷ lệ % CPU và ngưỡng RAM của từng container ngay phía trên khung log.

Triển khai Dozzle bằng Docker Compose

Bạn có thể đưa Dozzle vào hoạt động trên máy chủ Docker sẵn có chỉ trong vòng hai phút. Bắt đầu bằng việc tạo một thư mục riêng cho stack compose này:

mkdir -p ~/homelab/dozzle && cd ~/homelab/dozzle
nano docker-compose.yml

Thêm cấu hình dịch vụ sau vào file:

services:
  dozzle:
    container_name: dozzle
    image: amir20/dozzle:latest
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - "8080:8080"
    environment:
      DOZZLE_LEVEL: info
      DOZZLE_NO_ANALYTICS: "true"

Khởi chạy dịch vụ ở chế độ chạy nền (detached mode):

docker compose up -d

Mở trình duyệt và truy cập vào http://<your-server-ip>:8080. Thanh điều hướng bên trái sẽ hiển thị ngay toàn bộ các container đang chạy và đã dừng trên host. Nhấp vào bất kỳ container nào để theo dõi luồng log trực tiếp của nó.

Kinh nghiệm thực chiến & Các biện pháp tăng cường bảo mật

Cấu hình cơ bản có thể hoạt động được ngay, nhưng để vận hành Dozzle một cách an toàn trên mạng nội bộ, bạn cần thực hiện một vài điều chỉnh sau.

1. Mount Docker socket ở chế độ chỉ đọc (Read-Only)

Việc cấp toàn quyền ghi vào /var/run/docker.sock sẽ trao cho container quyền kiểm soát ở cấp root đối với các tiến trình trên máy host. Nếu một lỗ hổng bảo mật nào đó tấn công được container web, kẻ tấn công có thể lợi dụng socket có quyền ghi để thoát khỏi môi trường container và xâm nhập hệ điều hành máy chủ. Trong khi đó, Dozzle chỉ cần đọc các luồng log và metadata trạng thái của container. Vì vậy, hãy luôn áp dụng quyền truy cập chỉ đọc bằng cách gắn cờ :ro vào cấu hình volume mount:

volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro

2. Bảo vệ giao diện web bằng xác thực người dùng

Tuyệt đối không để một instance Dozzle không được bảo vệ mở ra mạng nội bộ (subnet) hoặc public qua reverse proxy. Log hệ thống thường xuyên để lộ các biến môi trường, dải IP nội bộ, token xác thực và các câu truy vấn SQL nhạy cảm.

Dozzle tích hợp sẵn trình xử lý file người dùng. Hãy tạo một thư mục lưu trữ cấu hình cố định và file users.yml ban đầu:

mkdir -p data
cat <<EOF > data/users.yml
users:
  - username: admin
    password: ChonMatKhauManh123!
    name: Quản trị viên Lab
    email: [email protected]
EOF

Mount file này vào /data/users.yml và bật chế độ xác thực đơn giản (simple authentication):

services:
  dozzle:
    container_name: dozzle
    image: amir20/dozzle:latest
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/users.yml:/data/users.yml:ro
    ports:
      - "8080:8080"
    environment:
      DOZZLE_AUTH_PROVIDER: simple
      DOZZLE_NO_ANALYTICS: "true"

Áp dụng thay đổi bằng lệnh docker compose up -d để bảo vệ quyền truy cập sau màn hình đăng nhập.

3. Thiết lập chính sách xoay vòng log (Log Rotation) toàn cục cho Docker

Dozzle đọc trực tiếp từ các file JSON log cơ bản của Docker được lưu trên ổ đĩa tại /var/lib/docker/containers/. Mặc định, Docker không tự động xoay vòng các file này. Một cơ sở dữ liệu hay reverse proxy ghi log liên tục tạo ra 200 MB log mỗi ngày sẽ sớm làm cạn kiệt dung lượng ổ cứng của bạn. Khi điều đó xảy ra, Dozzle sẽ bị nghẽn và chậm chạp khi cố gắng stream các file log khổng lồ lên tới hàng gigabyte.

Hãy ngăn chặn tình trạng này trên toàn bộ máy host bằng cách thêm giới hạn kích thước file vào /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  }
}

Với quy tắc này, Docker sẽ giới hạn tổng dung lượng log lưu giữ của mỗi container ở mức 60 MB (ba file, mỗi file 20 MB). Hãy reload daemon để áp dụng chính sách này cho các container mới mà không làm gián đoạn các dịch vụ đang chạy:

sudo systemctl reload docker

4. Giám sát cụm đa node (Multi-Node) với Dozzle Agent

Bạn không cần phải chạy một dashboard web Dozzle riêng biệt trên từng máy chủ. Nếu lab của bạn gồm có một NAS lưu trữ, một mini PC chạy chip Intel N100 và một cụm Raspberry Pi, bạn có thể gom log của tất cả chúng về một nơi thông qua các Dozzle agent.

Triển khai container agent gọn nhẹ trên từng máy chủ phụ trợ (satellite machine):

services:
  dozzle-agent:
    container_name: dozzle-agent
    image: amir20/dozzle:latest
    command: agent
    restart: unless-stopped
    ports:
      - "7007:7007"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

Sau đó, cấu hình máy chủ Dozzle dashboard chính để nhận dữ liệu từ các node đó bằng cách trỏ tới địa chỉ IP nội bộ cùng cổng 7007 của chúng:

services:
  dozzle:
    container_name: dozzle
    image: amir20/dozzle:latest
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - "8080:8080"
    environment:
      DOZZLE_REMOTE_HOST: "192.168.1.50:7007,192.168.1.51:7007"

Dashboard sẽ nhóm các container theo tên node ở thanh menu bên trái. Bạn có thể lọc log xuyên suốt nhiều máy chủ mà không cần phải chuyển đổi qua lại giữa các cửa sổ trình duyệt hay quản lý nhiều phiên SSH cùng lúc.

Công cụ lý tưởng cho việc giám sát (Observability) trong HomeLab

Dozzle lấp đầy khoảng trống hoàn hảo giữa những cửa sổ terminal cồng kềnh và các hệ thống observability doanh nghiệp nặng nề, tốn tài nguyên. Nhờ cơ chế stream trực tiếp qua Docker socket ở chế độ chỉ đọc mà không cần các tiến trình database chạy ngầm, phần cứng của bạn có thể dồn trọn tài nguyên để chạy các ứng dụng thực tế. Khi kết hợp cùng việc phân quyền socket hợp lý, xác thực người dùng và cơ chế xoay vòng log ổ đĩa, bạn sẽ có một trạm giám sát log nhanh, nhẹ và cực kỳ đáng tin cậy cho mạng gia đình.

Share: