我在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"
这是docker信息
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
如何增加内存?系统配置存储在哪里?
以下是卡尔的建议:
当我摆脱了所有的图像和容器,它确实释放了一些空间和图像构建运行更长的时间之前失败与相同的错误。问题是,这指的是哪个空间我怎么配置它?
检查/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选项指定的目录中创建了一堆文件。
你的cgroups已经启用了cpuset控制器。这个控制器在NUMA环境中非常有用,它允许精细地指定允许运行哪个CPU/内存库的任务。
默认情况下是强制的cpuset。Mems和cpuset。cpu没有设置,这意味着“没有空间留给”您的任务,因此出现错误。
解决这个问题最简单的方法是启用cgroup。将根组中的Clone_children改为1。对你来说,应该是
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
它基本上会指示系统自动初始化容器的cpuset。Mems和cpuset。来自父cgroup的cpu。
我也犯了同样的错误,用这种方法来解决:
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 | awk '/^<none>/ {print $3}')
然后,如果你使用Docker Compose为每个项目在本地构建图像。你最终会得到很多图片,通常和你的文件夹一样命名(例如,如果你的项目文件夹名为Hello,你会发现图片名为Hello_blablabla)。所以也要考虑删除所有这些图片
您可以编辑上面的脚本以删除它们或手动使用
Docker rmi {image-name}
如果您通过Docker Toolkit使用boot2docker映像,那么问题源于boot2docker虚拟机已耗尽空间。
当您执行docker导入或添加新映像时,映像将被复制到可能已满的/mnt/sda1中。
检查映像中可用空间的一种方法是ssh进入虚拟机并运行df -h并检查/mnt/sda1中的剩余空间
ssh命令为
Docker-machine SSH默认
一旦您确定这确实是一个空间问题,您可以根据这个问题的一些答案中的说明进行清理,或者您可以选择通过增加/mnt/sda1上的空间来调整boot2docker映像本身的大小
您可以按照这里的说明来调整图像的大小
https://gist.github.com/joost/a7cfa7b741d9d39c1307
我在RHEL机器上也遇到了这个问题。在堆栈溢出和docker-hub社区中,我没有找到任何合适的解决方案。
如果您在执行以下命令后仍面临此问题:
Docker系统全部修剪
最终奏效的解决方案:
docker info
To check current docker storage driver
Mine was : Storage Driver: devicemapper; If you have storage driver as overlay2 nothing to worry about. Solution will still work for you.
df -h
This is to check the available file systems on machine and the path where they are mounted.
Two mounted path to have a note:
/dev/mapper/rootvg-var 7.6G 1.2G 6.1G 16% /var
/dev/mapper/rootvg-apps 60G 9.2G 48G 17% /apps
Note- By default docker storage path is /var/lib/docker. It has available space ~6 GB and hence all the space related issues. So basically, I have to move default storage to some other storage where available space is more. For me its File sysyem path '/dev/mapper/rootvg-apps' which is mounted on /apps. Now task is to move /var/lib/docker to something like /apps/newdocker/docker.
mkdir /apps/newdocker/docker
chmod -R 777 /apps/newdocker/docker
Update docker.serive file on linux which resides under: /usr/lib/systemd/system
vi /usr/lib/systemd/system/docker.service
if storage device is devicemapper , comment existing ExecStart line and add below under [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
Or if storage device is overlay2:
just add -g /apps/newdocker/docker in the existing ExexStart statement.
Something like ExecStart=/usr/bin/dockerd -g /apps/newdocker/docker -H fd:// --containerd=/run/containerd/containerd.sock
rm -rf /var/lib/docker (It will delete all existing docker data)
systemctl stop docker
ps aux | grep -i docker | grep -v grep
If no output has been produced by the above command, reload systemd daemon by below command.
systemctl daemon-reload
systemctl start docker
docker info
Check out the Data Space Available: 62.15GB after mouting to docker to new File system.
DONE
Docker for Mac
所以docker系统剪接和docker系统剪接——其他答案中建议的卷每次都释放了一些空间,但最终每次我运行任何东西都得到错误。
真正解决根本问题的是删除Docker。Docker for Mac用于存储的原始文件,并重新启动它。
要找到这个文件,打开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再次填充到类似的大小。所以这个方法确实有效,但必须每隔几个月重复一次。对我来说这很好。
关于这个工作原理的说明-我不得不假设这是Mac的Docker中的一个错误。它看起来真的像Docker系统修剪/ Docker系统修剪-卷应该完全清除这个文件的内容,但它似乎文件积累了其他不能被这些命令删除的东西。不管怎样,手动删除它可以解决问题!
这可能是因为默认存储空间设置为40GB(默认路径,/var/lib/docker)
您可以更改存储卷指向不同的路径
编辑文件-> /etc/sysconfig/docker-storage
在行下更新(如果不存在则添加)
DOCKER_STORAGE_OPTIONS = '——存储驱动=叠加图= CUSTOM_PATH '
重启码头工人
Systemctl stop docker
systemctl daemon-reload
Systemctl start docker
如果你运行命令docker info(它应该显示存储驱动为overlay)
不要只运行docker prune命令。它将删除所有的docker网络、容器和映像。所以你可能最终也会丢失重要的数据。
错误显示“设备上没有剩余空间”,所以我们只需要释放一些空间。
腾出空间最简单的方法就是删除悬空的图像。
当旧创建的图像不被使用时,这些图像被称为悬空图像或有一些缓存图像,以及你可以删除。
使用下面的命令。
列出所有悬挂图像。
docker images -f "dangling=true" -q
按映像id删除映像。
docker rmi IMAGE_ID
这样你就可以腾出一些空间,重新开始使用docker了:)