自学内容网 自学内容网

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 mountdocker managed
volume位置可任意指定固定位置/var/lib/docker/volumes/下
对容器中原有目录的影响删除容器中原有目录下的所有数据不会删除
是否支持文本文件支持不支持,只能是目录
权限控制可设置为只读,默认为读写可设置为只读,默认为读写
移植性移植性弱,与宿主机路径绑定移植性强,无需指定宿主机目录,写数据卷名就可以

原文地址:https://blog.csdn.net/huaz_md/article/details/144402791

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!