在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录 (Bind mounts)
数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。
# 创建数据卷
$ docker volume create my-vol
# 查看所有的数据卷
$ docker volume ls
DRIVER VOLUME NAME
local my-vol
# 查看指定数据卷
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
# 查看容器,数据卷信息在Mounts Key下
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 在启动容器时挂载数据卷,mount参数表示使用数据卷,source参数用于指定数据卷名称
# target参数用于指定数据卷要挂载到的容器中的目录
$ docker run -d -P \
--name web \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine
# 删除数据卷
$ docker volume rm my-vol
# 删除容器的同时移除数据卷
$ docker rm -v
# 批量清理没有被挂载的数据卷
$ docker volume prune
挂载主机目录
下面的命令加载主机的 /src/webapp 目录到容器的 /usr/share/nginx/html目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 —mount 参数时如果本地目录不存在,Docker 会报错。此外,也可以通过这种方式挂载单个文件。
$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
Docker 挂载主机目录的默认权限是 读写,用户也可以通过增加 readonly 指定为 只读。
$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html:ro \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly \
nginx:alpine
-v/—volumn参数和—mount参数的差异
-v(—volume)参数只能建立bind mount,—mount参数在不指定type选项时候,默认为挂载volume,但也可以通过指定type选项来建立bind mount和tmpfs。
建立bind mount和挂载volume的区别
对比项 | bind mount | volume |
---|---|---|
Source位置 | 用户指定 | /var/lib/docker/volumes/ |
Source为空 | 覆盖dest为空 | 保留dest内容 |
Source非空 | 覆盖dest内容 | 覆盖dest内容 |
Source种类 | 文件或目录 | 只能是目录 |
可移植性 | 通常(自行维护) | 强(docker托管) |
宿主直接访问 | 容易(仅需chown) | 受限(需登录root用户)* |
参考文献
Docker数据卷挂载命令volume(-v)与mount的总结 http://www.javashuo.com/article/p-vzzffnob-np.html