问题
在使用dockerhub中的镜像时,我通常会去查看一下该镜像的dockerfile是如何编写的,看看有没有什么好的借鉴思路,经常会发现在dockerfile里面定义Volume,如下面的dockerfile
1 | FROM davidcaste/alpine-java-unlimited-jce:jdk8 |
在上面的dockerfile中就定义了 VOLUME [“/logs”],刚开始的时候并没有注意这个,以为就是提示作用而已,直到在自己的环境中出现了存储不足的问题,在环境中我将全部的镜像、容器 都删除了,但是只是释放了一点点的空间,使用下面的命令,进行查看,发现还是占用了很多空间,
du -h –max-depth=1 /var/lib/docker
在服务器上执行了
docker volume ls
发现存在大量的卷类型为local的卷,进入到这些目录,发现全是原容器内的/logs 目录的内容,虽然容器被删除了,但是/logs 目录以容器卷的方式被持久化下来了,这显示并不是我想要的现象。解释这个现象的就是docker匿名卷了。
docker匿名卷
docker匿名卷的解释可以参考这里docker匿名卷
匿名卷的目的是为了防止用户忘记将关键数据挂载到宿主机目录,为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 dockerfile中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:
docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 dockerfile 中定义的匿名卷的挂载配置。
Summary
docker匿名卷使用还是的慎重,而且需要通知到使用者,不然存储莫名其妙的用光了