Docker(三) -- 文件存储

一:简要概述

21世纪最重要的是什么?数据!数据!数据!数据分析,大数据时代,掌握海量有意义数据等于掌握未来。任何应用迭代、升级、优化都需要依赖数据说话,精准推送,用户画像等等。Docker的文件系统处于沙盒环境中,也就是随着容器销毁数据也就灰飞烟灭,显然这不是喜闻乐见的结果,为了数据实现安全、共享、持久等特点,必须将沙盒环境的文件持久化到宿主机系统中。Dokcer中提供三种数据文件交换的方式,Bind MountTmps MountVolume,但是生产中一般使用数据卷方式Volume较多

二:文件挂载 Bind Mount

类似于NFS数据共享,如果熟悉NFS的朋友应该就清楚了。Docker容器内沙盒环境理解为一个独立主机,将其与另外的独立主机通过某种协议共享数据。强调一点:目录文件的路径定义必须是绝对路径,避免混淆

2.1 创建挂载文件
// 格式如下
-v 宿主机目录文件:Docker目录文件
// 创建并运行容器redis_zsl,挂载数据目录/redis_mount(主机)到Docker容器/data中 
[root@VM_0_8_centos home]# docker run -d --name redis_zsl --network zsl -p 6379:6379 -v /home/redis_zsl:/data redis:latest 
92011792a244a5e630b2bd251fd8f7dc6b7ea149cfce943e942a20ea23239568
[root@VM_0_8_centos home]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
92011792a244        redis:latest        "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:6379->6379/tcp              redis_zsl
4bee2a698368        mysql:latest        "docker-entrypoint.s…"   2 days ago          Up 2 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-3306

// 查看宿主机挂载目录下无文件,宿主机挂载目录下创建文件redis_zsl.txtx
[root@VM_0_8_centos home]# cd redis_zsl/
[root@VM_0_8_centos redis_zsl]# ll
total 0
[root@VM_0_8_centos redis_zsl]# touch redis_zsl.txtx
[root@VM_0_8_centos redis_zsl]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 25 09:58 redis_zsl.txtx

// 进入Docker容器redis_zsl内部,查看data目录下文件
// 发现存在文件redis_zsl.txtx,挂载成功
[root@VM_0_8_centos redis_zsl]# docker exec -it redis_zsl bash
root@92011792a244:/data# ls
redis_zsl.txtx
2.2 授权管理文件

上面例子中如果在Docker容器中对挂载文件进行写操作,可以成功么?

// 进入Docker容器内部
[root@VM_0_8_centos redis_zsl]# docker exec -it redis_zsl bash
root@92011792a244:/data# ls
redis_zsl.txtx

// 创建文件docker_data.txt并退出
root@92011792a244:/data# touch docker_data.txt 
root@92011792a244:/data# ls
docker_data.txt  redis_zsl.txtx
root@92011792a244:/data# exit
exit

// 查看宿主机挂载目录中存在刚才创建文件
[root@VM_0_8_centos redis_zsl]# ls
docker_data.txt  redis_zsl.txtx

有一些配置文件需要多个容器共享,比如XML配置文件等。那么对应的要求容器只能对其拥有读权限,如何设计?使用docker inspect redis_zsl 命令查看当前容器详细信息,你会发现Mounts一栏中定义了目前文件挂载类型TypeSourceDestinationRw等,其中Rw的含义就是read、write读写权限,默认为true
在这里插入图片描述
如果只授予读权限,只需要进行如下操作即可:数据卷挂载后添加ro参数

docker run -d --name redis_zsl -p 6379:6379 --network zsl -v /home/redis_zsl/:/data:ro redis:latest

在这里插入图片描述
在这里插入图片描述

三:临时挂载 Tmpfs

借助于宿主机内存进行文件挂载的方式,即将Docker环境内的目录文件挂载到宿主机内存中。这样做的好处就是频繁修改读写的非必要数据可以保持高性能读写,毕竟内存操作。但是记住了内存操作都有共同的缺点,宿主机重启就会导致数据丢失

// 命令格式
-tmpfs Docker需要挂载的文件目录路径

docker run -d --name redis_tmpfs --tmpfs /data redis:latest 

在这里插入图片描述

四:数据卷挂载 Volume

通过Bind Mount的方式将Docker沙盒环境内的数据目录文件挂载到宿主机中进行持久化,但是宿主机中的文件并不能被Docker进行管理,这样必将给以后的迁移运维管理等操作带来麻烦。所以Docker中提出数据卷Volume的概念:
操作时只需要声明将容器中的数据目录挂载到数据卷中,Docker将会自动在宿主机环境中创建一个目录文件进行保存。当然,宿主机中目录文件位置并不需要手动指定,但是可以进行命令。这样方便多个Docker容器共用一个数据卷目录,否则其命令将会是32位字符串

4.1 数据卷挂载

同样使用-v 参数指定,与Bind Mount 区别在于无需指定宿主机挂载目录。挂载完毕后的测试效果可以仿照Bind Mount自行测试即可

  • Type: volume
  • Name: 自动生成32位字符串
  • Source:自动分配创建宿主机目录
  • Destination: Docker沙盒挂载目录文件
docker run -d --name redis_volume redis:latest

在这里插入图片描述

4.2 数据卷命名

Image镜像、Container容器使用32唯一ID操作不便,同理数据卷也是一样。命名操作如下:也就是在指定目录文件前添加数据卷名称即可

-v 数据卷名称:docker挂载目录

docker run -d --name redis_volume -v redis_volume:/data redis:latest
4.3 数据卷管理

其实学习到这里应该可以感受到Docker命令的风格,镜像命令操作都可以使用docker image开头,容器操作都可以使用docker container开头,网络操作都可以使用docker network开头。自然,数据卷操作都可以使用docker volume开头:

[root@VM_0_8_centos home]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
序号命令作用
1create创建数据卷
2inspect查看数据卷详情
3ls查看所有数据卷
4prune清理未使用的数据卷
5rm删除数据卷,但是不能删除运行容器正在使用的数据卷
4.4 数据卷共用

因为数据卷名称是唯一的,所以在使用数据卷的时候如果想复用已存在数据卷,则可以根据名字使用即可。看下面命令格式就与前面数据卷命名一致,该命令处理方式就是如果该名字数据卷名称不存在则创建,存在则复用

// 数据卷共用
-v 已存在数据卷名称:Docker挂载目录
五:数据卷容器

指定一个容器专门为数据卷容器,定义所有数据卷挂载规则。当某个容器需要使用数据卷挂载时,直接引用数据卷容器,自动匹配对应的数据卷挂载规则。这样做的好处是隐藏具体的数据卷映射规则

// 任意镜像创建数据卷容器,不需要运行。并指定相关数据卷挂载
docker create --name volume_container -v /data ubuntu

// 其余容器使用--volumes-from参数引用数据卷容器规则匹配
 docker run -d --name redis_volume_conteainer --volumes-from volume_container redis:latest
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值