我通过以下方式在 Debian 7 机器上安装了 docker
$ echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
之后,当我第一次尝试创建图像时,它失败并出现以下错误
time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device"
这是码头工人信息
Containers: 2
Images: 21
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 25
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 2
Total Memory: 15.7 GiB
WARNING: No memory limit support
WARNING: No swap limit support
我怎样才能增加内存?系统配置存储在哪里?
来自 Kal 的建议:
当我摆脱所有图像和容器时,它确实释放了一些空间,并且图像构建运行时间更长,然后失败并出现相同的错误。那么问题来了,这指的是哪个空间,我该如何配置呢?
df -ih
当前的最佳做法是:
docker system prune
在接受后果之前,请注意此命令的输出:
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]
换句话说,继续执行此命令是永久性的。请记住,最佳实践是处理 stopped containers as ephemeral,即您应该使用 Docker 设计您的工作,以不保留这些停止的容器。如果您不主动调试容器,您可能需要考虑在运行时使用 --rm
flag。
请务必阅读 this answer,re: Volumes
如果 docker system prune
不适合您,您可能也对 this answer 感兴趣。
我有同样的错误并以这种方式解决:
1.删除 Docker 中的孤立卷,可以使用内置的 docker volume 命令。内置命令还会删除 /var/lib/docker/volumes 中不是卷的任何目录,因此请确保您没有在其中放置任何要保存的内容。
警告如果您有一些要保留的数据,请务必小心
清理:
$ docker volume rm $(docker volume ls -qf dangling=true)
附加命令:
列出悬空卷:
$ docker volume ls -qf dangling=true
列出所有卷:
$ docker volume ls
2.还可以考虑删除所有未使用的图像。
首先删除 <none>
图像(这些图像有时会在构建图像时生成,如果由于某种原因图像构建被中断,它们会保留在那里)。
这是我用来删除它们的好脚本
docker rmi $(docker images | grep '^<none>' | awk '{print $3}')
然后,如果您使用 Docker Compose 为每个项目在本地构建图像。您最终会得到很多通常以您的文件夹命名的图像(例如,如果您的项目文件夹名为 Hello,您将找到图像名称 Hello_blablabla
)。所以也考虑删除所有这些图像
您可以编辑上述脚本以删除它们或手动删除它们
docker rmi {image-name}
docker images -qf dangling=true
,当然也可以使用 docker rmi $(docker images -qf dangling=true)
删除它们。
检查 /var 上是否有可用空间,因为这是 Docker 默认存储图像文件的位置(在 /var/lib/docker 中)。
首先通过使用 docker ps -a
列出所有容器(包括停止的容器)和 docker rm
来清除它们;然后使用 docker images
列出您存储的所有图像并使用 docker rmi
删除它们。
接下来使用 docker 守护程序上的 -g 选项或通过编辑 /etc/default/docker
并将 -g
选项添加到 DOCKER_OPTS
来更改存储位置。 -g
指定“Docker 运行时”的位置,它基本上是 Docker 在您构建映像和运行容器时创建的所有内容。选择一个有足够空间的位置,因为使用的磁盘空间会随着时间的推移而增长。如果您编辑 /etc/default/docker
,则需要重新启动 docker 守护程序才能使更改生效。
现在您应该能够创建一个新映像(或从 Docker Hub 中提取一个),并且您应该看到在您使用 -g 选项指定的目录中创建了一堆文件。
docker ps -a
列出所有容器(包括退出的容器),然后使用 docker rm
删除它们。使用 docker images
列出所有图像,然后使用 docker rmi
删除它们。希望这应该清理所有东西(或大多数东西)。
如前所述,
docker system prune
有帮助,但对于 Docker 17.06.1 及更高版本,无需修剪未使用的卷。从 Docker 17.06.1 开始,以下命令也会修剪卷:
docker system prune --volumes
来自 Docker 文档:https://docs.docker.com/config/pruning/
docker system prune 命令是修剪镜像、容器和网络的快捷方式。在 Docker 17.06.0 及更早版本中,卷也会被修剪。在 Docker 17.06.1 及更高版本中,您必须为 docker system prune 指定 --volumes 标志以修剪卷。
如果要修剪卷并保留图像和容器:
docker volume prune
docker volume prune
今天在这里所有其他解决方案都停止工作时帮助了我。
docker system prune --volumes
对我有用,但我必须先手动停止并删除所有容器。否则 prune
命令挂起,无法删除卷。也许我有一个反应迟钝的容器。
docker system prune --all --volumes
帮助了我
一次删除所有未使用的容器、卷、网络和图像 (https://docs.docker.com/engine/reference/commandline/system_prune/):
docker system prune -a -f --volumes
如果还不够,可以先删除正在运行的容器:
docker rm -f $(docker ps -a -q)
docker system prune -a -f --volumes
增加 /var/lib/docker 或使用具有更多空间的其他位置也是消除此错误的好方法(请参阅 How to change the docker image installation directory?)
docker system prune
不删除卷。
docker system prune -a -f --volumes
将删除卷。
docker system prune -af --volumes
将清除之前创建的所有 docker 资源。
docker system prune
删除了大约 7GB 的内容。 docker system prune --volumes
增加了 4GB 左右,然后 docker system prune -a -f --volumes
删除了 575.5GB 的内容。笏。这是磁盘内容分析器无法捕获的所有空间。这个答案应该更高。 -a
和 -f
标志可以产生巨大的差异。
Docker for Mac
因此,在其他答案中建议的 docker system prune
和 docker system prune --volumes
每次都释放了 一些 空间,但最终每次我运行任何东西时都会遇到错误。
真正解决了根本问题的是删除 Docker for Mac 用于存储的 Docker.raw
文件,然后重新启动它。
要找到该文件,请打开 Docker for Mac 并转到*
Preferences > Resources > Advanced > Disk Image Location
*这是针对版本 2.2.0.5,但在旧版本上应该类似
在较新版本的 Docker for Mac** 上,它会在 UI 中向您显示磁盘上该文件的实际大小,以及它的最大分配大小。你可能会看到它是巨大的。例如在我的机器上是 41GB!
**在旧版本上,它不会在 UI 中向您显示实际的磁盘使用情况,并且 MacOS Finder 始终将文件大小显示为最大分配大小。您可以通过在终端中打开目录并运行 du -h Docker.raw 来检查磁盘上的实际大小
我删除了 Docker.raw
,重新启动了 Docker for Mac,文件再次自动创建并恢复为 0GB。
一切都像以前一样继续工作,虽然我当然丢失了我的 Docker 缓存。正如预期的那样,在运行了一些 Docker 命令之后,文件又开始被几 GB 的东西填满,但远不及 41GB。
更新
几个月后,我的 Docker.raw
再次填充到类似大小。所以这种方法确实有效,但必须每隔几个月重复一次。对我来说这很好。
关于这个工作原理的说明 - 我必须假设这是 Docker for Mac 中的一个错误。看起来 docker system prune
/ docker system prune --volumes
应该完全清除此文件的内容,但似乎该文件累积了这些命令无法删除的其他内容。无论如何,手动删除它可以解决问题!
/Users/<your-username>/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
如果它只是 Docker 的测试安装(即不是生产)并且您不关心进行核清洁,您可以:
清理所有容器:docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm
清理所有图像:docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f
同样,我在开发 Docker 时在我的 ec2 实例中使用它,而不是在任何严肃的 QA 或生产路径中。最棒的是,如果您拥有 Dockerfile,则很容易重建和或docker pull
。
docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f
。 xargs
的 OS X BSD 版本支持 -L
选项,这与 boot2docker 的版本不同。
docker ps -a -q
等来避免文本操作,即 docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)
应该可以解决问题
如果您使用的是 Docker Desktop,您可以通过转到 Docker 的首选项来增加高级设置中的磁盘映像大小。
这是来自 macOS 的屏幕截图:
https://i.stack.imgur.com/FvGEHl.png
我也在 RHEL 机器上遇到了这个问题。我在 stack-overflow 和 docker-hub 社区的任何地方都没有找到任何合适的解决方案。如果您即使在执行以下命令后仍面临此问题:
docker system prune --all
最终奏效的解决方案:
docker info 要检查当前的 docker 存储驱动程序我的是:存储驱动程序:devicemapper;如果您有存储驱动程序作为 overlay2,则无需担心。解决方案仍然适用于您。 df -h 这是检查机器上可用的文件系统以及它们的挂载路径。两个挂载路径有备注: /dev/mapper/rootvg-var 7.6G 1.2G 6.1G 16% /var /dev/mapper/rootvg-apps 60G 9.2G 48G 17% /apps 注意-默认docker存储路径是/var/lib/docker.它有大约 6 GB 的可用空间,因此存在所有与空间相关的问题。所以基本上,我必须将默认存储移动到可用空间更多的其他存储。对我来说,它的文件系统路径“/dev/mapper/rootvg-apps”安装在/apps 上。现在的任务是将 /var/lib/docker 移动到 /apps/newdocker/docker 之类的位置。 mkdir /apps/newdocker/docker chmod -R 777 /apps/newdocker/docker 更新 linux 上的 docker.serive 文件,该文件位于: /usr/lib/systemd/system vi /usr/lib/systemd/system/docker.service if存储设备是 devicemapper ,注释现有的 ExecStart 行并在 [Service] 下添加: ExecStart= ExecStart=/usr/bin/dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.basesize=40GB -g /apps/newdocker/docker --exec-opt native.cgroupdriver=cgroupfs 或者如果存储设备是overlay2:只需在现有的ExexStart语句中添加-g /apps/newdocker/docker。类似 ExecStart=/usr/bin/dockerd -g /apps/newdocker/docker -H fd:// --containerd=/run/containerd/containerd.sock rm -rf /var/lib/docker (它将删除所有现有的 docker 数据)systemctl stop docker ps aux | grep -i 码头工人 | grep -v grep 如果上述命令没有产生输出,请通过以下命令重新加载 systemd 守护进程。 systemctl daemon-reload systemctl start docker docker info 查看可用数据空间:将 docker 挂载到新文件系统后 62.15GB。完毕
在我的例子中,我运行 docker system df
来找出哪个组件占用更多空间,然后我执行 docker system prune -a
来清理所有悬空的容器、图像等。最后,我运行 docker volume rm $(docker volume ls -qf dangling=true)
来清理悬垂的卷。
以下是按顺序执行的命令。
docker system df
docker system prune -a
docker volume rm $(docker volume ls -qf dangling=true)
docker system df
,谢谢!
我去了码头设置并更改了可用的图像空间。使用 docker build
创建新映像时达到了限制。所以我只是增加了可用的数量。
https://i.stack.imgur.com/cgR9D.png
Docker 会留下悬空的图像,这些图像会占用你的空间。要在 Docker 之后进行清理,请运行以下命令:
docker image prune [-af if you want to force remove all images]
或者使用旧版本的 Docker:
docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")
这将删除退出的和悬空的图像,这有望清除设备空间。
minikube ssh
SSH 连接到 VM 之后,docker image prune -a
为我使用了运行我的 docker 容器的 minikube。 docker 镜像在我的虚拟机中占用了 8GB。
就我而言,我没有那么多图像/容器,但构建缓存正在填满我的 Docker 磁盘。
您可以通过运行看到这是问题所在
docker system df
输出:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 22 13 7.581GB 3.899GB (51%)
Containers 15 0 2.166GB 2.166GB (100%)
Local Volumes 4 4 550.2MB 0B (0%)
Build Cache 611 0 43.83GB 43.83GB!!!!!!!!!
下面的命令解决了这个问题
docker builder prune
docker builder prune
删除构建的所有未使用缓存
清理悬空图像 docker rmi $(docker images -f "dangling=true" -q) 删除不需要的卷 删除未使用的图像 删除未使用的容器
1. 移除容器:
$ docker rm $(docker ps -aq)
2. 删除图像:
$ docker rmi $(docker images -q)
您可以执行以下操作,而不是执行步骤 1 和 2:
docker system prune
此命令将删除:
所有停止的容器
至少一个容器未使用的所有卷
至少一个容器未使用的所有网络
所有悬空图像
您还可以使用:
docker system prune
或仅卷:
docker volume prune
--volumes
添加到 docker system prune
,它将组合在一起
如果您已经清理了未使用的容器,则使用
docker system prune -a
确保检查您是否有不健康的容器。他们可以以一种奇怪且不可预测的方式行事。在我的情况下,因为这些,我得到了这个错误,甚至有大量的磁盘空间。
docker ps -a
将列出所有容器。如果其中任何一个看起来像这样:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds (unhealthy) 3300-3310/tcp webapp
您将需要重新启动 docker 守护程序。
在我的情况下,安装 ubuntu-server 18.04.1 [出于某种奇怪的原因] 创建了一个大小仅为 4GB 而不是 750GB 的 LVM 逻辑卷。因此,在拉取图像时,我会收到“设备上没有剩余空间”错误。修复很简单:
lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
使用以下命令清理 Docker:
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
不要只运行 docker prune
命令。它将删除所有 docker 网络、容器和图像。因此,您最终也可能会丢失重要数据。
错误显示“设备上没有剩余空间”,所以我们只需要释放一些空间。
释放一些空间的最简单方法是删除悬空图像。
当不使用旧创建的图像时,这些图像被称为悬空图像,或者还有一些缓存图像可以删除。
使用以下命令。列出所有悬空图像的图像 ID。
docker images -f "dangling=true" -q
按图像 ID 删除图像。
docker rmi IMAGE_ID
这样您就可以腾出一些空间并再次开始使用 docker 进行黑客攻击 :)
dangling=true
命令的所有结果:docker images -f "dangling=true" -q | xargs -I {} docker rmi {}
docker images -f "dangling=true" -q | xargs docker rmi
您的 cgroup 启用了 cpuset
控制器。该控制器在 NUMA 环境中最有用,它允许精细指定允许您的任务运行的 CPU/内存组。
默认情况下,未设置强制 cpuset.mems
和 cpuset.cpus
,这意味着您的任务“没有剩余空间”,因此出现错误。
解决此问题的最简单方法是在根 cgroup 中将 cgroup.clone_children
启用为 1。在你的情况下,它应该是
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
它基本上会指示系统从其父 cgroup 自动初始化容器的 cpuset.mems
和 cpuset.cpus
。
echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
如果您通过 Docker Toolkit 使用 boot2docker 映像,则问题源于 boot2docker 虚拟机空间不足。
当您执行 docker import
或添加新图像时,图像会被复制到可能已满的 /mnt/sda1
中。
检查映像中可用空间的一种方法是 ssh 进入 vm 并运行 df -h
并检查 /mnt/sda1 中的剩余空间
ssh 命令是 docker-machine ssh default
一旦确定确实是空间问题,您可以根据此问题的一些答案中的说明进行清理,也可以选择通过增加 /mnt/sda1
上的空间来调整 boot2docker 映像本身的大小
您可以按照此处的说明调整图像大小 https://gist.github.com/joost/a7cfa7b741d9d39c1307
我运行以下命令。
之后无需重建图像。
docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)
这些删除退出/悬空的容器和悬空的卷。
这可能是由于默认存储空间设置为 40GB(默认路径,/var/lib/docker)
您可以更改存储卷以指向不同的路径
编辑文件-> /etc/sysconfig/docker-storage
更新以下行(如果不存在则添加)
DOCKER_STORAGE_OPTIONS='--storage-driver=overlay --graph=CUSTOM_PATH'
重启 docker systemctl stop docker systemctl daemon-reload systemctl start docker
如果您运行命令 docker info (它应该将存储驱动程序显示为覆盖)
这么多关于修剪语句的帖子。确实,此命令将清理 docker 文件,如果实际存储空间受到阻碍,它不会修复您的系统。对我来说,问题是服务器的存储空间已经满了。因此我有两个选择。
选项 1:清理现有空间
运行其他人所说的所有系统修剪命令。 df -H,还剩多少空间?使用 du --block-size=M -a / | 检查系统上占用这么多空间的内容排序-n -r | head -n 20,这将显示 20 个最大的文件。删除文件或将它们移出系统。
选项 2:获得更多空间
为硬盘驱动器添加更多空间,然后进行扩展。如果您像我一样只有一个 HD,我必须安装名为“gparted”的操作系统并扩展驱动器。
似乎有几种方法可以发生这种情况。我遇到的问题是 docker 磁盘映像已达到其最大大小(如果您想查看 OSX 中的大小,则 Docker Whale -> Preferences -> Disk)。
我提高了限制,并且很高兴。我确信清理未使用的图像也会起作用。
对我来说,docker system prune
做到了。我正在运行mac os。
docker volume ls
没有返回任何内容,因此看起来存储主要用于缓存和悬空图像。
就我而言,发生这种情况是因为我超过了 10Gb 的 Docker 映像大小限制。看来这已经有所缓解,并且有一种方法可以将限制增加到 100Gb (https://github.com/moby/moby/issues/5151),但我不确定如何 - 对于我的用例,切换到映射卷很好,它有反正性能更好。
$ docker rm $(docker ps -aq)
这对我有用
docker system prune
最新版本似乎是更好的选择
我刚碰到这个。我在 Ubuntu 20.04 上。什么有效?重新安装 Docker:
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt-get install docker-ce docker-ce-cli containerd.io
有点粗鲁,我知道。我尝试修剪 Docker,但它仍然无法正常工作。
不定期副业成功案例分享
df -ih
看到的 inode 用完了。要进行更严格的诊断,请输入ncdu
,然后按 c 来查看文件计数,然后按 C 来按文件数量排序,以粗略估计正在使用所有 inode 的内容。如果问题确实是 docker,那么使用最多 inode 的目录会立即显现出来。docker system prune
docker images
和docker rmi
。