为什么Docker会填满/var/lib/docker/overlay2目录?

46

尽管我成功地(?)删除了所有的Docker镜像和容器,但/var/lib/docker/overlay2文件夹仍然很大(152GB)。为什么?如何减少磁盘使用量?

我尝试重命名该文件夹(为可能要删除该文件夹做准备),但这导致后续的拉取请求失败。

对我来说,Docker需要这么多的磁盘空间,只是为了以后能够再次拉取镜像,这似乎相当难以置信。请告诉我哪里出了问题或者为什么必须这样做。

运行的命令列表应该显示我尝试过什么以及当前的状态:

$ docker image prune --force
Total reclaimed space: 0B

$ docker system prune --force
Total reclaimed space: 0B

$ docker image prune -a --force
Total reclaimed space: 0B

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ du -h --max-depth=1 /var/lib/docker/overlay2 | sort -rh | head -25
152G    /var/lib/docker/overlay2
1.7G    /var/lib/docker/overlay2/ys1nmeu2aewhduj0dfykrnw8m
1.7G    /var/lib/docker/overlay2/ydqchhcaqokdokxzbh6htqa49
1.7G    /var/lib/docker/overlay2/xmffou5nk3zkrldlfllopxcab
1.7G    /var/lib/docker/overlay2/tjz58rjkote2c79veonb3s6qa
1.7G    /var/lib/docker/overlay2/rlnr04hlcudgoh6ujobtsu2ck
1.7G    /var/lib/docker/overlay2/r4ubwsmrorpr08k8o5rko9n98
1.7G    /var/lib/docker/overlay2/q8x21c9enjhpitt365smkmn4e
1.7G    /var/lib/docker/overlay2/ntr973uef37oweqlxr4kmaxps
1.7G    /var/lib/docker/overlay2/mcyasqzo2gry5dvjxoao1opws
1.7G    /var/lib/docker/overlay2/m2k4u58mob6e2db86qqu1e1f8
1.7G    /var/lib/docker/overlay2/lizesless03kch8j7kpk89rcf
1.7G    /var/lib/docker/overlay2/kmu7mjvsopr8o63onbsijb98j
1.7G    /var/lib/docker/overlay2/khgjwqry5drdy0jbwf47gr2lb
1.7G    /var/lib/docker/overlay2/gt70ur50vw3whq265vmpep7ay
1.7G    /var/lib/docker/overlay2/c3tm1fcuekmdreowrfcso7nd4
1.7G    /var/lib/docker/overlay2/7j93t64mt63arj6sewyyejwyo
1.7G    /var/lib/docker/overlay2/3ftxvvg2xg02xuwcb3ut3dq89
1.7G    /var/lib/docker/overlay2/0m3o3lw6b1ggs8m6z4uv6ueqf
1.4G    /var/lib/docker/overlay2/r82rfxme096cq5pg1xz1z5arg
1.4G    /var/lib/docker/overlay2/qric73hv1z3nx4k0zop3fvcm6
1.4G    /var/lib/docker/overlay2/oyb0a5ab5h642y30s6hawj4r9
1.4G    /var/lib/docker/overlay2/oqf9ltfoy36evnkuo8ga2uepl
1.4G    /var/lib/docker/overlay2/ntuwvljxxzqs2oxhgg3enyo7x
1.4G    /var/lib/docker/overlay2/l0oi2lxdrtg42hk2rznknqk0r

$ ls -l /var/lib/docker/overlay2
total 136
drwx------  4 root root     72 Nov 20 13:03 00ep8i7v5bdmhqsxdoikslr19
drwx------  4 root root     72 Feb 28 09:47 026x5e2xns6ui2acym19qfvl7
drwx------  4 root root     72 Apr  2 19:20 032y8d31damevtfymq6yzkyi4
drwx------  4 root root     72 Apr 23 13:42 03wwbyd4uge9u0auk94wwdlig
drwx------  4 root root     72 Jan 15 12:46 04cy91a19owwqu9hyw6vruhzo
drwx------  4 root root     72 Apr  2 14:44 051625a0f856b63ed67a3bc9c19f09fb1c90303b9536791dc88717cb7379ceeb
drwx------  4 root root     72 Dec  3 19:56 059fk19uw70p6fqzei6wnj8s2
drwx------  4 root root     72 Apr 21 15:03 059mddrhqegqhxv1ockejw9gs
drwx------  4 root root     72 Nov 28 11:26 069dwkz92m8fao6whxnj4x9vp
drwx------  4 root root     72 Feb 28 09:47 06h7qo5f70oyzaqgn1elbx5u8
drwx------  4 root root     72 Dec 18 13:27 0756fd640036fa92499cfdcf4bcc3081d9ec16c25eebe5964d5e12d22beb9991
drwx------  4 root root     72 Apr 20 11:32 09rk4gm6x2mcquc5cz0yvbawq
drwx------  4 root root     72 Apr  2 19:55 09scfio3qvtewzgc5bdwgw4f6
drwx------  4 root root     72 May  4 14:00 0ac2a09aa4a038981d37730e56dece4a3d28e80f261b68587c072b4012dc044a
drwx------  4 root root     72 Feb 25 14:19 0c399f5c349ec61ac175525c52533b069a52028354c1055894466e9b5430fbc3
drwx------  4 root root     72 May  4 14:00 0cac39b1382986a2d9a6690985792c04d03192337ea37ee06cb74f2f457b7bb7
drwx------  4 root root     72 Mar  5 08:41 0czco1xx3148slgwf8imdrk33
drwx------  4 root root     72 Apr 21 08:30 0gb2iqev9e7kr587l09u19eff
drwx------  4 root root     72 Feb 20 18:03 0gknqh4pyg46uzi6asskbf8xk
drwx------  4 root root     72 Jan  8 11:43 0gugiou3wqu53os4dageh77ty
drwx------  4 root root     72 Jan  7 11:31 0i8fd5jet6ieajyl2uo1xj2ai
.
.
.

