kiến thức DevOps thực tế và chi tiết

Những cách giúp bạn tránh bị đầy ổ đĩa khi sử dụng docker

Docker đã trở thành một công cụ quan trọng và phổ biến trong việc triển khai ứng dụng và quản lý hệ thống. Tuy nhiên, đầy ổ đĩa khi sử dụng docker là một vấn đề mà nhiều người sử dụng Docker thường gặp phải. Khi không kiểm soát được tài nguyên, hệ thống có thể trở nên chậm chạp và không hiệu quả.

Vậy làm thế nào để tránh bị đầy ổ đĩa khi sử dụng Docker? Trong bài viết này, chúng ta sẽ khám phá những cách tiếp cận và giải pháp thông minh để quản lý dung lượng lưu trữ trong Docker một cách hiệu quả.

Những nguyên nhân gây ra đầy ổ đĩa khi sử dụng docker?

  • Docker container: Nếu bạn sử dụng các ứng dụng trong container để xử lý dữ liệu, dữ liệu đó cũng sẽ được lưu trữ trong container hoặc được liên kết với một thư mục trên máy chủ chạy docker. Nếu không quản lý tốt dữ liệu hoặc các tiến trình tạo ra dữ liệu không cần thiết có thể dẫn đến đầy ổ đĩa khi sử dụng docker.
  • Docker image: Container được chạy từ docker image. Khi bạn tải xuống, tạo và cập nhật các docker images, chúng sẽ được lưu trữ trong ổ đĩa của bạn. Nếu bạn có nhiều docker images hoặc các phiên bản cũ không cần thiết, điều này có thể dẫn đến đầy ổ đĩa khi sử dụng docker.
  • Docker volume: Khi chạy container bạn có thể mount volume để lưu dữ liệu trong container ra bên ngoài ổ đĩa, vì vậy có thể những container bạn không sử dụng vẫn còn tồn tại volume có thể dẫn đến đầy ổ đĩa khi sử dụng docker.
  • Logs của docker container: Mỗi container docker có thể tạo ra các tệp log. Nếu không quản lý tốt việc ghi log, các tệp log này có thể phình to và chiếm không gian lưu trữ quan trọng trên ổ đĩa có thể dẫn đến đầy ổ đĩa khi sử dụng docker.
  • Không giới hạn tài nguyên: Nếu không giới hạn tài nguyên mà các container Docker có thể sử dụng, chúng có thể sử dụng không gian đĩa một cách không kiểm soát dẫn đến đầy ổ đĩa khi sử dụng docker.
  • Các tệp cache và tệp trung gian: docker có thể tạo ra các tệp cache và tệp trung gian trong quá trình xây dựng và chạy container. Nếu không được quản lý chặt chẽ, các tệp này có thể tích tụ và có thể dẫn đến đầy ổ đĩa khi sử dụng docker.

Những cách khắc phục để tránh đầy ổ đĩa khi sử dụng docker

bạn có thể 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

Dọn dẹp images

Để xóa tất cả các images không sử dụng, bạn có thể sử dụng lệnh sau:

$ docker image 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

tránh bị đầy ổ đĩa khi sử dụng docker

Để xóa tất cả các images có tag <none> bạn 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 bạn muốn cho quá trình này tự động, 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ì bạn có thể sử dụng crontab (Linux/Ubuntu) như sau:

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 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 bạn 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, bạn có thể chỉnh sửa tệp cấu hình Docker daemon. Bạn có thể thực hiện các bước sau:

1. 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 của bạn:

  • Linux: /etc/docker/daemon.json
  • Windows: C:\ProgramData\docker\config\daemon.json
  • macOS: /etc/docker/daemon.json (hoặc thông qua Docker Desktop)

2. Nếu tệp daemon.json không tồn tại, hãy 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
  }
}

3. Lưu và đóng tệp cấu hình.

4. 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ủ của bạn. Đườ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 của bạn. Để 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 bạn chưa nắm rõ được các tài nguyên mà bạ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.

Vậy là trong bài viết này mình đã hướng dẫn một số cách để có thể quản lý tài nguyên để bạn tránh bị đầy ổ đĩa khi sử dụng docker. Nếu bạn muốn tìm hiểu về DevOps thì có thể theo dõi website của mình, mình luôn hướng tới sự chi tiết, đơn giản, Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks.

 

Mọi thắc mắc bạn có thể liên hệ:

Email: [email protected]