Vấn đề với docker stats — và tại sao cần một thứ khác
Mở terminal lên, gõ docker stats, và bạn nhận được một màn hình số cuộn liên tục không dừng. Muốn tìm container cụ thể? Không có filter. Muốn xem log ngay lúc đó? Phải mở terminal khác. Muốn sort theo CPU? Không được.
Lần đầu mình dùng Docker Compose cho dự án thực tế, mình mắc khá nhiều lỗi cơ bản mà bây giờ nghĩ lại thấy buồn cười — một trong đó là cứ Ctrl+C rồi chạy lại docker stats mỗi lần cần xem số liệu của container nào đó. Sau này mới biết có ctop — tool giải quyết đúng vấn đề này.
ctop (container top) là giao diện TUI (Terminal UI) hiển thị metrics của tất cả container đang chạy theo thời gian thực, có thể tương tác, lọc, sort, và xem log — tất cả trong một màn hình terminal duy nhất.
Cài và chạy ctop trong 5 phút
Linux (binary trực tiếp)
Cách nhanh nhất — tải binary về và chạy luôn, không cần cài thêm gì:
# Tải binary mới nhất (kiểm tra version tại github.com/bcicen/ctop)
sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 \
-O /usr/local/bin/ctop
# Cấp quyền thực thi
sudo chmod +x /usr/local/bin/ctop
# Chạy thử
ctop
Nếu cần chạy mà không có quyền sudo (VPS shared, ví dụ), tải về thư mục local:
mkdir -p ~/.local/bin
wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 \
-O ~/.local/bin/ctop
chmod +x ~/.local/bin/ctop
export PATH="$HOME/.local/bin:$PATH" # thêm vào ~/.bashrc để dùng mãi
macOS
brew install ctop
Chạy qua Docker (không cần cài gì)
Cách này tiện khi dùng tạm trên server mà không muốn cài thêm binary:
docker run --rm -ti \
-v /var/run/docker.sock:/var/run/docker.sock \
quay.io/vektorlab/ctop:latest
Chạy ctop lần đầu
Gõ ctop — màn hình hiện ra ngay lập tức với danh sách tất cả container (cả đang chạy lẫn đã dừng). Mặc định ctop chỉ hiển thị container đang active, nhấn a để toggle xem tất cả.
Hiểu giao diện ctop
Các cột số liệu
Mỗi dòng là một container, với các cột:
- NAME — tên container
- CID — 12 ký tự đầu của container ID
- CPU — phần trăm CPU đang dùng (real-time, cập nhật mỗi giây)
- MEM — RAM đang dùng / giới hạn (nếu có set
--memory) - NET RX/TX — lưu lượng mạng nhận vào / gửi ra từ khi container khởi động
- IO R/W — đọc/ghi disk
- PIDS — số process đang chạy bên trong container
Màu sắc của cột CPU thay đổi theo mức độ: xanh lá (thấp) → vàng → đỏ (cao). Nhìn một cái là biết ngay container nào đang ngốn tài nguyên.
Phím tắt cơ bản
| Phím | Tác dụng |
|---|---|
↑ ↓ |
Di chuyển giữa các container |
Enter |
Mở single-container view (xem chi tiết) |
l |
Xem log của container đang chọn |
e |
Mở shell vào container (exec -it bash) |
s |
Dừng container |
r |
Restart container |
a |
Toggle hiện/ẩn container đã dừng |
f |
Filter theo tên container |
H |
Ẩn/hiện header |
q |
Thoát |
Tính năng nâng cao
Sort theo cột bất kỳ
Nhấn o để mở menu chọn cột sort. Hữu ích nhất là sort theo CPU hoặc MEM để biết ngay container nào đang “ăn” tài nguyên:
Sort options:
[c] cpu [m] mem [n] net [b] block io
[p] pids [N] name [s] state
Sau khi chọn, danh sách tự động sắp xếp và cập nhật liên tục theo giá trị real-time.
Single container view
Chọn container và nhấn Enter — ctop chuyển sang màn hình detail với đồ thị CPU và MEM theo thời gian (sparkline). Từ đây có thể nhấn l để xem log streaming trực tiếp mà không cần thoát ra.
Filter container theo tên
Nhấn f, gõ keyword — ctop filter ngay lập tức theo tên container. Ví dụ gõ nginx chỉ còn thấy các container có tên chứa “nginx”. Nhấn Esc để xóa filter.
Chạy với options từ CLI
# Chỉ hiện container đang chạy (bỏ qua stopped)
ctop -a
# Sort theo memory ngay từ đầu
ctop -s mem
# Kết nối Docker host khác qua TCP socket
ctop -H tcp://192.168.1.100:2375
# Export metrics ra file JSON (dùng cho script)
ctop -json 2>/dev/null | head -20
Kết nối Docker remote host
Đây là tính năng mình dùng nhiều khi quản lý nhiều VPS — chạy ctop trên máy local nhưng monitor Docker trên server:
# Cần enable Docker TCP socket trên server trước
# /etc/docker/daemon.json:
# { "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }
# Kết nối từ máy local
export DOCKER_HOST=tcp://your-server-ip:2375
ctop
Lưu ý bảo mật: TCP socket không encrypt — chỉ dùng trong mạng nội bộ hoặc qua SSH tunnel. Trong môi trường production, dùng SSH tunnel thay thế:
# Tạo SSH tunnel trước
ssh -L 2375:localhost:2375 user@your-server -N &
# Rồi mới kết nối
export DOCKER_HOST=tcp://localhost:2375
ctop
Tips thực tế
Phân biệt ctop vs docker stats vs Portainer
- docker stats: Output đơn giản, không interactive, thích hợp pipe vào script hoặc log
- ctop: Interactive TUI, tốt nhất cho debug và monitoring nhanh trong terminal
- Portainer: Web UI đầy đủ tính năng, thích hợp quản lý lâu dài, team nhiều người. Blog đã có bài riêng nếu bạn cần setup Portainer.
Ba tool này không loại trừ nhau — mình dùng ctop khi đang SSH vào server và cần xem nhanh container nào đang có vấn đề, còn Portainer thì để quản lý định kỳ qua browser.
Dùng ctop để debug memory leak
Khi nghi ngờ một container bị memory leak, mở ctop, sort theo MEM (o → m), rồi để màn hình chạy 5-10 phút. Nếu thấy cột MEM của container đó tăng đều và không giảm — gần như chắc chắn có leak. Từ đó nhấn Enter để vào detail view xem đồ thị MEM theo thời gian rõ hơn.
Alias tiện dụng
# Thêm vào ~/.bashrc hoặc ~/.zshrc
alias dps='ctop' # thay thế docker ps thông thường
alias ctop-cpu='ctop -s cpu' # mở thẳng sorted by CPU
alias ctop-mem='ctop -s mem' # mở thẳng sorted by memory
Xem log nhanh không cần thoát ctop
Workflow mình hay dùng nhất: chạy ctop → thấy container nào CPU spike bất thường → nhấn Enter → nhấn l → xem log streaming ngay. Không cần mở terminal mới, không cần gõ tên container ID dài. Xong nhấn q quay lại danh sách.
Chạy ctop trong tmux session
Trên VPS production, mình thường để ctop chạy trong một tmux window riêng:
# Tạo session tmux tên "monitor"
tmux new-session -d -s monitor -n ctop
tmux send-keys -t monitor:ctop 'ctop' Enter
# Attach vào bất cứ lúc nào
tmux attach -t monitor
ctop là một trong những tool mà sau khi dùng một lần, bạn sẽ không muốn quay lại docker stats nữa. Cài 30 giây, tiết kiệm nhiều phút mỗi lần debug container.
