Cách tránh bị đầy ổ đĩa khi sử dung Docker
Những nguyên nhân gây ra đầy ổ đĩa khi sử dụng docker?
Docker container: Dữ liệu trong container hoặc liên kết với thư mục trên máy chủ có thể gây đầy ổ đĩa nếu không được quản lý đúng cách.
Docker image: Docker images được lưu trữ trên ổ đĩa, nếu không dọn dẹp image cũ, sẽ chiếm dụng không gian lưu trữ.
Docker volume: Volumes có thể tồn tại lâu dài nếu không xóa các container không sử dụng, gây đầy ổ đĩa.
Logs của Docker container: Các file log không được quản lý có thể trở nên quá lớn, chiếm dung lượng ổ đĩa.
Không giới hạn tài nguyên: Nếu không giới hạn tài nguyên, container có thể chiếm dụng không gian đĩa không kiểm soát.
Tệp cache và tệp trung gian: Các tệp cache và trung gian từ quá trình xây dựng container có thể tích tụ và chiếm dung lượng ổ đĩa.
Những cách khắc phục để tránh đầy ổ đĩa khi sử dụng docker
Tham khảo tại Prune unused Docker objects để xem docs chính thức những cách tránh đầy ổ đĩa khi sử dụng docker.
Dọn dẹp containers
Để xóa tất cả các container đã dừng, bạn có thể sử dụng lệnh sau:
$ docker container prune -f
Như bạn có thể thấy những image <none> được tạo ra trong quá trình chúng ta chạy CI/CD hoặc build docker image nên sẽ dễ bị đầy ổ đĩa khi sử dụng docker

Để xóa tất cả các images có tag <none> ta có thể sử dụng lệnh sau (hoặc bạn sử dụng lệnh trên cũng được):
docker rmi $(docker images -f “dangling=true” -q)
Nếu muốn tự động hoá việc này, ví dụ cứ mỗi 00:00 hàng ngày sẽ chạy lệnh để xóa những images không sử dụng, thì ta có thể sử dụng crontab:
Mở crontab bằng lệnh sau:
crontab -e
Thêm dòng sau vào cuối để lập lịch xóa các images không sử dụng:
0 0 * * * docker image prune -f
Dọn dẹp volume
Xóa các volume đang không được sử dụng cho container nào:
docker volume prune
Dọn dẹp logs
Những logs của các container sẽ được lưu trữ lại /var/lib/docker/containers/ ở đây tương ứng với mỗi ID của container sẽ có log của container đó.
Bạn sẽ truy cập tiếp vào container ID hiển thị lên và trong đó bạn sẽ thấy một file có đuôi là json.log và bạn có thể xóa nó một cách thủ công.
Khi những logs của các container đang chạy không quan trọng bạn có thể sử dụng crontab để xóa các file logs của container trên server, gõ lệnh sau để mở crontab trong chế độ chỉnh sửa:
crontab -e
Trong trình soạn thảo, thêm dòng sau vào cuối để lập lịch xóa tất cả các file logs của các container:
0 0 * * * find /var/lib/docker/containers/*/ -name “*-json.log” -type f -delete
Tuy nhiên, đó là những logs không quan trọng vậy nếu chúng ta vẫn muốn lưu log và đảm bảo không bị đầy ổ đĩa khi sử dụng docker thì chúng ta có thể giới hạn tài nguyên lưu log cụ thể như sau:
Tạo một container mới và sử dụng log driver json-file
docker run –log-driver=json-file –log-opt max-size=10m –log-opt max-file=5 <image>
Trong đó:
- –log-driver=json-file: Đặt log driver cho container là json-file.
- –log-opt max-size=10m: Giới hạn kích thước tối đa của mỗi tập tin log là 10 megabytes. Bạn có thể thay đổi giá trị theo nhu cầu của mình.
- –log-opt max-file=5: Giới hạn số lượng tập tin log tối đa là 5. Khi số lượng tập tin vượt quá giới hạn, các tập tin cũ hơn sẽ bị ghi đè. Bạn có thể thay đổi giá trị theo nhu cầu của mình.
Nếu bạn đang chạy một container đang hoạt động, bạn có thể thay đổi cấu hình log driver bằng cách sử dụng lệnh docker update
docker update –log-opt max-size=10m –log-opt max-file=5 <container_id>
Hoặc cũng có thể thiết lập cấu hình log mặc định cho tất cả các container trong Docker, chỉnh sửa tệp cấu hình Docker daemon. Thực hiện các bước sau:
- Mở tệp cấu hình Docker daemon (daemon.json). Vị trí tệp này có thể khác nhau tùy thuộc vào hệ điều hành:
- Linux: /etc/docker/daemon.json
- Windows: C:\ProgramData\docker\config\daemon.json
- macOS: /etc/docker/daemon.json (hoặc thông qua Docker Desktop)
- Nếu tệp daemon.json không tồn tại, tạo một tệp mới và thêm nội dung sau:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m", # tối đa 10m/file
"max-file": "5" # giữ lại 5 file
}
}
– Lưu và đóng tệp cấu hình.
– Khởi động lại Docker daemon để áp dụng cấu hình mới:
- Linux: sudo systemctl restart docker
- Windows: Khởi động lại Docker Desktop
- macOS: Khởi động lại Docker Desktop hoặc sử dụng lệnh sudo /etc/init.d/docker restart
Dọn dẹp cache và tệp trung gian
Khi build Docker images, Docker sử dụng một cơ chế cache để lưu trữ các bước build trước đó. Các bước build này được lưu trữ dưới dạng các layer của image. Khi thực hiện một lần build mới, Docker sẽ sử dụng lại các layer đã có sẵn trong cache thay vì thực hiện lại các bước đó, giúp tăng tốc độ build và tiết kiệm tài nguyên.
Các layer cache được lưu trữ trong Docker daemon trên máy chủ. Đường dẫn mặc định cho các layer cache này là:
- Trên Linux: /var/lib/docker/overlay2
- Trên Windows: C:\ProgramData\docker\overlay2
- Trên macOS: /var/lib/docker/overlay2
Lưu ý rằng đường dẫn và cơ chế lưu trữ cache có thể khác nhau tùy thuộc vào phiên bản Docker và cấu hình. Để xem đường dẫn chính xác của cache layer trên hệ thống của bạn, bạn có thể sử dụng lệnh docker info và tìm giá trị của khóa Docker Root Dir.
Tuy nhiên, các layer cache này không nên bị xóa thủ công mà chỉ nên được quản lý bởi Docker. Docker sẽ tự động quản lý cache và dọn dẹp các layer không sử dụng nữa.
Nếu bạn vẫn muốn xóa toàn bộ cache build để tránh đầy ổ đĩa khi sử dụng docker:
docker builder prune
Ngoài ra còn có một lệnh (không khuyến nghị) nếu chưa nắm rõ được các tài nguyên đang sử dụng bằng docker
docker system prune -a -f
Lệnh trên sử dụng để xóa tất cả các tài nguyên không sử dụng và không cần thiết trong Docker. Đây là một lệnh mạnh mẽ và cần được sử dụng cẩn thận, vì nó sẽ xóa hết tất cả các container, networks, images và volumes không sử dụng vậy sẽ tránh bị đầy ổ đĩa khi sử dụng docker.
