容器运行时应该尽量保持容器存储层不发生写操作,对于数据库这类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。为了防止运行时用户忘记将动态挂载目录(无论是挂载主机目录还是挂载卷),在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

  1. VOLUME /data

这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,启动容器时可以覆盖这个挂载设置。比如:
docker run -di -v mydata:/data centos
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。

数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

    PS:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷

创建一个数据卷

  1. $ docker volume create my-vol

查看所有的 数据卷

  1. $ docker volume ls
  2. local my-vol

删除数据卷

  1. $ docker volume rm my-vol

无主的数据卷可能会占据很多空间,使用以下命令可以清理

  1. $ docker volume prune

启动容器时挂载一个数据卷

  1. docker run -id centos \
  2. # -v my-vol:/wepapp \
  3. --mount source=my-vol,target=/webapp \

启动容器时挂载主机目录

Docker 挂载主机目录的默认权限是 读写

  1. docker run -id centos \
  2. --mount type=bind,source=/mnt/data3/l0data,target=/mnt/data3/l0data

卷 (Docker Volume) 是受控存储,是由 Docker 引擎进行管理维护的。因此使用卷,你可以不必处理 uid、SELinux 等各种权限问题,Docker 引擎在建立卷时会自动添加安全规则,以及根据挂载点调整权限。并且可以统一列表、添加、删除。另外,除了本地卷外,还支持网络卷、分布式卷。
而挂载目录就属于用户自行维护。您必须手动处理所有权限问题。特别是在 RHEL即其衍生系统上,经常碰到 Permission Denied,就是因为没有使用卷而是使用挂载目录,而且还对 SELinux 安全权限一无所知导致。