一、介绍
数据卷是一个可供一个或多个容器使用的特殊容器,它有以下特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
二、创建一个数据卷
可以在使用docker run命令的时候添加-v参数来创建一个数据卷并挂载到容器里
docker run -d -P --name web -v /webapp training/webapp python app.py 在Dockerfile中可以使用VOLUME来添加一个或者多个新的卷到容器中。
三、挂载一个主机目录作为数据卷
可以使用-v参数指定挂载一个本地主机的目录到容器中
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py 以上命令是加载主机的/src/webapp目录到容器的/opt/webapp目录,本地路径必须是绝对路径。
Dockerfile中不支持这种做法,因为Dockerfile是为了移植和分享用的。
Docker挂载的数据卷默认的读写的,可以通过:ro命令修改为只读
docker run -d -P --name web -v /srv/webapp:/opt/webapp:ro四、挂载一个本地主机文件作为数据卷
可以添加-v命令从主机挂载单个文件到容器中
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash 这样就可以记录在容器中输入的命令。如果直接挂载一个文件,很多文件编辑工具,包括vi或者sed --in-place,可能会造成文件inode的改变,会导致报错误信息,所以最简单的办法就是直接挂载文件的父目录。
五、数据卷容器
若需要将一些持续更新的数据需要在容器之间共享,那么可以创建数据卷容器,它是一个正常的容器,专门用来提供数据卷供其他容器挂载的。
1、创建数据卷容器
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres2、挂载数据卷
可以使用--volumes-from命令来挂载数据卷
docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres也可以通过其他已经挂载了数据卷的容器来挂载数据卷
docker run -d --name db3 --volumes-from db1 training/postgres3、删除数据卷
必须在删除最后一个还挂载数据卷的容器时使用docker rm -v命令来同时删除关联的数据卷
六、利用数据卷容器来备份、恢复、迁移数据卷
1、备份
可以使用tar命令来备份数据卷
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 上述命令中,会将dbdata卷备份为本地的/backup/backup.tar
2、恢复
可以通过untar命令解压备份文件到挂载的容器卷中,假设现有一个数据卷容器dbdata2,
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar