写在前面

本来是可以将数据存储在 容器内部 的。但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来。以前的同事也没有将数据映射到外面 。搞得最后我们重新导的数据,痛的领悟啊~~)。

再就是如果不将数据映射出来 ,比如要想使用容器内部的web日志,也是比较难搞,反正不就是其它容器/服务不是很方便。

大体上来说,一般只要使用Docker都会将 重要的数据 进行持久化。

本文有任何问题,欢迎留言指正~

Docker 持久化存储技术

默认仅在Container Layer(层) 保存的文件数据,删除容器就没有了

Data Volume(卷):数据卷,数据挂载相关,外挂一个存储



这个外挂的存储 ,即:Volume 有三种类型:

Volume 卷的三种类型:

  1. Volume

    Docker 自己管理的 Data Volume ,由docker后台自动创建,我们不要去 手动 更改映射出来的文件内容。挂载点 存于主机文件系统中的某个区域docker area(linux 一般是存储在 /var/lib/docker/volumes/ 目录下)。

    这种持久化方式是很推荐的*****。

  2. Bind Mounting

    将当前主机目录 与 指定的容器内部目录进行绑定 --> 实现数据共享

    我们在开发的时候比较推荐这种方式,实现数据共享

    Docker的 数据共享 技术 能极大提高开发人员的开发效率

    配合chrome插件super auto refresh plus,边写代码,边看运行结果。相当舒服~。

  3. tmpfs mount(Linux中):存于内存中(注意,并不是持久化到磁盘)。在容器的生命周期中,它能被容器用来存放非持久化的状态或敏感信息



    上图 卷的三种类型,后文主要根据代码来讲解这几种类型

Volume 相关的常用命令:

列出所有卷:docker volume ls

删除某个卷:docker volume rm 卷名

删除所有未使用的卷:docker volume prune # 慎用

创建:docker volume create

查看某个卷的元信息:docker volume inspect 卷名



容器数据 持久化 实操

类型一:Volume

如果没有显式创建卷,一个卷会在最开始 挂载<VOLUME["/var/lib/mysql"] > 时被创建。当容器停止时,卷仍然存在。多个容器可以通过read-write或read-only的方式使用同一个卷。只有在显式删除时,卷才会被删除。

