docker占用磁盘空间清理

问题描述: 发现磁盘空间不够,分析磁盘情况发现docker占用了大量磁盘空间,下面分析如何找到谁是最大的磁盘占用者。

查看磁盘使用:

du -m --max-depth=1 ./
输出:
13	./sbin
1	./application
1	./srv
1262	./opt
160	./root
13	./bin
1	./corefile
140932	./home
4	./lib32
1	./dev
du: cannot access './run/user/1000/gvfs': Permission denied
11	./run
1108	./lib
1	./cgroup
1	./lib64
1	./data
1	./nomad
0	./sys
231	./boot
1	./media
191261	./var
3094	./snap
1	./cdrom
1	./mnt
1	./lost+found
9408	./usr
1	./.config
1	./rootfs
1	./tmp
16	./etc
du: cannot access './proc/31724/task/31724/fd/3': No such file or directory
du: cannot access './proc/31724/task/31724/fdinfo/3': No such file or directory
du: cannot access './proc/31724/fd/4': No such file or directory
du: cannot access './proc/31724/fdinfo/4': No such file or directory
du: cannot access './proc/32032': No such file or directory
0	./proc
347511	./

可以看到var目录使用磁盘比较大。

cd var
du -m --max-depth=1 ./
输出:
1	./opt
9	./backups
1	./metrics
153	./cache
1	./local
191011	./lib
88	./log
1	./spool
1	./snap
1	./mail
1	./crash
1	./tmp
191261	./

cd lib
du -m --max-depth=1 ./
输出
1	./xkb
1	./NetworkManager
1	./dictionaries-common
1	./ubiquity
1	./man-db
1	./initscripts
1	./polkit-1
1	./ieee-data
1	./apparmor
1	./urandom
1	./rpm
119	./dpkg
1	./gems
1	./update-rc.d
1	./colord
1	./fwupd
1	./usb_modeswitch
1	./os-prober
2	./ureadahead
1	./vim
1	./certmonger
1	./sudo
1	./ipa-client
188219	./docker
13	./app-info
...

可以看到docker使用大部分磁盘空间。

/var/lib/docker# du -sh
184G	.

分析docker的磁盘使用情况

docker system df
输出:
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              30                  10                  13.76GB             6.882GB (50%)
Containers          10                  10                  20.05GB             0B (0%)
Local Volumes       5                   2                   845MB               624.6MB (73%)
Build Cache                                                 0B                  0B

实际使用并不是很高。

分析docker目录: /var/lib/docker

du -m --max-depth=1 ./
输出:
807	./volumes
1	./trust
1	./builder
1	./network
1	./containerd
75	./image
1	./plugins
1	./runtimes
64338	./aufs
1	./swarm
123000	./containers
1	./tmp
188219	./
root@lap-131:/var/lib/docker# 

最大的两块:
/var/lib/docker/aufs# du -sh
63G	.
/var/lib/docker/containers# du -sh
121G	.

分析容器占用最大的容器: gitlab

/var/lib/docker/containers# du -m --max-depth=1 ./
输出:
1	./a3ea6a15d0e0f4f5e2d7c5e7faf7fa3c172659126e94f033600528318960c663
3	./80039c421bb69a2d25a59be4a95a30ad8df5a3552371db3c47223298e4950775
1	./b117d03cd46018dd71688d2b17bcb08e68f2f76c66ebf05a63a25dd99593be6e
1	./8168081fb8241b776a87ff0bc5eaba59ce6ab49c2a35961cbfddc7c062b8c02a
16	./d988b1bfbaf1bfcc6b1f0d4cbf07bdf1eff61cf88589bb853e3194adb8f321f9
236	./348f2400b96eba5918959041007d4c08fbe75bb3b4d3021cc487f8f297be6a76
1	./15bd5827152a4a01cb3d246aafba2f202a03e29561a59517872a719591d16a95
1	./3c77f3562cf66a7e47726add293e5803d801b302d380a8a2fca6838a36c6a905
1	./2136547f678cf92118b546f0eb67a1798313d7521d58ad392931435bb046eafb
122745	./cce705b881997536dcb2455f2cc23986e06bc73a78eb0728a1182f7abe0bcc10
123000	./

docker ps
输出:
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS                 PORTS                                                                     NAMES
cce705b88199        gitlab/gitlab-ce                          "/assets/wrapper"        2 years ago         Up 4 hours (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:122->22/tcp, 0.0.0.0:1443->443/tcp            gitlab

分析容器内占用磁盘最大的文件:

cd /var/lib/docker/containers/cce705b881997536dcb2455f2cc23986e06bc73a78eb0728a1182f7abe0bcc10
ll -h
输出:
total 120G
drwx------  4 root root 4.0K 9月  15 15:23 ./
drwx------ 12 root root  76K 9月  15 15:01 ../
-rw-r-----  1 root root 120G 9月  15 15:24 cce705b881997536dcb2455f2cc23986e06bc73a78eb0728a1182f7abe0bcc10-json.log
drwx------  2 root root 4.0K 11月  8  2018 checkpoints/
-rw-------  1 root root  28K 9月  15 15:23 config.v2.json
-rw-r--r--  1 root root 1.5K 9月  15 15:23 hostconfig.json
-rw-r--r--  1 root root   10 9月  15 11:35 hostname
-rw-r--r--  1 root root  174 9月  15 11:35 hosts
drwx------  3 root root 4.0K 11月  8  2018 mounts/
-rw-r--r--  1 root root  212 9月  15 11:35 resolv.conf
-rw-r--r--  1 root root   71 9月  15 11:35 resolv.conf.hash

最大的为docker容器的日志。

Docker限制容器日志大小

参考文档: https://blog.csdn.net/gulijiang2008/article/details/105269414

清理Docker容器log(治标)

cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log
示例:
cat /dev/null > /var/lib/docker/containers/cce705b881997536dcb2455f2cc23986e06bc73a78eb0728a1182f7abe0bcc10/cce705b881997536dcb2455f2cc23986e06bc73a78eb0728a1182f7abe0bcc10-json.log 

设置Docker容器日志大小(治本)

设置一个容器服务的日志大小上限

通过配置容器docker-compose.yml的max-size选项来实现:

nginx:
  image: nginx:1.12.1
  restart: always
  logging:
    driver: "json-file"
    options:
      max-size: "5g"

全局设置

新建/etc/docker/daemon.json,若有就不用新建了

# vim /etc/docker/daemon.json

{
    "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
    "log-driver":"json-file",
    "log-opts": {"max-size":"500m", "max-file":"3"}
}

说明:

  • max-size=500m,意味着一个容器日志大小上限是500M,
  • max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json

注:设置后只对新添加的容器有效。

重启docker守护进程

systemctl daemon-reload
systemctl restart docker

启动容器命令行配置:

docker run --help
输出:
--log-opt list                   Log driver options

示例:
docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1