存储管理
存储管理
docker 为容器提供了两种存储资源
- 数据层: 包括镜像层和容器层,由 storage driver管理。
- Data Volume
Data Volume 有两种类型: bind mount 和 docker managed volume。
- bind mount 可实现容器与 host之间,容器与容器之间共享数据。
- volume container: 是一种具有更好移植性的容器间数据共享方案,特别是 data-packed volume container。
容器中的数据管理方式:
- 数据卷: 容器内数据直接映射到本地主机环境
- 数据卷容器: 使用特定的容器维护数据
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,他将主机操作系统目录直接映射到容器,类似mount
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
创建数据卷,数据卷路径:
/var/lib/docker/volumes/
1
[root@docker ~]# docker volume create -d local test
在用docker run命令时,使用-mount选项使用数据卷
类型 说明 volume 普通数据卷,在/var/lib/docker/volume下 bind 绑定数据卷,映射到主机指定路径 tmpfs 临时数据卷,只存在内存中 挂载刚刚创建的数据卷到容器中
--mount source=要挂载的数据卷,target=挂载到容器的路径 镜像名
1
[root@docker ~]# docker run -d -P --name nginx --mount source=test,target=/webapp nginx
默认挂载的镜像是读写权限,可以设置为只读
1
[root@docker ~]# docker run -d -P --name nginx --mount source=test,target=/webapp:ro nginx
直接挂载主机目录到容器
1
2
3# docker run -it -v /宿主机绝对目录:/容器内目录 镜像名
# 带权限的命令: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
[root@docker ~]# docker run -it -v /myDataVolume:/dataVolumerContainer centos
权限问题
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个
--privileged=true
参数即可例如:
docker run -t -i --privileged centos:latest bash
数据卷容器
本身就是一个容器,专门提供数据卷给其他容器,用于多个容器数据共享。
创建数据卷容器,并将一个数据卷挂载到此容器下
1
[root@docker ~]# docker run -it -d -v /dbdata --name dbdata ubuntu
创建db1和db2都挂载到同一个数据卷/dbdata目录下
1
2[root@docker ~]# docker run -it --volumes-from dbdata --name db1 ubuntu
[root@docker ~]# docker run -it --volumes-from dbdata --name db2 ubuntu向三个容器中任意一个/dbdata目录下写入,其他容器都可以看到
可以使用
--volumes-from
参数来从多个容器挂载多个数据卷,也可以从其他已挂载的数据卷容器来挂载数据卷1
[root@docker ~]# docker run -d --name db3 --volumes-from db1 training/postgres
如果删除了挂载卷的容器,数据卷并不会自动删除,如果要删除数据卷,必须在删除最后一个挂载着他的容器时使用
1
2# 删除容器 nginx01, 并删除容器挂载的数据卷:
docker rm -v nginx01
数据迁移
备份
1
2
3
4
5
6[root@docker ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
# --name worker ubuntu 使用ubuntu镜像创建名为worker的容器
# --volumes-from dbdata 让worker容器挂载dbdata容器的数据卷
# -v $(pwd):/backup 挂载本地的当前目录到worker容器的/backup目录
# tar cvf /backup/backup.tar /dbdata 将/dbdata下内容备份为容器内的/backup/backup.tar恢复:
1
2
3
4# 创建一个带有数据卷的容器dbdata2
[root@docker ~]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
# 创建另一个新的容器,挂载dbdata2的容器,并解压备份文件到所挂载的容器卷中
[root@docker ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
常用命令
volume create | 创建数据卷 |
---|---|
volume inspect | 查看数据卷详情 |
volume ls | 列出数据卷 |
volume prune | 清理无用数据卷 |
volume rm | 删除数据卷 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凉月の博客!
评论