docker数据卷管理
什么是数据卷
Docker数据卷
是一个可供容器
使用的特殊目录
,它绕过了容器
的文件系统
,直接
将数据存储
在宿主机
上
这样可以实现一下几个重要
的目的
:
数据持久化
:即使容器
被删除
或重新创建
,数据卷
中的数据
仍然存在
,不会丢失
数据共享
:多个容器
可以同时挂载同一个数据卷
,实现数据的共享
和交互
独立于容器生命周期
:数据卷的生命周期
独立于容器
,不受容器的启动、停止和删除的影响
为什么要用数据卷
docker本身
的分层文件系统
:
性能差
生命周期
与容器相同
docker数据卷
挂载
到主机中
,绕开分层文件系统
- 和
主机磁盘性能相同
,容器删除
后依然保留
- 仅限
本地磁盘
,不能随容器迁移
docker
提供了两种卷
:
bind mount
docker managed volume
bind mount
数据卷
- 是将
主机
上的目录或文件
挂载到容器
里 - 使用直观高效,易于理解
-v选项
指定的路径
,如果在容器
中不存在
,挂载
时容器
会自动创建
挂载之后
,如果容器
中原本有挂载目录
,会将容器
中的内容删掉
,再将宿主机目录
里的内容
复制给容器
,换句话说就是容器中原有的数据
会被宿主机中
的数据所覆盖
#创建bind mount数据卷,huazi目录为bind mount数据卷
[root@docker-node1 ~]# mkdir huazi
[root@docker-node1 ~]# cd huazi/
[root@docker-node1 huazi]# echo hello world > file.txt
#第一个-v挂载目录
#第二个-v挂载文本文件
#rw表示在容器中有读写权限,不写,默认为rw,ro表示在容器中只有读权限
[root@docker-node1 ~]# docker run -it --name test1 \
> -v /root/huazi:/data1:rw \
> -v /etc/passwd:/data2/password \
> busybox
/data1 # echo huazi > file1
#发现宿主机生成了file1文本
[root@docker-node1 huazi]# ls
file1 file.txt
#只读权限
[root@docker-node1 ~]# docker run -it --name test1 \
> -v /root/huazi:/data1:ro \
> busybox
/ # cd data1/
/data1 # echo huahua > file1
sh: can't create file1: Read-only file system
#发现在容器中写入失败,但是可以在宿主机中写入
docker managed
数据卷
bind mount
必须指定宿主机文件系统路径
,限制了移植性
docker managed数据卷
不需要指定挂载源
,docker自动
在宿主机
上创建数据卷目录
默认创建的数据卷目录
都在/var/lib/docker/volumes
中- 如果
挂载
时指向容器
内已有的目录
,容器
中的数据
不会被覆盖
,再将宿主机目录
里的内容
复制给容器
#不做docker managed数据卷
[root@docker-node1 ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
[root@docker-node1 ~]# docker inspect mysql
- 如果停掉mysql容器的话,宿主机中的临时目录也会被删除
- 创建
docker managed数据卷
#创建名为mysqldata的数据卷
[root@docker-node1 ~]# docker volume create mysqldata
[root@docker-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local mysqldata
[root@docker-node1 ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 \
> -v mysqldata:/var/lib/mysql \
> mysql:5.7
[root@docker-node1 ~]# docker inspect mysql
- 当
删除容器
后,数据依然保留
[root@docker-node1 ~]# docker rm -f mysql
mysql
[root@docker-node1 ~]# cd /var/lib/docker/volumes/mysqldata/_data/
[root@docker-node1 _data]# ls
auto.cnf client-key.pem ib_logfile1 performance_schema server-key.pem
ca-key.pem ib_buffer_pool ibtmp1 private_key.pem sys
ca.pem ibdata1 mysql public_key.pem
client-cert.pem ib_logfile0 mysql.sock server-cert.pem
bind mount数据卷
和docker managed数据卷
的对比
相同点:
两者
都是宿主机文件系统
中的某个路径
不同点:
bind mount | docker managed | |
---|---|---|
volume位置 | 可任意指定 | 固定位置/var/lib/docker/volumes/下 |
对容器中原有目录的影响 | 删除容器中原有目录下的所有数据 | 不会删除 |
是否支持文本文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写 | 可设置为只读,默认为读写 |
移植性 | 移植性弱,与宿主机路径绑定 | 移植性强,无需指定宿主机目录,写数据卷名就可以 |
原文地址:https://blog.csdn.net/huaz_md/article/details/144402791
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!