|
| 1 | +# Làm thế nào để tránh ổ đĩa bị đầy khi xài Docker? |
| 2 | +## Xóa image với tag none |
| 3 | +Một trong những thứ chiếm dung lượng ổ đĩa nhiều nhất là Docker Image, nhưng thứ khiến ổ đĩa bị đầy lại không phải là những image ta dùng để chạy chương trình mà nguyên nhân chính đến từ những image với tag `<none>`. |
| 4 | + |
| 5 | +Gõ câu lệnh `docker images` để kiểm tra. |
| 6 | +``` |
| 7 | +docker images |
| 8 | +``` |
| 9 | +``` |
| 10 | +REPOSITORY TAG IMAGE ID CREATED SIZE |
| 11 | +postgres <none> 5861c038d674 14 months ago 371MB |
| 12 | +k8s.gcr.io/ingress-nginx/controller <none> bf621a764db5 17 months ago 278MB |
| 13 | +k8s.gcr.io/ingress-nginx/controller <none> 81d7cdfa4169 2 years ago 280MB |
| 14 | +``` |
| 15 | +Các image tag `<none>` này là các image rất cũ được sinh ra trong quá trình ta chạy CI/CD để xây dựng image từ Dockerfile hoặc trong quá trình ta kéo image từ trên registry xuống. Ta có thể xóa image tag `<none>` để giảm dung lượng của ổ đĩa. |
| 16 | + |
| 17 | +Với Docker phiên bản nhỏ hơn 1.13, chạy câu lệnh sau để liệt kê toàn bộ image tag `<none>`: |
| 18 | + |
| 19 | +``` |
| 20 | +docker images -f "dangling=true" |
| 21 | +``` |
| 22 | +Thêm `-q` vào để chỉ lấy `IMAGE ID`: |
| 23 | +``` |
| 24 | +docker images -f "dangling=true" -q |
| 25 | +``` |
| 26 | +Thực thi câu lệnh xóa: |
| 27 | +``` |
| 28 | +docker rmi $(docker images -f "dangling=true" -q) |
| 29 | +``` |
| 30 | +Với Docker phiên bản 1.13+: |
| 31 | +``` |
| 32 | +docker image prune |
| 33 | +``` |
| 34 | +Ta nên cấu hình crontab để chạy 1 ngày 1 lần với câu lệnh trên. |
| 35 | +``` |
| 36 | +cat <<EOF >> /etc/cron.daily/clear-tag-none |
| 37 | +#!/bin/sh |
| 38 | +
|
| 39 | +docker rmi $(docker images -f "dangling=true" -q) |
| 40 | +EOF |
| 41 | +``` |
| 42 | +``` |
| 43 | +chmod +x /etc/cron.daily/clear-tag-none |
| 44 | +``` |
| 45 | +Tùy vào hệ điều hành thì cấu hình crontab cho phù hợp. |
| 46 | + |
| 47 | +## Xóa tệp tin json logs của Docker |
| 48 | +Thứ chiếm dung lượng ổ đĩa tiếp theo là Docker Json Logs, mặc định khi cài Docker thì toàn bộ logs của container sẽ được Docker lưu ở thư mục `/var/lib/docker/containers/*` ở dạng json, nếu ta không thường xuyên xóa logs ở thư mục này thì nó sẽ lên tới vài chục hoặc vài trăm GB. |
| 49 | + |
| 50 | +Để xóa logs ở thư mục này ta có vài cách sau: |
| 51 | + |
| 52 | +- Cấu hình crontab |
| 53 | +- Dùng logrotate |
| 54 | +- Giới hạn dung lượng logs của container |
| 55 | +## Xóa thủ công với crontab |
| 56 | +Nếu logs của container không quan trọng thì bạn dùng cách sau để xóa logs. |
| 57 | + |
| 58 | +Câu lệnh để xóa toàn bộ logs trong tệp tin: |
| 59 | +``` |
| 60 | +cat /dev/null > /var/lib/docker/containers/*/*-json.log |
| 61 | +``` |
| 62 | +Cấu hình crontab: |
| 63 | +``` |
| 64 | +cat <<EOF >> /etc/cron.daily/clear-container-logs |
| 65 | +#!/bin/sh |
| 66 | +
|
| 67 | +cat /dev/null > /var/lib/docker/containers/*/*-json.log |
| 68 | +EOF |
| 69 | +``` |
| 70 | +``` |
| 71 | +chmod +x /etc/cron.daily/clear-container-logs |
| 72 | +``` |
| 73 | +## Tự động với logrotate |
| 74 | +Nếu bạn muốn giữ lại logs thì có thể dùng `logrotate` để tự động giảm dung lượng logs của Docker. |
| 75 | + |
| 76 | +Hầu hết các Linux Distro đều cài sẵn `logrotate`, cấu hình logrotate cho tệp tin logs của Docker rất đơn giản, ta tạo tệp tin `logrotate-container` ở thư mục `/etc/logrotate.d` và dán cấu hình ở dưới vào: |
| 77 | +``` |
| 78 | +/var/lib/docker/containers/*/*.log { |
| 79 | + rotate 7 |
| 80 | + daily |
| 81 | + compress |
| 82 | + missingok |
| 83 | + delaycompress |
| 84 | + copytruncate |
| 85 | +} |
| 86 | +``` |
| 87 | +Chạy thử: |
| 88 | +``` |
| 89 | +logrotate -fv /etc/logrotate.d/logrotate-container |
| 90 | +``` |
| 91 | +Măc định logrotate có sẵn crontab nằm ở thư mục `/etc/cron.daily` để chạy logrotate hằng ngày nên ta không cần phải cấu hình crontab thêm. |
| 92 | + |
| 93 | +## Giới hạn dung lượng logs của container |
| 94 | +Từ phiên bản 1.8 trở đi thì Docker có sẵn chức năng logrotate cho json logs. Khi chạy container ta thêm vào thuộc tính `--log-opt` vào để giới hạn dung lượng logs của container. |
| 95 | +``` |
| 96 | +docker run --log-driver json-file --log-opt max-size=10m nginx |
| 97 | +``` |
| 98 | +Nếu ta cần cấu hình cho toàn bộ container thì thêm cấu hình sau vào `daemon.json`, nằm ở thư mục `/etc/docker/` trên Linux. |
| 99 | +``` |
| 100 | +{ |
| 101 | + "log-driver": "json-file", |
| 102 | + "log-opts": { |
| 103 | + "max-size": "10m", |
| 104 | + "max-file": "3" |
| 105 | + } |
| 106 | +} |
| 107 | +``` |
0 commit comments