为什么 docker 图像占用了我的磁盘 space 而 docker 未使用
Why is docker image eating up my disk space that is not used by docker
我已经设置 docker 并且我使用了完全不同的块设备来存储 docker 的系统数据:
[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker
other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"
注意 /disk/1
使用的是完全不同的硬盘 /dev/xvdi
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.8G 5.1G 2.6G 67% /
devtmpfs 1.9G 108K 1.9G 1% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdi 20G 5.3G 15G 27% /disk1
/dev/dm-1 9.8G 1.7G 7.6G 18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2 9.8G 1.7G 7.7G 18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac
问题是,当我继续下载 docker 图像并运行 docker 容器时,似乎另一个硬盘驱动器 /dev/xvda1
也用完了
我可以通过删除一些 docker 图片来验证这个问题。在我删除了一些 docker 图片后,/dev/xvda1
现在多了一些 space。
我是不是漏掉了什么?
我的docker版本:
[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
Pool Name: docker-202:1-275421-pool
Pool Blocksize: 64 Kb
Data file: /disk1/docker/devicemapper/devicemapper/data
Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
Data Space Used: 3054.4 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 4.7 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09
这是 devicemapper 的内核问题,它影响 OS 的 RedHat 系列(RedHat、Fedora、CentOS 和 Amazon Linux)。已删除的容器不会释放映射磁盘 space。这意味着在受影响的 OS 上,当您启动和重新启动容器时,您将慢慢地从 space 中 运行。
Docker 项目知道这一点,并且内核应该在上游 (https://github.com/docker/docker/issues/3182) 中得到修复。
一种解决方法是为 Docker 提供自己的卷来写入 ("When Docker eats up you disk space")。这实际上并没有阻止它吃东西 space,只是在它吃东西后关闭你系统的其他部分。
我的解决方案是卸载 docker,然后删除其所有文件,然后重新安装:
sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker
这让我的 space 回来了,但这与启动替换实例没有太大区别。我还没有找到更好的解决方案。
移动 /var/lib/docker
目录。
假设 /data
目录有足够的空间,如果没有,请替换为一个有空间的目录,
sudo systemctl stop docker
sudo mv /var/lib/docker /data
sudo ln -s /data/docker /var/lib/docker
sudo systemctl start docker
这样,您就不必重新配置 docker。
是的,Docker使用/var/lib/docker文件夹来存储图层。有一些方法可以回收 space 并将存储移动到其他目录。
您可以挂载更大的磁盘space并将/var/lib/docker的内容移动到新的挂载位置并创建sym link。
关于如何完成上述任务有详细说明。
http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html
您也可以删除中间层。
如 Github.com
问题 #18867 - Delete data in a container devicemapper can not free used space 中所述
尝试运行以下命令:
# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
它使用fstrim
工具trim devicemapper精简配置磁盘。
删除整个 /var/lib/docker 对我来说不合适。这些是更安全的方法:
解决方案一:
问题中的以下命令为我清除了 space,这比删除 /var/lib/docker 或 Windows 检查磁盘映像位置 here 更安全。
之前:
docker info
示例输出:
Metadata file:
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB
Docker 较新版本中的命令,例如17.x+
docker system prune -a
它将向您显示一条警告,表明它将删除所有已停止的容器、网络、图像和构建缓存。通常删除它是安全的。 (下次你 运行 一个容器时,它可能会从 Docker 注册表中提取)
示例输出:
Total reclaimed space: 1.243GB
然后您可以再次 运行 docker info 查看已清理的内容
docker info
方案二:
与此同时,确保 docker 容器内的程序没有将 many/huge 文件写入文件系统。
检查您的 运行ning docker 进程的 space 使用大小
docker ps -s #may take minutes to return
或者对于所有容器,甚至退出
docker ps -as #may take minutes to return
然后您可以删除违规的 container/s
docker rm <CONTAINER ID>
找到可能正在使用 space
演出的罪魁祸首
docker exec -it <CONTAINER ID> "/bin/sh"
du -h
在我的例子中,程序正在编写大量的临时文件。
(Nathaniel Waisbrot mentioned in the accepted answer this issue 我从这个问题中得到了一些信息)
或
旧版本 Docker 中的命令,例如1.13.x(运行 作为 root 而不是 sudo):
# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)
# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)
# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)
之后:
> docker info
Metadata file:
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB
我遇到了类似的问题,我认为当磁盘中没有足够的 space 来存储所有 docker 图像时,就会发生这种情况。我为 docker 图像预留了 6GB,结果证明这对我来说还不够。无论如何,我已经删除了所有图像和容器,但磁盘仍然看起来已满。大多数 space 被 /var/lib/docker/devicemapper 和 /var/lib/docker/tmp 使用。
这个命令对我不起作用:
# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
首先,我停止了docker服务:
sudo service docker stop
然后我删除了/var/lib/docker:
然后我按照 https://github.com/docker/docker/issues/18867#issuecomment-232301073
中有人的建议做了
删除 docker 元数据的现有实例 rm -rf /var/lib/docker
sudo rm -rf /var/lib/docker
将以下选项传递给 docker 守护程序:-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
启动 docker 守护进程。
最后两步,我运行:
sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
也许你可以尝试docker system prune
删除所有不重要的图像
Docker 默认情况下修剪不会删除卷,
你可以试试
docker volume prune -f
有同样的问题。在我的场景中,我的 vbox 运行 存储不足 space。经过调查发现我的 docker 本地卷占用了 30GB。 Ubuntu 16.04 主机。
找出你的。
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 0 1.361GB 1.361GB (100%)
Containers 0 0 0B 0B
Local Volumes 7 0 9.413GB 9.413GB (100%)
Build Cache 0B 0B
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 build cache
Are you sure you want to continue? [y/N]
这会释放磁盘 space 中未使用的本地卷。在我的场景中,释放了 20 GB 的存储空间 space。如果要保留它们,请确保要保留的容器是 运行,因为这会删除所有已停止的容器。
对于 运行 在 MacOS 中遇到此问题的人,对我有用的解决方案是寻找 Docker.raw 文件,该文件 Docker 用于保留逻辑space 在主机中然后删除。如果你有 Docker 个桌面,你可以去:
Preferences -> Resources -> Advanced
然后在 Disk image location
选项卡下查看。
导航到终端中的该文件夹,然后删除 Docker.raw
文件 ($ rm -rf Docker.raw
)
重要说明:
只有当您不需要任何现有图像或卷时才这样做。
我已经设置 docker 并且我使用了完全不同的块设备来存储 docker 的系统数据:
[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker
other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"
注意 /disk/1
使用的是完全不同的硬盘 /dev/xvdi
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.8G 5.1G 2.6G 67% /
devtmpfs 1.9G 108K 1.9G 1% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdi 20G 5.3G 15G 27% /disk1
/dev/dm-1 9.8G 1.7G 7.6G 18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2 9.8G 1.7G 7.7G 18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac
问题是,当我继续下载 docker 图像并运行 docker 容器时,似乎另一个硬盘驱动器 /dev/xvda1
也用完了
我可以通过删除一些 docker 图片来验证这个问题。在我删除了一些 docker 图片后,/dev/xvda1
现在多了一些 space。
我是不是漏掉了什么?
我的docker版本:
[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
Pool Name: docker-202:1-275421-pool
Pool Blocksize: 64 Kb
Data file: /disk1/docker/devicemapper/devicemapper/data
Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
Data Space Used: 3054.4 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 4.7 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09
这是 devicemapper 的内核问题,它影响 OS 的 RedHat 系列(RedHat、Fedora、CentOS 和 Amazon Linux)。已删除的容器不会释放映射磁盘 space。这意味着在受影响的 OS 上,当您启动和重新启动容器时,您将慢慢地从 space 中 运行。
Docker 项目知道这一点,并且内核应该在上游 (https://github.com/docker/docker/issues/3182) 中得到修复。
一种解决方法是为 Docker 提供自己的卷来写入 ("When Docker eats up you disk space")。这实际上并没有阻止它吃东西 space,只是在它吃东西后关闭你系统的其他部分。
我的解决方案是卸载 docker,然后删除其所有文件,然后重新安装:
sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker
这让我的 space 回来了,但这与启动替换实例没有太大区别。我还没有找到更好的解决方案。
移动 /var/lib/docker
目录。
假设 /data
目录有足够的空间,如果没有,请替换为一个有空间的目录,
sudo systemctl stop docker
sudo mv /var/lib/docker /data
sudo ln -s /data/docker /var/lib/docker
sudo systemctl start docker
这样,您就不必重新配置 docker。
是的,Docker使用/var/lib/docker文件夹来存储图层。有一些方法可以回收 space 并将存储移动到其他目录。
您可以挂载更大的磁盘space并将/var/lib/docker的内容移动到新的挂载位置并创建sym link。
关于如何完成上述任务有详细说明。
http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html
您也可以删除中间层。
如 Github.com
问题 #18867 - Delete data in a container devicemapper can not free used space 中所述尝试运行以下命令:
# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
它使用fstrim
工具trim devicemapper精简配置磁盘。
删除整个 /var/lib/docker 对我来说不合适。这些是更安全的方法:
解决方案一:
问题中的以下命令为我清除了 space,这比删除 /var/lib/docker 或 Windows 检查磁盘映像位置 here 更安全。
之前:
docker info
示例输出:
Metadata file:
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB
Docker 较新版本中的命令,例如17.x+
docker system prune -a
它将向您显示一条警告,表明它将删除所有已停止的容器、网络、图像和构建缓存。通常删除它是安全的。 (下次你 运行 一个容器时,它可能会从 Docker 注册表中提取)
示例输出:
Total reclaimed space: 1.243GB
然后您可以再次 运行 docker info 查看已清理的内容
docker info
方案二:
与此同时,确保 docker 容器内的程序没有将 many/huge 文件写入文件系统。
检查您的 运行ning docker 进程的 space 使用大小
docker ps -s #may take minutes to return
或者对于所有容器,甚至退出
docker ps -as #may take minutes to return
然后您可以删除违规的 container/s
docker rm <CONTAINER ID>
找到可能正在使用 space
演出的罪魁祸首docker exec -it <CONTAINER ID> "/bin/sh"
du -h
在我的例子中,程序正在编写大量的临时文件。
(Nathaniel Waisbrot mentioned in the accepted answer this issue 我从这个问题中得到了一些信息)
或
旧版本 Docker 中的命令,例如1.13.x(运行 作为 root 而不是 sudo):
# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)
# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)
# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)
之后:
> docker info
Metadata file:
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB
我遇到了类似的问题,我认为当磁盘中没有足够的 space 来存储所有 docker 图像时,就会发生这种情况。我为 docker 图像预留了 6GB,结果证明这对我来说还不够。无论如何,我已经删除了所有图像和容器,但磁盘仍然看起来已满。大多数 space 被 /var/lib/docker/devicemapper 和 /var/lib/docker/tmp 使用。
这个命令对我不起作用:
# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
首先,我停止了docker服务:
sudo service docker stop
然后我删除了/var/lib/docker:
然后我按照 https://github.com/docker/docker/issues/18867#issuecomment-232301073
中有人的建议做了删除 docker 元数据的现有实例 rm -rf /var/lib/docker
sudo rm -rf /var/lib/docker
将以下选项传递给 docker 守护程序:-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
启动 docker 守护进程。
最后两步,我运行:
sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
也许你可以尝试docker system prune
删除所有不重要的图像
Docker 默认情况下修剪不会删除卷,
你可以试试
docker volume prune -f
有同样的问题。在我的场景中,我的 vbox 运行 存储不足 space。经过调查发现我的 docker 本地卷占用了 30GB。 Ubuntu 16.04 主机。
找出你的。
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 0 1.361GB 1.361GB (100%)
Containers 0 0 0B 0B
Local Volumes 7 0 9.413GB 9.413GB (100%)
Build Cache 0B 0B
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 build cache
Are you sure you want to continue? [y/N]
这会释放磁盘 space 中未使用的本地卷。在我的场景中,释放了 20 GB 的存储空间 space。如果要保留它们,请确保要保留的容器是 运行,因为这会删除所有已停止的容器。
对于 运行 在 MacOS 中遇到此问题的人,对我有用的解决方案是寻找 Docker.raw 文件,该文件 Docker 用于保留逻辑space 在主机中然后删除。如果你有 Docker 个桌面,你可以去:
Preferences -> Resources -> Advanced
然后在 Disk image location
选项卡下查看。
导航到终端中的该文件夹,然后删除 Docker.raw
文件 ($ rm -rf Docker.raw
)
重要说明: 只有当您不需要任何现有图像或卷时才这样做。