[2026] Cách Dọn Dẹp Docker Giải Phóng Dung Lượng Và Tránh Đầy Ổ Đĩa
Trong quá trình vận hành hệ thống container hóa, lỗi No space left on device (hết dung lượng ổ đĩa) là một trong những sự cố phổ biến và gây đau đầu nhất cho các lập trình viên lẫn quản trị viên hệ thống. Docker mang lại sự tiện lợi vượt bậc trong việc đóng […]
Trong quá trình vận hành hệ thống container hóa, lỗi No space left on device (hết dung lượng ổ đĩa) là một trong những sự cố phổ biến và gây đau đầu nhất cho các lập trình viên lẫn quản trị viên hệ thống. Docker mang lại sự tiện lợi vượt bậc trong việc đóng gói và triển khai phần mềm, nhưng nếu không được dọn dẹp bảo trì định kỳ, nó sẽ âm thầm tích lũy hàng chục Gigabyte dữ liệu rác từ image cũ, container đã dừng, bộ nhớ đệm build và các tệp nhật ký khổng lồ. Bài viết này từ đội ngũ kỹ thuật của ThueVPSGiaRe.vn sẽ chia sẻ toàn bộ bí quyết phân tích, dọn dẹp Docker và thiết lập tự động hóa nhằm giữ cho ổ cứng máy chủ của bạn luôn thông thoáng.
1. Những Nguyên Nhân Khiến Docker Âm Thầm Làm Đầy Ổ Đĩa
Mặc định, Docker lưu trữ toàn bộ dữ liệu tại đường dẫn /var/lib/docker/ trên hệ điều hành Linux. Sau một thời gian vận hành hoặc triển khai liên tục qua quy trình CI/CD, dung lượng phân vùng gốc (root) thường tăng vọt do 4 nhóm tài nguyên chính sau:
- Ảnh treo và ảnh không sử dụng (Dangling & Unused Images): Khi bạn thực hiện pull một phiên bản mới của một image (ví dụ từ
node:18lên phiên bản mới hơn) hoặc chạy lại lệnh build, các layer ảnh cũ sẽ bị mất nhãn (tag) và chuyển thành dạng<none>:<none>(gọi là dangling image). Ngoài ra, các image đã tải về nhưng không có container nào khởi chạy vẫn chiếm dụng không gian vật lý rất lớn. - Các container đã dừng hoạt động (Stopped Containers): Lệnh
docker stopchỉ tạm dừng tiến trình chứ không hề giải phóng container. Mỗi container đã tắt vẫn lưu giữ lớp ghi dữ liệu tạm (writable container layer), metadata và trạng thái tệp tin trên ổ cứng. - Bộ nhớ đệm dựng ảnh (Build Cache): Kể từ khi Docker chuyển sang sử dụng công cụ BuildKit, quá trình biên dịch Dockerfile sẽ lưu lại bộ đệm trung gian để tăng tốc độ cho những lần build tiếp theo. Lượng cache này có thể nhanh chóng phình to lên tới hàng chục GB nếu dự án build thường xuyên.
- Volume “mồ côi” (Orphaned / Dangling Volumes): Khi bạn xóa một container bằng lệnh thông thường, các ổ đĩa ảo (Volume) được gắn kèm sẽ không tự động mất đi mà vẫn tồn tại độc lập tại
/var/lib/docker/volumes/. - Nhật ký ghi chép (Container Logs): Trình điều khiển log mặc định (
json-file) ghi toàn bộ dữ liệustdoutvàstderrcủa container vào một tệp tin JSON mà không hề có cơ chế giới hạn dung lượng tự động. Nếu ứng dụng ghi log liên tục, tệp này có thể đạt tới hàng trăm GB.
2. Cách Kiểm Tra Và Phân Tích Dung Lượng Docker Đang Chiếm Dụng
Trước khi thực hiện bất kỳ thao tác xóa bỏ nào, người quản trị cần xác định chính xác thành phần nào đang tiêu tốn tài nguyên lưu trữ nhiều nhất.
Bước 1: Kiểm tra dung lượng tổng thể của ổ cứng máy chủ
Sử dụng lệnh kiểm tra hệ thống tệp tin tiêu chuẩn trên Linux:
df -h
Quan sát phân vùng gốc / (hoặc phân vùng chứa thư mục /var). Nếu cột Use% chạm ngưỡng từ 90% đến 100%, hệ thống đang ở mức cảnh báo nguy hiểm và có thể làm sập các dịch vụ đang chạy bất cứ lúc nào.
Bước 2: Phân tích chi tiết mức sử dụng tài nguyên của Docker
Docker cung cấp sẵn lệnh phân tích chuyên dụng cực kỳ hữu ích:
docker system df
Màn hình sẽ hiển thị bảng thống kê trực quan tương tự như sau:
| TYPE (Loại tài nguyên) | TOTAL (Tổng số) | ACTIVE (Đang dùng) | SIZE (Dung lượng) | RECLAIMABLE (Có thể thu hồi) |
|---|---|---|---|---|
| Images | 28 | 4 | 14.8GB | 12.2GB (82%) |
| Containers | 12 | 4 | 1.2GB | 650MB (54%) |
| Local Volumes | 15 | 3 | 8.5GB | 6.1GB (71%) |
| Build Cache | 142 | 0 | 22.4GB | 22.4GB (100%) |
Thông số quan trọng nhất là cột RECLAIMABLE – đây là tổng lượng dung lượng bạn hoàn toàn có thể giải phóng ngay lập tức mà không làm gián đoạn các container đang hoạt động.
Nếu muốn xem danh sách cụ thể từng ID image hay container đang chiếm bao nhiêu MB, bạn chạy lệnh bổ sung cờ verbose:
docker system df -v
3. Dọn Dẹp Tổng Thể Với Docker System Prune
Khi Docker phát sinh nhiều tài nguyên không còn được sử dụng, bạn có thể dùng lệnh prune để dọn dẹp. Docker cung cấp docker system prune nhằm loại bỏ những tài nguyên không còn liên kết với container.
Dọn dẹp các tài nguyên không còn sử dụng
Lệnh dưới đây thực hiện dọn dẹp tổng thể các container đã dừng, network không còn được sử dụng và các image không có tên:
docker system prune
Đây là lựa chọn phù hợp khi bạn muốn loại bỏ những tài nguyên Docker không còn được sử dụng mà không thực hiện việc dọn dẹp tất cả các image cũ.
Dọn dẹp mạnh hơn với tham số -a
Trong trường hợp cần dọn dẹp sâu hơn, bạn có thể thêm tham số -a:
docker system prune -a
Với tùy chọn này, Docker sẽ dọn dẹp thêm các image cũ không có container nào sử dụng, thay vì chỉ xử lý các dangling image.
Dọn dẹp Docker Image
Nếu dung lượng ổ đĩa đang bị chiếm đáng kể bởi các image cũ, bạn có thể thực hiện dọn dẹp riêng phần image thay vì dọn dẹp toàn bộ hệ thống Docker.
Lệnh sau được sử dụng để loại bỏ các image cũ và giải phóng không gian lưu trữ:
docker image prune -a
Cách này phù hợp khi mục tiêu chính của bạn là xử lý các Docker image không còn được sử dụng và giảm lượng dung lượng mà chúng chiếm trên ổ đĩa.
Dọn dẹp Docker Volume
Docker Volume thường được dùng để lưu trữ dữ liệu cho container. Tuy nhiên, sau khi container bị xóa, một số volume có thể trở thành các volume không còn được sử dụng.
Để loại bỏ các volume không còn được bất kỳ container nào sử dụng, bạn có thể chạy:
docker volume prune
Đây là một trong những bước cần lưu ý khi kiểm tra dung lượng Docker, bởi volume có thể chứa dữ liệu và chiếm một phần đáng kể không gian lưu trữ.
4. Xử Lý Triệt Để File Log Container – Thủ Phạm Giấu Mặt
Nhiều trường hợp sau khi đã chạy docker system prune -a mà ổ cứng vẫn báo đầy tới 95%. Lúc này, nguyên nhân chắc chắn nằm ở tệp tin log của các container đang hoạt động liên tục nhiều tháng.
Không phải mọi trường hợp Docker chiếm nhiều dung lượng đều xuất phát từ image. Một nguyên nhân khác có thể đến từ log của container. Khi các tệp log tích tụ trong thời gian dài, chúng có thể chiếm nhiều không gian trên ổ đĩa.
Thư mục chứa log Docker thường nằm tại:/var/lib/docker/containers/
Bước 1: Tìm kiếm các file log có kích thước bất thường
Chạy câu lệnh tìm kiếm và hiển thị kích thước các file log JSON của Docker:
du -sh /var/lib/docker/containers/*/*-json.log
Nếu bạn thấy có những tệp log dung lượng lên tới 10GB – 30GB, đó chính là nguồn gốc làm cạn kiệt tài nguyên ổ cứng.
Bước 2: Xóa rỗng nội dung file log tức thì
Tuyệt đối không sử dụng lệnh rm để xóa file log trực tiếp vì tiến trình Docker daemon vẫn đang giữ con trỏ tệp (file descriptor), dung lượng sẽ không được giải phóng mà còn gây lỗi ghi log. Thay vào đó, hãy dùng lệnh truncate để đưa kích thước file về 0:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Ngay sau khi lệnh thực thi, bạn gõ df -h sẽ thấy dung lượng ổ đĩa trống lập tức tăng lên.
Bước 3: Cấu hình giới hạn kích thước log tự động (Log Rotation)
Để ngăn chặn tình trạng log phình to trong tương lai, hãy thiết lập chính sách xoay vòng log cho toàn bộ hệ thống bằng cách chỉnh sửa tệp /etc/docker/daemon.json:
sudo nano /etc/docker/daemon.json
Thêm hoặc cập nhật đoạn cấu hình sau:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
}
}
Ý nghĩa: Mỗi file log của container chỉ được phép đạt dung lượng tối đa 20MB, và hệ thống chỉ giữ lại tối đa 3 file xoay vòng. Tổng dung lượng log cho mỗi container sẽ không bao giờ vượt quá 60MB.
Sau đó, khởi động lại dịch vụ Docker để áp dụng chính sách mới:
sudo systemctl restart docker
5. Tự Động Hóa Quy Trình Dọn Dẹp Docker Bằng Cron Job
Thay vì phải đăng nhập vào máy chủ bằng tay để xử lý mỗi khi có sự cố, việc tự động hóa bằng Cron Job trên Linux giúp hệ thống luôn tự duy trì trạng thái sạch sẽ.
Thiết lập lịch dọn dẹp hàng tuần
Mở trình chỉnh sửa lịch trình tác vụ định kỳ của tài khoản root:
sudo crontab -e
Dán dòng lệnh sau vào cuối tệp tin:
# Tự động dọn dẹp rác Docker vào lúc 03:00 sáng Chủ Nhật hàng tuần
0 3 * * 0 /usr/bin/docker system prune -f --filter "until=168h" >> /var/log/docker-cleanup.log 2>&1
Cấu hình này đảm bảo:
- Tác vụ chạy vào thời điểm đêm muộn ít người truy cập.
- Cờ
-f(force) để tự động xác nhận không cần can thiệp từ bàn phím. - Điều kiện
until=168hbảo vệ các tài nguyên mới tạo trong vòng 7 ngày qua không bị xóa nhầm. - Toàn bộ nhật ký dọn dẹp được ghi lại tại
/var/log/docker-cleanup.logđể tiện theo dõi.
6. Các Kinh Nghiệm Thực Tế Giúp Ngăn Ngừa Đầy Ổ Cứng Trong Tương Lai
Để tối ưu hóa chi phí lưu trữ và đảm bảo hệ thống container hoạt động ổn định dài lâu, bạn nên áp dụng các thói quen kỹ thuật sau:
- Luôn dùng cờ
--rmkhi kiểm thử: Khi chạy các container tạm thời để debug hoặc test ứng dụng (ví dụdocker run --rm -it alpine sh), cờ--rmsẽ tự động xóa sạch container ngay khi bạn thoát lệnh. - Tối ưu hóa Dockerfile với Multi-stage build: Tách biệt môi trường build (chứa SDK, compiler nặng hàng GB) và môi trường runtime (chỉ chứa file binary thực thi nhẹ vài chục MB) giúp kích thước image đầu ra giảm từ 5 đến 10 lần.
- Gộp các lệnh RUN trong Dockerfile: Mỗi lệnh
RUNtạo ra một layer lưu trữ mới. Việc gộp lệnh bằng toán tử&&và xóa cache cài đặt gói ngay trong cùng một layer (ví dụ:apt-get clean && rm -rf /var/lib/apt/lists/*) sẽ giúp image nhẹ hơn đáng kể. - Di chuyển thư mục lưu trữ Docker sang ổ đĩa thứ hai: Nếu phân vùng hệ thống
/có dung lượng nhỏ, bạn có thể cấu hình tham số"data-root": "/mnt/data/docker"trongdaemon.jsonđể chuyển toàn bộ dữ liệu Docker sang một phân vùng ổ đĩa chuyên dụng có dung lượng lớn hơn.
7. Câu Hỏi Thường Gặp (FAQ)
1. Lệnh docker system prune có làm mất dữ liệu cơ sở dữ liệu trong Volume không?
Mặc định là KHÔNG. Lệnh docker system prune chỉ xóa container đã tắt, network và dangling image; nó hoàn toàn bỏ qua Volume. Dữ liệu chỉ bị xóa nếu bạn cố tình thêm cờ --volumes vào câu lệnh.
2. Làm thế nào để xóa một Image đang bị báo lỗi “image is being used by running container”?
Bạn không thể xóa một image khi vẫn còn container (dù đang chạy hay đã dừng) tham chiếu đến nó. Bạn cần tìm và dừng container đó bằng lệnh docker stop <ID>, xóa container bằng docker rm <ID>, sau đó mới có thể thực hiện xóa image bằng docker rmi <Image_ID>.
3. Dọn dẹp Docker có làm gián đoạn website hay ứng dụng đang chạy không?
Không. Tất cả các lệnh prune tiêu chuẩn của Docker chỉ tác động đến tài nguyên ở trạng thái dừng hoặc không sử dụng. Các container đang ở trạng thái Up (Running) và các image, volume liên kết trực tiếp với chúng đều được bảo vệ an toàn 100%.
4. Khác biệt giữa Dangling Image và Unused Image là gì?
Dangling Image là các image cũ đã bị mất tên và tag (hiển thị <none>:<none>), thường sinh ra sau khi build phiên bản mới. Trong khi đó, Unused Image là image vẫn có tên và tag đầy đủ nhưng hiện tại trên máy chủ không có container nào đang chạy từ nó.
docker system df, quản lý dung lượng log và tự động hóa qua cron job để giữ cho máy chủ của bạn luôn đạt trạng thái hoạt động hoàn hảo.
Khởi tạo máy chủ ảo chạy Docker ngay hôm nay
Sở hữu VPS toàn quyền root, chip Intel Gold đời mới, ổ cứng NVMe U.2 truy xuất cực nhanh cùng khả năng nâng cấp dung lượng linh hoạt với chi phí chỉ từ 50K/tháng.
Tuyên bố miễn trừ trách nhiệm kỹ thuật: Toàn bộ hướng dẫn và câu lệnh dọn dẹp Docker trong bài viết được biên soạn dựa trên kinh nghiệm quản trị thực tế nhằm mục đích chia sẻ kiến thức. Tùy thuộc vào phiên bản Docker Engine, bản phân phối Linux (Ubuntu, Debian, CentOS, AlmaLinux) và cấu trúc phân vùng ổ cứng của từng máy chủ, cú pháp hoặc mức độ ảnh hưởng của lệnh có thể có sự khác biệt. Đặc biệt, các thao tác dọn dẹp chuyên sâu (như prune volume hoặc xóa image không dùng) luôn tiềm ẩn rủi ro mất dữ liệu database ngoài ý muốn. Quản trị viên nên chủ động sao lưu dữ liệu (backup/snapshot) và kiểm thử cẩn thận trên môi trường Staging trước khi áp dụng cho hệ thống Production đang vận hành.



