Docker 积累

Posted K.Takanashi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 积累相关的知识,希望对你有一定的参考价值。

■  磁盘空间和docker资源之间的关系

  通过docker info | grep Space可以看到Docker占据的磁盘空间的信息。其中Data Space Used表示实际上docker资源占用掉的磁盘空间。相对应的Metadata Space Used是表示了所谓的metadata占据空间的大小。

  data和metadata默认情况下是放在/var/lib/docker/devicemapper/devicemapper中。由于一般/var属于系统盘,而系统盘的大小是比较小的,所以docker很容易占满整个系统盘的空间。所以最好在启动docker的时候指定一个数据盘上的另一个目录作为docker运行时的根目录。通过dockerd的-g或者--graph参数指定。

  另一方面,我们还可以在docker应用的这个层面限制一下docker资源最多可占用的空间的大小。这个数据体现在docker info中的Data Space Total,这个数字是docker启动时配置项可配置的,不是真的磁盘中的总空间。也就是说这个数字有可能是大于docker运行时目录所在磁盘的总空间的,它从docker应用层限制了docker发展的大小。

  这个数字的设置方法是dockerd --storage-opt dm.loopdatasize=500G --storage-opt dm.loopmetadatasize=20G --storage-opt dm.basesize=8G,三个参数限制的分别是docker资源总大小,metadata总大小,单个镜像的最大大小。在启动时配合docker运行时根目录所在磁盘的实际空间,设置一个合适的大小,可以避免docker把磁盘挤满这种事情的发生。

  如果使用systemctl的方式来启动docker的话可以修改/lib/systemd/system/docker.service文件,这个文件是通过systemctl启动dockerd时的各个参数,修改其中的ExecStart加上前面说的几个参数即可。

  ●  扩容

  如果在docker运行过程中发现了大小不够要扩容了,遵循上面的原理,大概可以这么操作。1. 备份所有镜像和容器,因为到时候会删掉原有data文件并创建新的。2.关停docker服务,像上面说的那样进行启动参数的更改。 3. 删除原有的数据文件,并利用dd命令生成一个指定大小的数据文件,参考【http://blog.csdn.net/TinyJian/article/details/78436739】:

sudo rm -rf /var/lib/docker
sudo mkdir -p /var/lib/docker/devicemapper/devicemapper/
sudo dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
sudo dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1M count=0 seek=4096

 

  然后重启docker服务即可:

sudo systemctl daemon-reload
sudo systemctl start docker

 

  对于空间不够等情况,除了要扩容,更重要的应该是及时清理不要用的容器和镜像。对于镜像,在Linux上可以简单的认为是一个文件,删掉就会减少占用空间,新增就会增加占用空间。在其他一些系统如OSX上则可能会出现删掉了镜像但是空间没有空出来这种事。 * 其实在Linux上也不尽然,生成的镜像即使立刻删除,从dockerinfo的结果来看,似乎也总是会留一点东西在系统中。随着镜像的不断增多,系统的空间肯定是会一点一点变小的。

  对于容器,当一个容器被生成,容器中的内容自然是作为docker数据的一部分被写入磁盘的。容器在生命周期中,在磁盘中空间占用情况是只增不减的。也就是说当我在容器中建了一个1G的文件,磁盘自然多了1G占用,如果再建一个0.5G的文件,磁盘占用就到了1.5G。此时再把第二个文件删掉,虽然容器中看起来占据空间减少了,但是外面的磁盘中依然维持1.5G占用。除非把这个容器删除。

  

以上是关于Docker 积累的主要内容,如果未能解决你的问题,请参考以下文章

QT 实用代码片段

Docker 积累

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段

sh Docker片段