$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:04 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:25:42 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1
你有正在运行或已停止的容器吗?docker psdocker ps -a都为空吗? - Peleion
感谢您对我的问题的关注!不,没有容器正在运行,就像上面使用“docker container ls”命令所示。我运行了您建议的ps命令:$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - Floffy75
7个回答

11

你可能在某个时候切换了存储驱动,所以Docker可能只清理那些驱动,但保留overlay2(我仍然不明白为什么拉取镜像会失败)。

让我们尝试一下,运行 docker info 并检查你的存储驱动是什么:

$ docker info

Containers: 0
Images: 0
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
<output truncated>

如果不是使用的overlay2(如上所示),请尝试切换到它,然后再次清理docker镜像并检查是否已清理了该文件夹。
另一个可能的解决方案在此线程中提到,人们评论说清除日志可以解决这个问题,因此请尝试以下操作:
  1. Remove all log files:
    find /var/lib/docker/containers/ -type f -name "*.log" -delete
    
  2. Restart docker daemon (or entire machine):
    sudo systemctl restart docker
    

    or
    docker-compose down && docker-compose up -d
    

    or
    shutdown -r now
    

我不知道我的机器出了什么问题,有时候它会因为某些原因出现错误,有时候运行 find /var/lib/docker/containers/ -type f -name "*.log" -delete 可以解决问题,但有时候它只是跳到下一个错误。 - mr.xed

8

为了准备可能要删除文件夹的情况

如果您打算从Docker目录中完全删除所有数据,可以安全地执行以下步骤:

  1. 停止Docker守护程序
  2. 完全删除/var/lib/docker目录
  3. 重启Docker守护程序

Docker将重新创建任何需要的数据目录。

您也可以添加:

"log-driver": "json-file",
"log-opts": {"max-size": "20m", "max-file": "3"},

将 /etc/docker/daemon.json 文件配置限制日志大小和增长,或将日志驱动程序设置为 "journald" 来完全消除日志文件。

7
感谢您的意见和建议!
我相信我仍在使用overlay2作为存储驱动程序:
$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.8
 Storage Driver: overlay2
<output truncated>

我还清理了日志并重启了守护程序,甚至重启了整个机器。 然而问题依然存在。

最后,我按照上面的建议停止了守护程序,删除了整个docker文件夹,然后重新启动了守护程序,这样问题就解决了。

df -h
sudo systemctl stop docker
sudo mv /var/lib/docker /var/lib/docker_old
sudo systemctl start docker
sudo rm -rf /var/lib/docker_old
df -h

我担心这不是一个永久的解决方案,问题可能会再次出现,但希望能再持续一年。:)


4

两件事会填满/var/lib/docker/overlay2

  1. Docker镜像:使用docker image prune -a清理。请注意,任何当前未与容器关联的镜像都将被删除,如果需要该镜像,则需要再次拉取或构建。

  2. 容器特定更改:对容器文件系统的任何写入,如果不是去另一个挂载点(如卷),都会导致复制写入,存储在容器特定层中。您可以使用docker diff在容器上查看这些更改。即使是元数据更改,例如文件所有权、权限或时间戳,也可能触发整个文件的复制写入。

不包括在此目录中的内容:

  • :命名的卷将默认存储在/var/lib/docker/volumes中。您仍然可以使用docker volume prune来清理这些内容,但请确保首先备份了任何重要数据。更好的清理方法是使用类似以下命令删除未使用的匿名卷:

    docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | \
      xargs --no-run-if-empty docker volume rm
    
  • 容器日志:容器日志将被写入/var/lib/docker/containers。如果这些正在占用空间,则最好让docker自动旋转这些文件。有关旋转日志的详细信息,请参见this answer


  • 我发现这个答案对于调试我们的空间问题非常有帮助;现在,docker system prune -a可能只会清理一切,但是看到首次出现这种情况的原因还是很有帮助的,谢谢! - Torque

    4
    在进行docker system prune之前,尝试使用docker system df查看镜像、容器和构建缓存的磁盘使用情况。
    如果构建缓存大小过大,可以使用docker builder prune命令。
    dockerd版本为v20.10.24。

    3
    尝试清理所有内容,包括卷(与原帖命令不同):https://docs.docker.com/config/pruning/#prune-everything
    $ docker system prune --volumes
    WARNING! This will remove:
      - all stopped containers
      - all networks not used by at least one container
      - all volumes not used by at least one container
      - all dangling images
      - all dangling build cache
    
    Are you sure you want to continue? [y/N]
    

    这为我腾出了很多空间并解决了我的问题。我认为构建缓存是导致问题的罪魁祸首之一。


    0

    我曾经遇到过同样的问题,即使删除了所有的docker镜像,/var/lib/docker/overlay2仍然使用了17GB的空间:docker image rm ...

    当你停止一个容器时,除非你使用--rm标志启动它(prune-containers),否则它不会自动删除。可以使用以下命令查看容器大小:docker container ls -a -s

    我使用以下命令成功地回收了被停止容器占用的空间:docker container prune

    @Nick的答案可能更好,因为它清理了所有未使用的docker文件:docker system prune --volumes


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接