143

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

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

场景 2(使用 Docker 机器)
然后我使用 Docker 机器创建一个 VM,并告诉 Docker 使用eval $(docker-machine env streambacker-dev).

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

码头机器 df -h

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

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

码头机器 df -h

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

谢谢!

有关信息,我正在使用Docker Machine 0.4.0-rc2Docker Compose 1.3.2

4

8 回答 8

149

我有同样的错误([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}

于 2016-05-19T16:49:29.437 回答
89

如上所述, 与tmpfs无关--virtualbox-disk-size。似乎 boot2docker 挂载tmpfs到内存中,因此您需要为您的 virtualbox vm 分配更多内存。您可以通过指定--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-memory8096

$ 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% /
于 2015-09-11T08:13:21.670 回答
83

如果您使用的是 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")
于 2017-02-21T15:08:26.107 回答
15

A. 删除未使用的图像

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

码头工人ps -a -s

B. 修改 Docker JSON 描述符

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

C. LINUX 调整大小:

在 Windows 操作系统中,docker machine 或 boot2docker 实际上是一个 virtualbox vm,然后您可以按照程序调整磁盘大小。注意备份文件。一般的过程是在virtualbox中调整大小,然后使用一个名为gpartd的工具来修改linux在其分区中感知到的空间。有一些链接可以执行以下引用的此过程:

D. 重新创建 Docker-MACHINE / BOOT2DOCKER

这个想法是重新创建默认的 docker-machine。下面的命令可以说明你。请注意,当您重新创建 boot2docker 时,您将丢失之前下载的 docker 映像。

docker-machine rm 默认

docker-machine create --driver virtualbox --virtualbox-disk-size "100100" 默认

docker-machine 环境默认

然后你可以去虚拟盒子,用命令“df -h”查看boot2docker空间

于 2016-06-10T20:09:55.427 回答
2

在 docker osx / 我能够按下一个按钮 [ Move Disk Image ],它成功地移动了 Docker.qcow2 (大概包含容器/图像)

在此处输入图像描述 最初 - 当机器启动时 - 我仍然收到 “设备上没有剩余空间”错误 ,但很快就解决了。

于 2017-09-06T22:41:37.753 回答
0

运行docker system df以查看 docker 上占用了哪些空间

然后运行:

docker system prune --all --force

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

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

于 2020-10-19T06:16:32.873 回答
0

使用您喜欢的文本编辑器打开file /lib/systemd/system/docker.service并替换以下行,其中/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

完成此操作后,创建您在上面指定的新目录,并可选择rsync将当前 docker 数据创建到新目录:

# 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

于 2021-08-20T07:42:10.777 回答
0

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

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

这将我之前拥有的虚拟机的内存和磁盘大小增加了一倍,您可以在此处添加您认为合适的设置大小

于 2018-10-01T08:19:30.580 回答