查看官方mysql Dockerfile 中定义的持久化存储方式:
https://github.com/docker-library/mysql/blob/6952c5d5a9889311157362c528d65dc2e37ff660/5.7/Dockerfile 发现是通过 VOLUME["/var/lib/mysql"] 这样的方式将数据持久化到本地的
意思是指,需要将容器内部/var/lib/mysql 目录下的数据 映射出去
不指定其实是不会将数据映射出来的。
映射出来的位置是在/var/lib/docker/volumes/ ,他会自己在该目录下生成一个volume ID
实际的数据就是保存在其中的。 代码验证上面这段话:
docker volume ls
docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
[root@localhost ~]# docker ps
cef34ac36e63 mysql:5.7 "docker-entrypoint.s…" 16 seconds ago Up 15 seconds 3306/tcp, 33060/tcp mysql1
[root@localhost ~]#
docker exec -it mysql1 bash
mysql -u root
create database test1;
quit
exit
回到本地主机:
docker volume ls
docker volume inspect [volume ID]
详细信息中可以看见挂载点
cd 进去,可以看见实际的数据库文件是真实存在的。
/var/lib/docker/volumes/1b7400bf5cca58f06957e865ab7c072b4cd5961c56d536357fb69575985ecbac/_data
[root@localhost _data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test1
[root@localhost _data]# 其实这个时候你把容器停止,删除容器。数据库的文件还是会在本地保留的
# 强制删除运行中的容器
docker rm -f mysql1
# 删除volume
docker volume rm VOLUME NAME 【升级1】
上面的方式有一个不好的地方就是:由于没有指定映射的对应目录,自动为我们生成了一个很长的Volume ID,
这个其实是不太好管理的。最好的方式是,我们自己指定名称。 具体如下:
通过-v 指定映射
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local mysql
[root@localhost ~]#
发现是我们自己指定的名称mysql 【升级2】
上面的还有一个不好的一点 就是不太方便移植映射出来,
我们如果可以将映射出来的目录指定到 Dockerfile 同一级目录下就更好了,
要想实现这个 可以通过编写 docker-compose.yml 文件,在文件中定义volume

volume这种方式可以很好的将数据持久化的本地文件系统中,【推荐】

类型二:Bind Mounting

将当前目录外部 与 指定的容器内部目录进行绑定 --> 实现数据共享

案例中 实现容器内部 /usr/share/nginx/html 与 本机主机 /root/docker-nginx

两个目录下的文件共享

案例:


[root@localhost ~]# mkdir docker-nginx
[root@localhost ~]# cd docker-nginx/ [root@localhost docker-nginx]# vim Dockerfile
FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY index.html index.html [root@localhost docker-nginx]# docker build -t liuge36docker/my-nginx .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM nginx:latest
---> 2073e0bcb60e
Step 2/3 : WORKDIR /usr/share/nginx/html
---> Running in 8bdefed78445
Removing intermediate container 8bdefed78445
---> 747647be78f1
Step 3/3 : COPY index.html index.html
---> b6a5afe9dcf8
Successfully built b6a5afe9dcf8
Successfully tagged liuge36docker/my-nginx:latest
[root@localhost docker-nginx]# # 创建容器
将当前目录与 指定的容器内部目录进行绑定
[root@localhost docker-nginx]# docker rm -f web
web
[root@localhost docker-nginx]# docker run -d -v $(pwd):/usr/share/nginx/html -p 8777:80 --name web liuge36docker/my-nginx
4822d9626b36c2b539527a9ba8d9cdebfaee19762b02f957559e4f2ae6e2d281 [root@localhost docker-nginx]# docker exec -it web /bin/bash
root@4822d9626b36:/usr/share/nginx/html# ls
Dockerfile index.html
root@4822d9626b36:/usr/share/nginx/html# touch hello.txt
root@4822d9626b36:/usr/share/nginx/html# exit
exit [root@localhost docker-nginx]# ls
Dockerfile hello.txt index.html
[root@localhost docker-nginx]# echo "1111" >> hello.txt
[root@localhost docker-nginx]# docker exec -it web /bin/bash root@4822d9626b36:/usr/share/nginx/html# cat hello.txt
1111
root@4822d9626b36:/usr/share/nginx/html#

后面我可能会根据 SpringBoot 单独写一篇文章 ,看看到底这个代码共享 该怎么去做。

本文比较基础,后面我再写一下关于 容错、 备份、恢复、迁移数据卷 相关的东西。

尽情期待~

有什么问题,欢迎留言讨论~~

更多文章:系统学习Docker 不迷路:https://blog.csdn.net/liuge36/category_7651616.html

Docker 容器数据 持久化(系统学习Docker05)的更多相关文章

  1. Docker自学纪实(三)Docker容器数据持久化

    谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...

  2. 4.云原生之Docker容器数据持久化介绍与实践

    转载自:https://www.bilibili.com/read/cv15182308/?from=readlist #### 创建一个web容器并创建一个数据卷挂载到容器的/webapp目录下(默 ...

  3. docker容器数据持久化

    将数据从宿主机挂载到容器中的三种方式 1.Volume 2.Bind Mounts 3.tmpfs Volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volume ...

  4. Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

  5. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  6. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  7. docker mysql 数据持久化到本地、设置不区别表名大小写-清风柳絮-51CTO博客

    原文:docker mysql 数据持久化到本地.设置不区别表名大小写-清风柳絮-51CTO博客 Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 ...

  8. docker容器的持久化存储:Volume

    独立于docker容器的持久化存储: 法(1):自动将服务器文件夹挂载到容器内部文件夹/usr/share/nginx/html,这样只修改服务器文件夹下的内容即可对应修改容器内部文件夹的内容 将服务 ...

  9. docker容器数据卷的使用

    什么是容器数据卷 docker的理念回顾 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的! 就好比,你安装一个MySQL,结果你把容器删了,就相当于 ...

随机推荐

  1. VC++取MD5算法记录下以后用得到(转)

    这个是网上扒下来的 作者已经无法知道是谁了 MD5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream ...

  2. $CF888G\ Xor-MST$ 最小生成树

    正解:最小生成树 解题报告: 传送门$QwQ$ 发现$Kruskal$和$Prime$都不太可做,于是考虑$B$算法. 先大概港下$B$算法的流程趴$QwQ$.大概就,每次对每个联通块找到最近的联通块 ...

  3. Linux下自动化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)

    1.先配置好Docker阿里云加速,可以使用阿里云容器服务 (可自己在阿里云申请,要不然安装东西直接很慢)注意:https://XXXX.mirror.aliyuncs.com为阿里云加速服务分配地址 ...

  4. redis 为什么是单线程,为什么速度快。

    redis 5中存储方式 String.List.Set.Hash.ZSet这5种 数据库的工作模式按存储方式可分为: 硬盘数据库和内存数据库.Redis 将数据储存在内存里面,读写数据的时候都不会受 ...

  5. Java扫描指定文件路径下的文件并且递归扫描其子目录下的所有文件

    本文主要实现了扫描指定文件路径下的文件,递归扫描其子目录下的所有文件信息,示例文件为: 要求将后缀为.dat的文件夹信息也写入到数据库中,然后将.chk文件解析,将文件中对应的内容读出来写入到数据库, ...

  6. 使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)

    前言 微信群机器人,主要用来管理群聊,提供类似天气查询.点歌.机器人聊天等用途. 由于微信将web端的协议封杀后,很多基于http协议的群聊机器人都失效了,所以这里使用基于PC端协议的插件来实现. 声 ...

  7. echarts设置数据在轴线上显示

    项目中遇到数据需要在右侧显示,如图,直接上代码: 1.需要在哪个轴上显示  就把那个轴写成一个数组 2.分别设置一下定位和数据即可(如下图红色部分) yAxis: [ { type: 'categor ...

  8. Scala实践10

    1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...

  9. 吸取教训:一段网上找的代码突然爆了,项目出现大BUG

    本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算. 这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策 ...

  10. Django admin的常用方法

    一.HTTP 1.主页面 http://127.0.0.1:8000/admin/ 2.查询页面 http://127.0.0.1:8000/admin/app01/book/ 3.增加页面 http ...