VOLUME指令的格式为:
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径>
容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。
为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
例如:将 /data 目录作为容器数据卷目录
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:
docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。
实例:定义 /tmp/data 匿名挂载目录。
FROM centos # 挂载点位于 “/tmp/data” 目录 VOLUME ["/tmp/data"]
运行通过该 Dockerfile 生成镜像的容器,/tmp/data 目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的 /tmp/data 目录,那么可以运行下面的命令启动一个容器:
# 通过 -valumes-from 选项实现容器数据卷共享 $ docker run -it -volumes-from container1 image2 bash
container1为第一个容器的ID,image2为第二个容器运行镜像的名字。