❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
Ở Bài 12, bạn đã học cách backup và restore dữ liệu Docker volume, từ thủ công đến tự động, từ local đến offsite, và cả cách migrate toàn bộ stack sang VPS mới. Dữ liệu giờ đã an toàn.

Nhưng có một vấn đề: container đang chạy hay đã chết? Trang web có up không? CPU có bị đẩy lên 100% không? Nếu bạn không theo dõi, bạn sẽ chỉ biết khi người dùng phàn nàn.
Bài này sẽ hướng dẫn bạn setup 3 công cụ monitoring phổ biến nhất cho Docker: Portainer để quản lý container qua giao diện web, Uptime Kuma để giám sát uptime service, và cAdvisor để theo dõi resource usage chi tiết từng container.
Tại sao cần monitoring?

Khi bạn chỉ chạy 1-2 container trên VPS, việc SSH vào gõ docker ps kiểm tra cũng ổn. Nhưng khi hệ thống lớn dần : 5, 10, 20 container , bạn cần một cách theo dõi chủ động hơn.
Monitoring giúp bạn:
- Biết ngay khi container chết: không cần đợi user báo “trang web không vào được”.
- Theo dõi resource usage: container nào đang ngốn CPU, RAM, để xử lý trước khi VPS quá tải.
- Nhận alert tự động: qua Telegram, Discord, Email khi có sự cố.
- Quản lý container dễ hơn: start, stop, restart, xem log qua giao diện web thay vì SSH.
- Debug nhanh hơn: khi có vấn đề, bạn biết ngay container nào, resource nào đang bất thường.
Nói ngắn gọn: không có monitoring = đang chạy mù. Bạn chỉ biết hệ thống lỗi khi đã quá muộn.
Portainer – Quản lý Docker qua giao diện web

