写在前面

本来是可以将数据存储在 容器内部 的。但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在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. leetcode.1275找出井字棋的获胜者

    A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上.第一个玩家 A 总是用 "X" 作为棋子, ...

  2. 【题解】Killer Names($O(n\log n)$做法)

    [题解]Killer Names(\(O(n\log n)\)做法) HDU - 6143 感觉好久没做过这种直来直去的组合题,过来水一篇题解.还以为要写一个\(MTT\)或者三模数\(NTT\),想 ...

  3. Win10系统中搭建服务器的方法

    1.我的电脑->找到并点击“控制面板”->点击“程序”->点击“启用或关闭Windows功能”2.按如下图方式选中复选框   服务器批量管理软件 3.点击确定,打开iis管理器(右键 ...

  4. solr学习(一)安装与部署

    经过测试,同步MongoDB数据到Solr的时候,Solr版本为8.4.0会出现连接不上的错误,8.3.0未经测试不知,博主测试好用的一版为8.2.0,但是官网已经下不到了,所以我会把下载链接放在文末 ...

  5. 【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

    系列介绍 简介 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的. ...

  6. 海思dv300cv500交叉编译webrtc

    感谢声网提供的webrtc国内源码镜像. 首先要安装好海思编译工具链和git. 先替换一下webrtc代码的仓库网址路径 git config --global user.email "10 ...

  7. VMware下Hadoop 2.4.1完全分布式集群平台安装与设置

    1 VM下Ubuntu安装和配置 1.1 安装Ubuntu系统  这个就不说了,不知道的可以去看看其他的博文.   1.2 集群配置     搭建一个由3台机器组成的集群: IP user/passw ...

  8. Webpack实战(四):教教你如何轻松搞定-预处理器(loader)

    前面三节,我主要给大家分享了有关webpack的一些配置的知识点,如何打包js文件,而如果我们遇到其他类型的资源如图片.css.字体font等等,我们该如何处理呢?今天会介绍预处理器(loader), ...

  9. Gitlab安装配置管理

    ◆安装Gitlab前系统预配置准备工作1.关闭firewalld防火墙# systemctl stop firewalld# systemctl disable firewalld 2.关闭SELIN ...

  10. 【python系统学习06】一张图看懂列表并学会操作

    点击跳转-原文地址 数据类型 - 列表(list) 「目录:」 一张图了解列表 列表是什么 列表长啥样 语法格式 代码示例 格式特征 列表定义 列表操作 - 提取单个:偏移量 什么是偏移量 偏移量提取 ...