6.1 数据卷

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。

数据卷可以提供很多有用的特性,如下所示:

·数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;

·对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;

·对数据卷的更新不会影响镜像,解耦了应用和数据;

·卷会一直存在,直到没有容器使用,可以安全地卸载它。

1.在容器内创建一个数据卷

在用docker run命令的时候,使用-v标记可以在容器内创建一个数据卷。多次重复使用-v标记可以创建多个数据卷。

下面使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录:


  1. $ docker run -d -P --name web -v /webapp training/webapp python app.py

6.1 数据卷 - 图1注意

-P是将容器服务暴露的端口,是自动映射到本地主机的临时端口。

2.挂载一个主机目录作为数据卷

使用-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷(推荐方式)。


  1. $ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上面的命令加载主机的/src/webapp目录到容器的/opt/webapp目录。

这个功能在进行测试的时候十分方便,比如用户可以将一些程序或数据放到本地目录中,然后在容器内运行和使用。另外,本地目录的路径必须是绝对路径,如果目录不存在Docker,会自动创建。

Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读:


  1. $ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
  2. training/webapp python app.py

加了:ro之后,容器内对所挂载数据卷内的数据就无法修改了。

3.挂载一个本地主机文件作为数据卷

-v标记也可以从主机挂载单个文件到容器中作为数据卷(不推荐)。


  1. $ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

这样就可以记录在容器输入过的命令历史了。

6.1 数据卷 - 图2注意

如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或者sed—in-place的时候,可能会造成文件inode的改变,从Docker 1.1.0起,这会导致报错误信息。所以推荐的方式是直接挂载文件所在的目录。