容器运行时应该尽量保持容器存储层不发生写操作,对于数据库这类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。为了防止运行时用户忘记将动态挂载目录(无论是挂载主机目录还是挂载卷),在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,启动容器时可以覆盖这个挂载设置。比如:docker run -di -v mydata:/data centos
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。
数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷可以在容器之间共享和重用- 对
数据卷的修改会立马生效 - 对
数据卷的更新,不会影响镜像 数据卷默认会一直存在,即使容器被删除PS:
数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
创建一个数据卷
$ docker volume create my-vol
查看所有的 数据卷
$ docker volume lslocal my-vol
删除数据卷
$ docker volume rm my-vol
无主的数据卷可能会占据很多空间,使用以下命令可以清理
$ docker volume prune
启动容器时挂载一个数据卷
docker run -id centos \# -v my-vol:/wepapp \--mount source=my-vol,target=/webapp \
启动容器时挂载主机目录
Docker 挂载主机目录的默认权限是 读写
docker run -id centos \--mount type=bind,source=/mnt/data3/l0data,target=/mnt/data3/l0data
卷 (Docker Volume) 是受控存储,是由 Docker 引擎进行管理维护的。因此使用卷,你可以不必处理 uid、SELinux 等各种权限问题,Docker 引擎在建立卷时会自动添加安全规则,以及根据挂载点调整权限。并且可以统一列表、添加、删除。另外,除了本地卷外,还支持网络卷、分布式卷。
而挂载目录就属于用户自行维护。您必须手动处理所有权限问题。特别是在 RHEL即其衍生系统上,经常碰到 Permission Denied,就是因为没有使用卷而是使用挂载目录,而且还对 SELinux 安全权限一无所知导致。
