Docker 容器实现数据持久化
在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2,通过docker info命令可以查看出主机上docker相关的信息,包括支持的网络类型、系统版本、内核版本、docker主机的cpu、内存等信息。如下:
在docker中实现数据持久化有两种方式:
- Bind mount
- Docker Manager Volume
.
Bind mount和Docker Manager Volume的区别:
- Bind mount数据持久化的方式,如果是挂载本地的一个目录,则容器内对应的目录下的内容会被本地的目录覆盖掉,而Docker Manager Volume这种方式则不会,不管哪种方式的持久化,在容器被销毁后,本地的数据都不会丢失。
- 使用“-v”选项挂载时,Bind mount明确指定了要挂载docker host本地的某个目录到容器中,而Docker Manager Volume则只指定了要对容器内的某个目录进行挂载,而挂载的是docker host本地的哪个目录,则是由docker来管理的。
.
数据持久化的特点:
- Data Volume是目录或文件,不能是没有格式化的磁盘(块设备)。
- 若要挂载一个文件到容器中,那么该文件必须是已经存在,否则,会被当成一个目录挂载到容器中。
- 默认挂载到容器内的文件或目录,容器是有读写权限。可以在运行容器时-v指定完挂载目录后面加“:ro” 限制容器的写入权限(:ro来限制)。
- volume数据可以永久保存,即使使用它的容器已经被销毁。
1、Bind mount——数据卷容器:--volumes-from方式实现数据持久化 以下数据卷容器挂载的方式就是Bind mount实现方式
实现的大概思路如下:
- 运行一个容器作为数据卷容器,挂载本地目录到容器内的本地目录,无需所挂载的源目录或目标挂载点是否存在,docker会自动创建相应的目录的,也无需考虑使用哪个镜像来运行这个容器,任意镜像都可以;
- 之后无论运行多少容器,都可以使用--volumes-from选项来指定第一个运行的容器进行数据持久化;
- 实现的效果为:挂载数据卷容器实现数据持久化的容器,会自动将数据卷容器挂载的本地目录挂载到该容器本身(本身的挂载点与数据卷容器的挂载点自动保持一致),也仅仅只会挂载数据卷容器实现了数据持久化的目录到自己本身,而不是数据卷容器的全部目录
上面实现的效果可能我表达的不够好,举个例子 : 有A、B、C这三个容器,其中A作为数据卷容器,挂载了本地的/data/web01和/data/web02这两个目录到容器内的/usr/share/nginx/html/和/data这两个目录。 容器B和容器C在运行之初,通过--volumes-from选项来指定容器A的名称或ID,那么最终实现的效果就是,A、B、C这三个容器内都会存在/usr/share/nginx/html及/data这两个目录,并且是实现了数据持久化的,对应的本地目录都是/data/web01和/data/web02。
#基于busybox镜像来做数据卷容器
[root@docker01 ~]# docker run -itd --name data -v /data/web01/:/usr/share/nginx/html -v /data/web02/:/data busybox
[root@docker01 ~]# docker run -d --name web01 --volumes-from data -P nginx
[root@docker01 ~]# docker run -d --name web02 --volumes-from data -P nginx
当容器运行成功后,通过命令docker inspect 容器名称来查看容器的挂载信息(在查看出来的信息中找到mount字段):
1、数据卷容器data查看到的mount信息如下
[root@docker01 ~]# docker inspect data
2、容器web01查看到的mount信息如下
[root@docker01 ~]# docker inspect web01
3、容器web02查看到的mount信息如下
[root@docker01 ~]# docker inspect web02
不难发现,采用数据卷容器这种方式可以让多个容器挂载相同的目录,让其要实现数据持久化的目录保持一致。 在需要运行的容器都运行完成后,--volumes-from指定的容器,停止或被删除,都不会影响基于nginx镜像运行的容器数据持久化。
数据卷容器使用场景:
- 多个容器需要实现数据持久化的目录是一致的,可以采用这种方式。
- 如果不使用这种方式,并且还要对多个目录实现数据持久化,那么每运行个容器都要指定很多"-v"选项来指定目录,并且出现指定错误的几率比较大。
2、Docker Manager Volume实现数据持久化
#运行容器时,-v选项只指定一个路径,则就是容器内的目录,也就是Docker Manager Volume方式
[root@docker01 ~]# docker run -itd -v /usr/share/nginx/html -P --name web03 nginx
[root@docker01 ~]# docker inspect web03
可以看到,它是挂载的本地一个目录,这个目录看起来比较杂乱无章,其实不然,它是docker 的root根目录,在其根目录下有一个volume目录,这个目录就是用来存放Docker Manager Volume实现数据持久化产生的数据的,在volume目录下会有以容器ID命名的目录,然后下面会有_data这个目录,这个目录就是和容器内的数据持久化目录遥相对应的。建议了解一下docker 的根目录下都有哪些东西,根目录下的部分信息如下:
[root@docker01 docker]# pwd
/var/lib/docker
[root@docker01 docker]# ls
builder containerd image overlay2 runtimes tmp volumes
buildkit containers network plugins swarm trust
[root@docker01 docker]# tree volumes/
volumes/
├── 9376aa52ee88fb4e3164e7b71bdcc7a2aa9b60ae0741a7ef0fdbfa2d6fc7d146
│ └── _data
│ ├── 50x.html
│ └── index.html
└── metadata.db
- django模板语法之include
- day7、用户登陆出现-bash-4.1$错误的原因
- Django--admin源码流程
- Spring Security笔记:Remember Me(下次自动登录)
- day8、 显示Linux路由表、各列信息
- day9、用户登陆出现-bash-4.1$错误的原因及解决方法
- jboss eap 6.3 域(Domain)模式配置
- 揭穿数据分析的12个神话
- jboss eap 6.3 集群(cluster)配置
- Django中Q查询及Q()对象
- jboss eap 6.3 集群(cluster)-Session 复制(Replication)
- JSP中的Servlet及Filter
- Django ORM详解
- Web前端培训:怎样成长为一个优秀的Web 前端开发工程师?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jQuery点击切换增加和删除class类
- Vue使用props和emit父子组件通信
- 听说Mysql你很豪横?-------------呕心沥血深入解析mysql备份与恢复!!!
- 排障集锦:九九八十一难之第十难!mysq备份恢复,Could not read entry at offset *: Error in log format or read error.
- Vue使用ref父子组件通信
- 听说Mysql你很豪横?-------------MySQL5.7主从同步
- 听说Mysql你很豪横?-------------MySQL5.7主从复制!读写分离!
- Vue兄弟组件传值
- Vue设置浏览器的标题title和图标icon
- VantUI封装自定义Tabbar路由跳转
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)
- jQuery实现点击添加样式同胞移除样式
- 微信小程序生命周期
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
- 微信小程序下拉刷新上拉加载