Skip to content

Commit e49faac

Browse files
authored
Create Tip-docker-full-disk.md
1 parent 32f06eb commit e49faac

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

Docker/Tip-docker-full-disk.md

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
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

Comments
 (0)