数据卷
数据卷是一种特殊设计的目录, 使用Union File System实现, 允许在一个或多个容器间使用.
- 容器创建时数据卷就会初始化
- 数据卷可以在容器间共享和重用
- 对数据卷的修改是直接的
- 对镜像的升级不会影响数据卷
- 即使容器被删除了, 数据卷依然存在
- 挂载数据卷
使用-v参数指定数据卷, 可以连续使用多个-v挂载多个数据卷.
也可以在Dockerfile中使用VOLUME指令创建数据卷
docker run -d -P --name web -v /webapp training/webapp python app.py
- 定位数据卷在宿主机的位置
在Mounts节中
docker inspect web
...
"Mounts": [
{
"Name": "2f39e3bceddf9b5365bc0552c2501a0ead58a67f651d6a312affef2aacf72656",
"Source": "/var/lib/docker/volumes/2f39e3bceddf9b5365bc0552c2501a0ead58a67f651d6a312affef2aacf72656/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
Source: 指数据卷在宿主机上的位置
Destination: 是对应的容器中的位置
"RW": true 表明这是一个可读写的数据卷
- 使用宿主机的目录作为数据卷
[root@localhost ~]# docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
02068ef61cc13e50f7fdb249fa8c101245d2918c7589b430f9dddae6bbfd7c75
[root@localhost ~]# docker inspect web
...
"Mounts": [
{
"Source": "/src/webapp",
"Destination": "/webapp",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
container-dir(/webapp) 必须是绝对路径
只读方式挂载
docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py
- 使用共享存储卷作为数据卷
- 数据卷的标签
SELinux要求每一个挂载到容器的数据卷有一个标签, 否则它将拒绝容器访问数据卷的内容
-z 选项通知Docker多个容器会使用这个数据卷, Docker会为该数据卷分配一个共享内容标签
-Z 选项通知Docker为数据卷分配一个私有的不可共享的标签
- 使用宿主机文件作为数据卷
-v选项可以仅将一个文件作为数据卷进行挂载
但从Docker 1.1.0以后, 如果使用编辑器编辑文件可能造成inode变更而出现错误, 建议只挂载目录作为数据卷
创建并挂载数据卷容器
如果需要在多个容器间共享持久化数据或者从非持久化容器中访问持久化数据, 最好的解决办法是创建数据卷容器, 然后让其他容器通过数据卷容器中访问数据.
创建一个命名的数据卷容器
docker create -v /dbdata --name dbstore training/postgres /bin/true
在其他容器中使用--volumes-from挂载/dbdata卷
docker run -d --volumes-from dbstore --name db2 training/postgres
可以多次使用--volumes-from挂载不同的数据卷容器
当删除容器时, 如果不显示提供-v参数, 那么它引用的数据卷是不会被删除的, 此时就会出现悬挂数据卷
可以使用以下命令查询
docker volume ls -f dangling=true
使用以下命令删除所有悬挂数据卷
docker volume rm `docker volume ls -f dangling=true -q`
数据卷的备份恢复与迁移
docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
将/dbdata归档为/backup/backup.tar, 而/backup与$(pwd)是数据卷的两个关联目录,也就是当前目录就会生成backup.tar, 也就是/dbdata归档文件
在新的容器中解压数据卷
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
删除数据卷
使用--rm选项会在容器停止后自动删除数据卷
docker run --rm -v /foo -v awesome:/bar busybox top
共享卷使用提示
容器无法意识到宿主机对数据卷的直接访问, 谨防此现象发生, 容易造成数据损坏
网友评论