Docker匿名卷

问题

  在使用dockerhub中的镜像时,我通常会去查看一下该镜像的Dockerfile是如何编写的,看看有没有什么好的借鉴思路,经常会发现在Dockerfile里面定义Volume,如下面的Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM davidcaste/alpine-java-unlimited-jce:jdk8

MAINTAINER David Castellanos <davidcaste@gmail.com>

ENV TOMCAT_MAJOR=8 \
TOMCAT_VERSION=8.5.3 \
TOMCAT_HOME=/opt/tomcat \
CATALINA_HOME=/opt/tomcat \
CATALINA_OUT=/dev/null

RUN apk upgrade --update && \
apk add --update curl && \
curl -jksSL -o /tmp/apache-tomcat.tar.gz http://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
gunzip /tmp/apache-tomcat.tar.gz && \
tar -C /opt -xf /tmp/apache-tomcat.tar && \
ln -s /opt/apache-tomcat-${TOMCAT_VERSION} ${TOMCAT_HOME} && \
rm -rf ${TOMCAT_HOME}/webapps/* && \
apk del curl && \
rm -rf /tmp/* /var/cache/apk/*

COPY logging.properties ${TOMCAT_HOME}/conf/logging.properties
COPY server.xml ${TOMCAT_HOME}/conf/server.xml

VOLUME ["/logs"]
EXPOSE 8080

   在上面的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匿名卷使用还是的慎重,而且需要通知到使用者,不然存储莫名其妙的用光了