一:简要概述
21世纪最重要的是什么?数据!数据!数据!数据分析,大数据时代,掌握海量有意义数据等于掌握未来。任何应用迭代、升级、优化都需要依赖数据说话,精准推送,用户画像等等。Docker的文件系统处于沙盒环境中,也就是随着容器销毁数据也就灰飞烟灭,显然这不是喜闻乐见的结果,为了数据实现安全、共享、持久等特点,必须将沙盒环境的文件持久化到宿主机系统中。Dokcer中提供三种数据文件交换的方式,Bind Mount
、Tmps Mount
、Volume
,但是生产中一般使用数据卷方式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一栏中定义了目前文件挂载类型Type
、Source
、Destination
、Rw
等,其中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.
序号 | 命令 | 作用 |
---|---|---|
1 | create | 创建数据卷 |
2 | inspect | 查看数据卷详情 |
3 | ls | 查看所有数据卷 |
4 | prune | 清理未使用的数据卷 |
5 | rm | 删除数据卷,但是不能删除运行容器正在使用的数据卷 |
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