Docker Machine:设备上没有剩余空间

149

我正在尝试使用Docker Compose设置Docker Machine。

场景1(没有Docker Machine)
如果我在没有Docker Machine的情况下运行docker-compose up -d,它会按预期创建三个已链接的容器(nginx + mongodb + nodejs)。

场景2(有Docker Machine)
然后,我使用Docker Machine创建一个虚拟机,并使用eval $(docker-machine env streambacker-dev)告诉Docker与该机器通信。

此时,如果我ssh到我的docker机器并运行df -h,我会得到:

docker machine df -h

然后,如果我运行docker-compose up -d,我会在下载最后一个容器时遇到“设备上没有剩余空间”错误

之后,“tmpfs”似乎确实有点满了:

docker machine df -h

检查--virtualbox-disk-size选项,显示其默认为20000 MB,我认为这就是我们可以在两张图片中看到的“/dev/sda1”。那么为什么容器会填满“tmpfs”,而“tmpfs”究竟是什么?它是一个临时下载目录吗?我应该如何为我的容器创建更多的空间?

谢谢!

供您参考,我使用的是Docker Machine 0.4.0-rc2Docker Compose 1.3.2


4
--virtualbox-disk-size 参数与 tmpfs 无关。tmpfs 是一种类似于 RAM 磁盘的文件系统,挂载在内存中,没有任何东西访问您的磁盘。请注意不改变原意。 - Henrik Sachse
感谢 @h3nrik 提供的信息。 - Marc Perrin-Pelletier
3
检查 Docker 中悬空的内容,如悬空镜像和悬空卷,并删除它们。使用命令 docker rmi $(docker images -f dangling=true -q) 删除悬空镜像,使用命令 docker volume rm $(docker volume ls -f dangling=true -q) 删除悬空卷。 - Jinna Balu
8个回答

163

我遇到了同样的错误 ([ERROR] InnoDB: Error number 28 means 'No space left on device'),并通过以下方法解决:

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} 命令手动删除它们。


