前言

这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结。

在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此行重点标注的原因就是我在面试中被问到过:docker使用的是什么文件系统?),通过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@docker ~]# docker run -tid --name data -v /data/web01/:/dbdata -v /data/web02:/index busybox

#运行两个nginx容器

[root@docker ~]# docker run -d --name web01 --volumes-from data -P nginx

[root@docker ~]# docker run -d --name web02 --volumes-from data -P nginx

当容器运行成功后,通过命令docker inspect 容器名称来查看容器的挂载信息(在查看出来的信息中找到mount字段):

1)数据卷容器data查看到的mount信息如下:

[root@docker ~]# docker inspect data

2)容器web01查看到的mount信息如下:

[root@docker ~]# docker inspect web01

3)容器web02查看到的mount信息如下:

[root@docker ~]# docker inspect web02

不难发现,采用数据卷容器这种方式可以让多个容器挂载相同的目录,让其要实现数据持久化的目录保持一致。

在需要运行的容器都运行完成后,--volumes-from指定的容器,停止或被删除,都不会影响基于nginx镜像运行的容器数据持久化。

数据卷容器使用场景:

多个容器需要实现数据持久化的目录是一致的,可以采用这种方式。

如果不使用这种方式,并且还要对多个目录实现数据持久化,那么每运行个容器都要指定很多"-v"选项来指定目录,并且出现指定错误的几率比较大。

2、Docker Manager Volume实现数据持久化

#运行容器时,-v选项只指定一个路径,则就是容器内的目录,也就是Docker Manager Volume方式

[root@docker ~]# docker run -tid -v /usr/share/nginx/html -P --name web03 nginx

[root@docker ~]# docker inspect web03 #查看容器的mount字段信息

返回的信息如下:

可以看到,它是挂载的本地一个目录,这个目录看起来比较杂乱无章,其实不然,它是docker 的root根目录,在其根目录下有一个volume目录,这个目录就是用来存放Docker Manager Volume实现数据持久化产生的数据的,在volume目录下会有以容器ID命名的目录,然后下面会有_data这个目录,这个目录就是和容器内的数据持久化目录遥相对应的。建议了解一下docker 的根目录下都有哪些东西,面试的时候我被问到过。根目录下的部分信息如下:

———————— 本文至此结束,感谢阅读 ————————

docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别相关推荐

  1. docker es持久化_docker如何保持数据持久化?其实可以考虑通过数据卷挂载的方式~...

    概述 大家都知道,docker容器中管理数据主要有两种方式,数据卷和数据卷容器,今天主要详细介绍Docker中的数据管理,也做个备忘! 数据卷 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以 ...

  2. MySQL 清空表数据的两种方式和区别

    在MySQL中删除数据有两种方式:truncate table 表名.delete from 表名. 它们在以下方面存在区别: 执行效率 truncate不扫描表,相当于重新创建了表,只保留了表的结构 ...

  3. 运行python程序的两种方式交互式和文件式_执行Python程序的两种方式

    交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口数据就消失了. 命令行式(了解) 打开文本编辑器,在文本编辑器中写入一串字符. ...

  4. java applet怎么运行_Java如何运行Applet?运行Applet的两种方式

    详细内容 applet是一个小型的动态Java程序,那么如何运行Applet?本篇文章就给大家介绍Applet,让大家了解Applet是什么,运行Applet的方法,希望对你们有所帮助. Java a ...

  5. mysql 停从库_MySQL_通过两种方式增加从库——不停止mysql服务,一般在线增加从库有两种方式 - phpStudy...

    通过两种方式增加从库--不停止mysql服务 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长 ...

  6. 在 Docker 中运行 MySQL:多主机网络下 Docker Swarm 模式的容器管理

    本文将以多主机网络环境为基础,探讨如何利用内置编排工具 Docker Swarm 模式对各主机上的容器加以管理. Docker Engine – Swarm 模式 在多台主机之上运行 MySQL 容器 ...

  7. docker swarm MySQL_容器与云|在 Docker 中运行 MySQL:多主机网络下 Docker Swarm 模式的容器管理...

    本文将以多主机网络环境为基础,探讨如何利用内置编排工具 Docker Swarm 模式对各主机上的容器加以管理. Docker Engine – Swarm 模式 在多台主机之上运行 MySQL 容器 ...

  8. Docker Compose运行MySQL、Redis服务

    Docker Compose运行MySQL.Redis服务 前言:通过容器来统一管理开发中使用到的依赖,顺便学习docker-compose 1.docker-compose.yml 文件说明 2.d ...

  9. 如何在docker中运行MySQL实例(转载)

    如何在docker中运行MySQL实例 转自:https://blog.csdn.net/siying8419/article/details/79670246 通常初学者学习docker时,不太清楚 ...

最新文章

  1. ethereumjs/ethereumjs-vm-4-tests
  2. SQL查询入门(下篇)
  3. Jquery Mobile转场特效之slide | 小小iPhone开发
  4. 自定义sort函数第三个参数的规则
  5. C++学习笔记章节中 面向对象详解
  6. python wheel使用_Python wheel.Wheel方法代碼示例
  7. 通过AVFoundation框架获取摄像头数据
  8. php 图片合成,PHP中多张图片合成一张图片例子
  9. Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
  10. Java内置的观察者模式的使用
  11. 是谁干的 linux找嫌疑人
  12. 在Web.Config中如何引入相对目录下的Access文件
  13. 【毕业设计】 python小游戏设计 - 走迷宫游戏设计与实现
  14. SSL 模拟赛 总结(2017.10.25)
  15. 2022年消闲设施行业研究报告
  16. 推荐系统(一)推荐系统整体概览
  17. 天猫重复购买用户预测数据集
  18. 简单介绍一下chatGPT
  19. 聚焦华南医药创新,9月CPhI P-MEC China华南首站定档!
  20. 超强整理,非科班小硕的进击之路

热门文章

  1. iOS面试准备之思维导图
  2. 王立飞:专注己之长 跨界求发展
  3. Java 异常处理的 9 个最佳实践
  4. 15.知识产权与标准化
  5. D(背)P(包)专题
  6. Mybatis + SpringMVC + Maven实现分页查询
  7. 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译
  8. 关于swing的一些看法
  9. Linux中逻辑卷相关知识简介
  10. C#.net模拟提交表单POST