Portainer là gì?
Portainer là công cụ quản lý Docker thông qua giao diện web. Thay vì phải SSH vào server và gõ lệnh, bạn mở trình duyệt, đăng nhập vào Portainer và thao tác mọi thứ bằng chuột: xem container, start/stop, đọc log, deploy stack mới…
Portainer có 2 phiên bản:
- Community Edition (CE): miễn phí, open source, đủ dùng cho cá nhân và team nhỏ.
- Business Edition (BE): trả phí, thêm tính năng như RBAC nâng cao, registry management, support chuyên nghiệp.
Trong bài này mình sẽ dùng Portainer CE: hoàn toàn miễn phí và quá đủ cho nhu cầu quản lý Docker trên VPS.
Deploy Portainer bằng Docker Compose
Tạo thư mục project và file docker-compose.yml:
mkdir -p ~/monitoring/portainer
cd ~/monitoring/portainer
Tạo file docker-compose.yml:
services:
portainer:
image: portainer/portainer-ce:2.27.3
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
Giải thích nhanh:
/var/run/docker.sock: mount Docker socket để Portainer có thể giao tiếp với Docker Engine trên host.portainer_data: volume lưu dữ liệu Portainer (users, settings, …).- Port
9443: giao diện web HTTPS của Portainer.
Chạy Portainer:
docker compose up -d
Setup ban đầu
Mở trình duyệt và truy cập:
https://your-server-ip:9443
Lần đầu truy cập, Portainer sẽ yêu cầu bạn tạo tài khoản admin:
- Nhập username (mặc định là
admin). - Đặt password (tối thiểu 12 ký tự).
- Click Create user.
Sau đó chọn “Get Started” để kết nối với Docker Engine trên chính server đang chạy Portainer. Portainer sẽ tự detect vì bạn đã mount Docker socket.
Lưu ý: Bạn cần tạo admin account trong vòng 5 phút sau khi start Portainer. Nếu quá thời gian, Portainer sẽ tự disable vì lý do bảo mật. Khi đó bạn cần restart container: docker compose restart.
Dashboard – Tổng quan hệ thống
Sau khi đăng nhập, bạn sẽ thấy dashboard hiển thị tổng quan toàn bộ Docker environment:
- Containers: số container đang chạy/dừng.
- Images: danh sách image đã pull về.
- Volumes: các volume đang tồn tại.
- Networks: các Docker network.
- Stacks: các Compose stack đang chạy.
Tất cả hiển thị trực quan, click vào để xem chi tiết, không cần nhớ lệnh nào cả.
Quản lý container
Click vào mục Containers trong sidebar, bạn sẽ thấy danh sách tất cả container với trạng thái (running, stopped, created). Với mỗi container, bạn có thể:
- Start / Stop / Restart / Kill: thao tác trạng thái container.
- Logs: xem log output real-time, tương đương
docker logs -f. - Console: mở terminal vào bên trong container, tương đương
docker exec -it ... bash. - Inspect: xem toàn bộ config chi tiết: env vars, mounts, network, ports…
- Stats: xem CPU, RAM, Network I/O real-time của container đó.
Đây là tính năng cực kỳ hữu ích cho việc debug, bạn không cần SSH vào server, mở nhiều terminal, gõ nhiều lệnh. Tất cả nằm trong 1 giao diện web.
Deploy stack từ Portainer
Một tính năng hay ho của Portainer là bạn có thể deploy Docker Compose stack ngay từ giao diện web:
- Vào Stacks → Add stack.
- Đặt tên cho stack.
- Paste nội dung
docker-compose.ymlvào Web editor. - (Tuỳ chọn) Thêm environment variables.
- Click Deploy the stack.
Portainer sẽ tự chạy docker compose up -d cho bạn. Sau đó bạn có thể quản lý stack đó: update, stop, xoá… tất cả từ giao diện web.
Ngoài ra, bạn còn có thể pull stack từ Git repository: rất tiện cho workflow GitOps.
Khi nào nên dùng Portainer?
Portainer đặc biệt hữu ích khi:
- Bạn không thích gõ CLI hoặc muốn thao tác nhanh hơn.
- Bạn cần cho team member khác (designer, PM) có thể xem trạng thái hệ thống mà không cần SSH.
- Bạn quản lý nhiều Docker host: Portainer hỗ trợ kết nối multi-environment.
- Bạn muốn có cái nhìn tổng quan về toàn bộ hệ thống Docker chỉ trong 1 trang.
Uptime Kuma – Giám sát uptime service
Uptime Kuma là gì?
Uptime Kuma là công cụ giám sát uptime self-hosted, giao diện đẹp, dễ dùng, giống như một phiên bản tự host của UptimeRobot hay Hetrix. Bạn có thể theo dõi xem website, API, database, hay bất kỳ service nào có đang hoạt động bình thường hay không.
Khi service bị down, Uptime Kuma sẽ gửi alert cho bạn ngay lập tức qua Telegram, Discord, Email, Slack… và hàng chục kênh thông báo khác.
Deploy Uptime Kuma bằng Docker Compose
Tạo thư mục và file compose:
mkdir -p ~/monitoring/uptime-kuma
cd ~/monitoring/uptime-kuma
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
uptime_data:
Giải thích:
uptime_data: lưu database SQLite và config của Uptime Kuma./var/run/docker.sock:ro: mount Docker socket ở chế độ read-only để Uptime Kuma có thể monitor trạng thái Docker container. (Tuỳ chọn , chỉ cần nếu bạn muốn monitor Docker container trực tiếp.)- Port
3001: giao diện web.
docker compose up -d
Truy cập http://your-server-ip:3001 và tạo tài khoản admin.
Cấu hình monitor
Sau khi đăng nhập, click “Add New Monitor” để tạo monitor đầu tiên. Uptime Kuma hỗ trợ nhiều loại monitor:
HTTP(s), Kiểm tra website/API:
- Nhập URL cần monitor (ví dụ:
https://yourdomain.com). - Chọn interval kiểm tra (mặc định 60 giây).
- Có thể check keyword trong response, accepted status codes, SSL certificate expiry.
TCP, Kiểm tra port có mở không:
- Hữu ích cho database (MySQL 3306, Redis 6379), mail server, hay bất kỳ service nào listen trên port.
Ping, Kiểm tra host có sống không:
- Gửi ICMP ping đến IP/hostname. Đơn giản nhất để kiểm tra server có online hay không.
Docker Container, Kiểm tra container status:
- Monitor trực tiếp trạng thái Docker container (running/stopped).
- Yêu cầu đã mount Docker socket khi deploy Uptime Kuma.
- Chọn container cần monitor từ dropdown list.
Setup notification
Monitor không có nghĩa gì nếu bạn không nhận được thông báo khi có sự cố. Vào Settings → Notifications để setup:
Telegram:
- Tạo bot qua
@BotFathertrên Telegram, lấy Bot Token. - Lấy Chat ID của bạn (gửi tin nhắn cho bot, dùng API
/getUpdatesđể lấy). - Trong Uptime Kuma, chọn notification type Telegram, nhập Bot Token và Chat ID.
- Click Test để kiểm tra.
Discord:
- Trong Discord server, vào Channel Settings → Integrations → Webhooks.
- Tạo webhook mới, copy Webhook URL.
- Trong Uptime Kuma, chọn notification type Discord, paste Webhook URL.
Email (SMTP):
- Cấu hình SMTP server (Gmail, Mailgun, SendGrid…).
- Nhập hostname, port, username, password, from/to email.
Bạn có thể setup nhiều kênh notification cùng lúc: ví dụ vừa Telegram vừa Email, để đảm bảo không bỏ lỡ alert nào.
Status page public
Một tính năng rất hay của Uptime Kuma là Status Page: trang hiển thị trạng thái các service cho public xem.
- Vào Status Pages trong sidebar.
- Tạo status page mới, đặt tên và slug (ví dụ:
/status). - Thêm các monitor vào status page.
- Tuỳ chỉnh giao diện: logo, mô tả, footer.
- Share link cho khách hàng hoặc team.
Giờ bạn có status page chuyên nghiệp như của các dịch vụ lớn, mà hoàn toàn self-hosted, miễn phí.
cAdvisor – Monitor resource từng container
cAdvisor là gì?
cAdvisor (Container Advisor) là công cụ open source của Google, chuyên thu thập và hiển thị metrics về resource usage của từng container: CPU, memory, network I/O, disk I/O.
Khác với Portainer (quản lý) hay Uptime Kuma (uptime), cAdvisor tập trung vào việc trả lời câu hỏi: “Container này đang dùng bao nhiêu tài nguyên?”
cAdvisor cũng là thành phần cốt lõi trong monitoring stack phổ biến: cAdvisor + Prometheus + Grafana.
Deploy cAdvisor bằng Docker Compose
mkdir -p ~/monitoring/cadvisor
cd ~/monitoring/cadvisor
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.51.0
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg:/dev/kmsg
Giải thích các volume mount:
/var/run: chứa Docker socket và runtime info./sys: filesystem chứa thông tin kernel, cgroup, hardware./var/lib/docker: thư mục data của Docker Engine./dev/disk: thông tin disk device./rootfs: mount toàn bộ root filesystem để đọc metrics.privileged: true: cAdvisor cần quyền cao để đọc kernel metrics.
Tất cả đều mount ở chế độ read-only (ro): cAdvisor chỉ đọc, không ghi gì lên host.
docker compose up -d
Truy cập http://your-server-ip:8080 để xem dashboard.
Dashboard cAdvisor
Giao diện cAdvisor khá đơn giản nhưng thông tin rất chi tiết. Trang chính hiển thị metrics tổng của host, click vào Docker Containers để xem từng container:
- CPU Usage: tổng CPU time và phần trăm CPU sử dụng.
- Memory Usage: RAM hiện tại, cache, working set, limit.
- Network: bytes sent/received, packets, errors.
- Filesystem: disk usage và I/O operations.
Mỗi metric đều có biểu đồ real-time, giúp bạn nhìn thấy xu hướng sử dụng resource theo thời gian.
Tích hợp với Prometheus (nâng cao)
cAdvisor tự động expose metrics ở endpoint /metrics theo format Prometheus. Điều này có nghĩa là bạn có thể dùng Prometheus để scrape metrics từ cAdvisor, rồi dùng Grafana để tạo dashboard đẹp và alerting nâng cao.
Stack phổ biến:
cAdvisor (thu thập metrics) → Prometheus (lưu trữ metrics) → Grafana (visualize + alert)
Đây là monitoring stack tiêu chuẩn trong production. Mình sẽ không đi sâu vào Prometheus + Grafana trong bài này vì nó khá dài, nhưng bạn biết là cAdvisor sẵn sàng tích hợp bất cứ lúc nào.
Docker Compose tổng hợp – Chạy cả 3 tool cùng lúc
Nếu bạn muốn chạy cả Portainer, Uptime Kuma và cAdvisor trong cùng một Compose file, đây là config tổng hợp:
mkdir -p ~/monitoring
cd ~/monitoring
services:
# === Portainer - Quản lý Docker qua web ===
portainer:
image: portainer/portainer-ce:2.27.3
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
# === Uptime Kuma - Giám sát uptime ===
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro
# === cAdvisor - Monitor resource container ===
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.51.0
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg:/dev/kmsg
volumes:
portainer_data:
uptime_data:
docker compose up -d
Sau khi chạy, bạn có 3 giao diện web:
- Portainer:
https://your-server-ip:9443 - Uptime Kuma:
http://your-server-ip:3001 - cAdvisor:
http://your-server-ip:8080
Lưu ý bảo mật: Cả 3 tool đều expose port ra ngoài. Trong môi trường production, bạn nên:
- Đặt reverse proxy (Nginx/Traefik) phía trước với HTTPS.
- Dùng firewall chặn truy cập trực tiếp vào các port 3001, 8080.
- Hoặc bind port vào
127.0.0.1nếu chỉ truy cập qua reverse proxy:"127.0.0.1:3001:3001".
docker stats – Monitoring nhanh từ CLI

Không phải lúc nào cũng cần deploy cả một monitoring stack. Nếu bạn chỉ cần kiểm tra nhanh resource usage, Docker có sẵn lệnh docker stats:
docker stats
Output real-time, tương tự htop nhưng cho container:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
a1b2c3d4e5f6 wordpress 0.15% 128.5MiB / 1.952GiB 6.43% 1.2MB / 890kB 12MB / 0B
f6e5d4c3b2a1 mysql 0.50% 350.2MiB / 1.952GiB 17.5% 890kB / 1.2MB 50MB / 25MB
1a2b3c4d5e6f nginx 0.02% 5.5MiB / 1.952GiB 0.28% 500kB / 1.5MB 0B / 0B
Một số cách dùng hữu ích:
# Xem stats của 1 container cụ thể
docker stats wordpress
# Xem 1 lần rồi thoát (không real-time)
docker stats --no-stream
# Chỉ hiển thị các cột cần thiết
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
docker stats rất tiện cho việc kiểm tra nhanh, nhưng không lưu history và không có alerting. Nếu cần theo dõi lâu dài, bạn vẫn nên dùng cAdvisor hoặc Prometheus.

Chọn tool nào cho phù hợp?
Mỗi tool giải quyết một bài toán khác nhau. Đây là gợi ý để bạn chọn:
Chỉ cần quản lý container qua web? → Dùng Portainer. Start/stop container, xem log, deploy stack, tất cả qua trình duyệt. Phù hợp cho người không thích CLI hoặc cần cho team member khác truy cập.
Cần biết website/service có đang sống không? → Dùng Uptime Kuma. Monitor HTTP, TCP, Ping, Docker container. Gửi alert qua Telegram/Discord khi service down. Có status page cho khách hàng.
Cần xem resource usage chi tiết từng container? → Dùng cAdvisor. CPU, memory, network, disk, biết rõ container nào đang ngốn tài nguyên.
Cần kiểm tra nhanh mà không cần deploy gì? → Dùng docker stats. Có sẵn, gõ 1 lệnh là xem được.
Muốn full monitoring stack cho production? → Dùng cAdvisor + Prometheus + Grafana. Đây là combo tiêu chuẩn: cAdvisor thu thập metrics, Prometheus lưu trữ, Grafana visualize và alerting. Setup phức tạp hơn, nhưng là giải pháp “đúng chuẩn” cho môi trường production.
Trong thực tế, nhiều người chạy cả 3 tool cùng lúc vì chúng bổ sung cho nhau, Portainer để quản lý, Uptime Kuma để biết service có sống, cAdvisor để biết resource có ổn. Tổng cộng cũng chỉ tốn khoảng 200-300MB RAM.
📚 Serie Docker từ A đến Z
- Bài 1: Docker là gì? Tại sao nên dùng Docker trên VPS
- Bài 2: Cài đặt Docker và Docker Compose trên VPS Ubuntu
- Bài 3: Làm quen với Docker – Các lệnh cơ bản cần biết
- Bài 4: Docker Image & Dockerfile – Tự tạo Image riêng
- Bài 5: Docker Volume & Network – Quản lý dữ liệu và mạng
- Bài 6: Docker Compose là gì? Cài đặt và cú pháp cơ bản
- Bài 7: Deploy WordPress + MySQL + phpMyAdmin bằng Docker Compose
- Bài 8: Deploy LEMP Stack (Nginx + PHP-FPM + MariaDB) bằng Docker Compose
- Bài 9: Biến môi trường & file .env trong Docker Compose
- Bài 10: Reverse Proxy với Nginx Proxy Manager + SSL tự động
- Bài 11: Deploy ứng dụng Node.js / Python với Docker Compose
- Bài 12: Backup & Restore dữ liệu Docker Volume
- Bài 13: Monitoring Docker với Portainer, Uptime Kuma và cAdvisor (đang đọc)
- Bài 14: Docker Logging – Quản lý log hiệu quả
- Bài 15: Bảo mật Docker trên VPS
- Bài 16: CI/CD đơn giản – Auto deploy với Webhook + Docker Compose
- Bài 17: Docker Compose trong thực tế – Tổng hợp project mẫu
Tổng kết
Trong bài này, bạn đã học cách setup 3 công cụ monitoring phổ biến cho Docker:
- Portainer: quản lý Docker qua giao diện web, xem container, log, deploy stack.
- Uptime Kuma: giám sát uptime service, gửi alert khi down, có status page.
- cAdvisor: theo dõi CPU, memory, network, disk của từng container.
- docker stats: kiểm tra nhanh resource từ CLI.
- Docker Compose tổng hợp: chạy cả 3 tool trong cùng 1 file compose.
Giờ hệ thống Docker của bạn đã có “mắt”, bạn biết container nào đang chạy, service nào đang down, resource nào đang cạn. Không còn chạy mù nữa.
Ở Bài 14, mình sẽ hướng dẫn bạn về Docker Logging: cách thu thập, quản lý và phân tích log từ container. Vì monitoring cho bạn biết “cái gì đang xảy ra”, nhưng log mới cho bạn biết “tại sao nó xảy ra”. Hẹn gặp bạn ở bài sau!
👈 Bài trước: Backup & Restore dữ liệu Docker Volume
👉 Bài tiếp: Docker Logging – Quản lý log hiệu quả
Về tác giả
Thạch Phạm
Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.