3
在Mac上,我必须在参数值周围使用单引号('):docker rmi $(docker images | grep'^ <none>'| awk'{print $ 3 }')。如此描述的那样可以使用“docker rm $(docker ps-qa --no-trunc --filter"status = exited")”来删除停止的容器:https://dev59.com/NlwY5IYBdhLWcg3wWWq0#32723127。 - Webdevotion
1
我有很多未使用的图像,达到了我的 shell 字符限制。这就是为什么我执行了 docker images | grep "^<none>" | xargs docker rmi - Matthias Braun
1
删除不必要的图像对我很有帮助。 - akauppi
1
docker volume prune - justin.m.chase
请查看我的逐步说明,了解如何在另一个线程中使用resize2fs调整/var/lib/docker的大小:https://dev59.com/S1wY5IYBdhLWcg3wkIYi - Alex
它帮助了我,因此我相信确实已经达到了某种能力 - 所以问题是:这是什么限制?它是否可以进行配置/监视? - JJ Roman

92

如果您正在使用 Docker 社区版:

 docker system prune --volumes  

如果您正在使用 boot2docker (docker-machine),请清除孤立的卷:

 docker volume rm $(docker volume ls -qf dangling=true)

清除未使用的图片:

 docker rmi $(docker images -q -f "dangling=true")

9
docker system prune 帮助了我。 - Maxim Yefremov
2
docker system prune 赢了 - Michael Guild
1
docker volume prune 只会清除卷,系统清理不会清除悬空的卷。 - justin.m.chase
当上述方法无法为您释放足够的空间时,这里有一个“核选项”:docker rmi $(docker images -q)。如果它跳过了包含在多个容器中的许多层,请添加 --force - EmptyArsenal
您不需要为卷和其余部分使用两个命令:docker system prune --volumes - jannis

89

如上所述,tmpfs--virtualbox-disk-size无关。似乎boot2docker将tmpfs挂载到内存中,因此您需要为虚拟机分配更多内存。您可以通过指定--virtualbox-memory参数来完成这个操作。

   --virtualbox-memory "1024"
Size of memory for host in MB [$VIRTUALBOX_MEMORY_SIZE]

默认值:

$ docker-machine create --driver virtualbox testA
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
$ docker-machine ssh testA
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@testA:~$ df -h /
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   896.6M    112.7M    783.9M  13% /

--virtualbox-memory设置为8096

$ docker-machine create --driver virtualbox --virtualbox-memory 8096 testB
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
$ docker-machine ssh testB
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@testB:~$ df -h /
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     6.9G    112.4M      6.8G   2% /

14
不是很直观,但这个方法有效。到底怎么回事,Docker? - BastiBen
1
确实不直观!然而,这似乎是问题所在,并且对我有用。所以,+1。 - Ray Pendergraph
问题也被我解决了,虽然我不知道原理,但还是非常感谢! - Bendihossan
有什么办法可以增加默认大小,这样我就不必每次手动指定了吗? - CGFoX

15

A. 删除未使用的镜像

使用docker rm或docker rmi命令可以删除不需要的镜像。实际上,存在一种帮助完成此任务的映像(martin/docker-cleanup-volumes)。基础是从您的映像和容器列表中开始选择:

docker ps -a -s

B. 修改Docker JSON描述符

在某些论坛中提到过。这个想法是增加位于~/.docker/machine/machines/default/config.json中的描述符。该参数似乎是DiskSize,但我不知道它是否适用于其他操作系统(不适用于Windows)。

C. Linux调整大小:

在Windows操作系统中,docker machine或boot2docker实际上是一个virtualbox虚拟机,因此您可以按照调整磁盘的过程进行操作。请注意备份文件。 一般的过程是在virtualbox中进行调整,然后使用一个叫做gpartd的工具来修改linux在其分区中感知的空间。 下面引用了一些执行此过程的链接:

D. 重新创建docker-machine / boot2docker

想法是重新创建默认的docker-machine。以下命令可以说明问题。请注意,由于您正在重新创建boot2docker,因此将丢失先前下载的docker映像。

docker-machine rm default

docker-machine create --driver virtualbox --virtualbox-disk-size "100100" default

docker-machine env default

然后您可以进入virtual box并使用“df -h”命令查看boot2docker空间


谢谢。我在Windows上工作。我通过重新创建docker-machine来实现它。 - KinoP
帮助了D:(重新创建Docker机器) - StanislavL
谢谢,重新创建 Docker Machine 对我有用(我在 Windows 上)。 - Lucha Laura Hardie
我感受到了很多爱! - eduyayo

4
运行docker system df命令以查看Docker占用的空间情况。
然后运行:
docker system prune --all --force

清除所有隐藏和未使用的容器。

docker system prune 不会删除所有未使用的容器。


那就是答案!我就是在找那个“docker system df”啊 ;) - Brandt

2
在Docker的OSX上,我能够按下一个按钮[移动磁盘映像],并成功地移动了Docker.qcow2(可能包含容器/镜像)。
最初-当机器启动时-我仍然遇到了设备上没有剩余空间的错误,但很快就解决了。enter image description here

你把它移动到了哪个更好的位置(允许更多空间)? - littleforest
外置 SSD 硬盘 - johndpope

0

使用您喜欢的文本编辑器打开 /lib/systemd/system/docker.service 文件,并将以下行替换为 /new/path/docker,其中 /new/path/docker 是您新选择的 Docker 目录的位置:

FROM:
ExecStart=/usr/bin/docker daemon -H fd://
TO:
ExecStart=/usr/bin/docker daemon -g /new/path/docker -H fd://

当准备好时停止Docker服务:

# systemctl stop docker

检查 Docker 服务是否已停止,以下命令不应返回任何结果

# ps aux | grep -i docker | grep -v grep

重新加载守护进程

# systemctl daemon-reload

完成此步骤后,创建一个你上面指定的新目录,并可选地将当前 Docker 数据rsync到新目录中:

# mkdir /new/path/docker
# rsync -aqxP /var/lib/docker/ /new/path/docker

# systemctl start docker

确认 Docker 运行在新目录中

#  ps aux | grep -i docker | grep -v grep

https://linuxconfig.org/how-to-move-docker-s-default-var-lib-docker-to-another-directory-on-ubuntu-debian-linux


0

我遇到了这个问题,在Mac上使用docker UI无法添加额外的空间,我使用homebrew安装了docker并在创建机器时运行了以下命令:

docker-machine create --driver virtualbox --virtualbox-memory "2048" --virtualbox-disk-size "40000" default

这会将我之前拥有的virtualbox内存和磁盘大小加倍,并且您可以根据需要在此处添加所需的设置大小。


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