Nỗi khổ khi debug trên những Image “sạch bong”
Mình luôn ưu tiên tiêu chí “nhẹ và gọn” khi build Docker Image. Việc sử dụng alpine hoặc distroless giúp giảm dung lượng image từ 200MB xuống còn vỏn vẹn 5-10MB. Nó không chỉ giúp deploy nhanh mà còn hạn chế tối đa lỗ hổng bảo mật.
Tuy nhiên, sự gọn nhẹ này lại là con dao hai lưỡi. Một lần nọ, hệ thống Production của mình bị lỗi kết nối database. Mình gõ lệnh docker exec -it app sh để kiểm tra thì nhận ngay thông báo: executable file not found in $PATH. Image distroless vốn không có shell, không curl, chẳng có ls. Để tìm lỗi, mình phải build lại image, cài thêm công cụ, đẩy lên registry rồi deploy lại. Quá trình này ngốn mất 15-20 phút vô ích.
Lệnh docker debug ra đời để giải quyết triệt để vấn đề này. Bạn có thể nhảy vào bất kỳ container nào, dù nó “trống trơn” đến đâu, với một bộ công cụ đầy đủ mà không làm thay đổi image gốc.
docker debug hoạt động như thế nào?
Thay vì chạy trực tiếp bên trong container mục tiêu, docker debug tạo ra một môi trường “hộp cát” (sandbox). Môi trường này chứa sẵn các công cụ phổ biến như vim, nano, htop, curl, hay git. Sau đó, nó gắn (mount) filesystem của container đang lỗi vào sandbox này.
Ưu điểm lớn nhất là tính nguyên bản. Container của bạn vẫn chạy bình thường, không bị cài cắm thêm rác, nhưng bạn vẫn có đủ “đồ chơi” để soi xét mọi ngóc ngách bên trong.
Cài đặt và chuẩn bị
Tính năng này hiện có sẵn trên Docker Desktop (các gói Pro, Team, Business). Nếu dùng Linux, bạn có thể cài đặt thông qua Docker CLI plugin. Hãy kiểm tra xem máy bạn đã hỗ trợ chưa bằng lệnh:
docker debug --version
Nếu terminal trả về phiên bản cụ thể, bạn đã sẵn sàng. Nếu chưa, hãy cập nhật Docker Desktop lên bản mới nhất để trải nghiệm.
Thực chiến: Gỡ lỗi Container đang chạy
Giả sử bạn có một container Nginx bản alpine cực nhẹ. Bạn muốn kiểm tra file cấu hình nhưng lười cài thêm vim. Chỉ cần thực thi:
docker debug <container_id_hoặc_name>
Ngay lập tức, một shell mới sẽ hiện ra. Tại đây, bạn thoải mái dùng ls, cat, hoặc top để theo dõi tài nguyên.
Kinh nghiệm nhỏ: Khi debug các API trả về chuỗi JSON dài hàng nghìn dòng, việc đọc trên terminal rất mỏi mắt. Mình thường copy nội dung đó và dùng JSON Formatter của toolcraft.app để định dạng lại. Cách này nhanh hơn nhiều so với việc cố gắng cài thêm plugin format vào container.
Can thiệp vào Filesystem
Trong môi trường debug, toàn bộ file hệ thống của container đích sẽ được mount vào. Bạn có thể sửa trực tiếp file config để test giả thuyết:
# Chỉnh sửa nhanh cấu hình nginx
vim /etc/nginx/nginx.conf
Hãy nhớ rằng các thay đổi này thường chỉ mang tính tạm thời. Tuy nhiên, nó cực kỳ hữu ích để xác nhận lỗi trước khi bạn cập nhật chính thức vào Dockerfile.
Kiểm tra Network và Process chuyên sâu
Lỗi kết nối giữa các microservices luôn là bài toán khó. Với docker debug, bạn có sẵn netstat và drill (công cụ thay thế nslookup rất mạnh).
# Xem các cổng đang lắng nghe
netstat -tulpn
# Kiểm tra DNS nội bộ giữa các container
drill database-service
Bạn không còn phải loay hoay cài iputils hay bind-tools vào image production nữa. Mọi thứ đã được tích hợp sẵn trong bộ toolbox của Docker.
Hồi sinh dữ liệu từ Container đã dừng (Stopped)
Đây là tính năng mình tâm đắc nhất. Khi một container bị crash (trạng thái Exited), lệnh docker exec sẽ vô dụng. Thông thường bạn chỉ có thể xem log, nhưng đôi khi log không ghi lại nguyên nhân sập nguồn.
docker debug cho phép bạn truy cập vào một container đã dừng. Nó sẽ khởi tạo môi trường dựa trên snapshot cuối cùng của container đó:
docker debug <stopped_container_id>
Mình từng cứu được một ca “khó” khi file cấu hình bị sai cú pháp khiến service chết ngay khi khởi động. Nhờ docker debug, mình đã đọc được file log nội bộ mà docker logs không hiển thị.
Vài lưu ý để sử dụng hiệu quả
Dù rất mạnh mẽ, bạn nên lưu ý vài điểm sau để tránh bỡ ngỡ:
- Quyền truy cập: Lệnh này cần quyền can thiệp vào Docker socket. Hãy kiểm soát chặt chẽ những ai có quyền chạy lệnh này trên môi trường Production.
- Tốc độ: Lần đầu chạy sẽ mất khoảng 30 giây để Docker tải image toolbox. Những lần sau lệnh sẽ thực thi gần như tức thì.
- Tư duy đúng: Đừng dùng debug để sửa lỗi tạm thời rồi để đó. Hãy luôn quay lại sửa từ gốc trong Dockerfile hoặc Config Map sau khi đã tìm ra nguyên nhân.
Nếu bạn đã chán cảnh phải cài curl hay telnet chỉ để test network, hãy thử docker debug ngay. Nó giúp image của bạn luôn sạch, an toàn mà vẫn cực kỳ dễ quản lý khi có sự cố.
