Fast Byte - Thuê VPS Giá Rẻ
Hướng dẫn chung

[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 […]

Ảnh đại diện Thanh Lam NguyễnThanh Lam Nguyễn13 phút đọc

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:18 lê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 stop chỉ 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ệu stdoutstderr củ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.

Docker Làm Đầy Ổ Đĩa

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

Thuê VPS giá rẻ

CPU Intel Gold, SSD NVMe U.2, từ 50K/tháng

Vận hành Docker mượt mà – Không còn nỗi lo tràn ổ đĩa

Khởi tạo máy chủ ảo với ổ cứng SSD NVMe U.2 chuẩn doanh nghiệp, mang lại tốc độ đọc ghi I/O vượt trội giúp quá trình build image và khởi động container diễn ra tức thì. Toàn quyền root giúp bạn tự do cấu hình data-root và tối ưu hệ thống.

Khám phá VPS chạy Docker

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

Mạng 100 Mbps

Băng thông thả ga, kéo Image siêu tốc

Pull & Push Docker Image không giới hạn lưu lượng

Dễ dàng triển khai cụm microservices hoặc hệ thống CI/CD tự động với port mạng 100 Mbps tốc độ cao. Fast Byte áp dụng chính sách không giới hạn băng thông hàng tháng, loại bỏ hoàn toàn tình trạng bóp tốc độ khi tải image dung lượng lớn.

Nâng cấp VPS cấu hình cao

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=168h bả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:

  1. Luôn dùng cờ --rm khi 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ờ --rm sẽ tự động xóa sạch container ngay khi bạn thoát lệnh.
  2. 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.
  3. Gộp các lệnh RUN trong Dockerfile: Mỗi lệnh RUN tạ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ể.
  4. 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" trong daemon.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ó.

Tổng kết: Việc quản trị và dọn dẹp tài nguyên Docker định kỳ không chỉ giúp bảo vệ hệ thống tránh khỏi các sự cố tràn ổ cứng bất ngờ mà còn tối ưu hóa chi phí hạ tầng máy chủ một cách bền vững. Hãy kết hợp kiểm tra 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.

Xem bảng giá VPS Fast Byte

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.

Chia sẻ: Facebook LinkedIn
Quay lại trang blog

Bài viết liên quan