18-数据持久化-Data Volume

Data Volume 使用场景。一般来讲有些容器自己会产生一些数据,我们不想数据随着容器的销毁而销毁,我们想保存数据,正常一般用在数据库,比如我们想保存数据库中的数据,这个时候我们就会使用 Data Volume

创建数据库容器

我们通过创建一个 mysql 的数据库来看看如何数据持久化。

我们先查看一下 mysql 的安装方式,通过 docker hub 来查找。

我们点击 5.7.25, 5.7, 5 (5.7/Dockerfile) 这一条查看它的Dockerfile

...
VOLUME /var/lib/mysql
...

我们可以看到上面这一句,含义就是创建容器的时候就会产生一个 /var/lib/mysqlData Volume

例子1:

  1. 创建一个无密码的mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
    

    正常mysql数据库是需要账户和密码的,为了方便我们不使用密码。

  2. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    

    可以看到本地产生了一个 Data Volume,这就是 mysql的创建的过程中会去创建一个 Volume,也就是之前在它的Dockerfile中看到的那一段。

  3. 查看指定volume的详细信息

    [vagrant@10 ~]$ docker volume inspect 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    [{"CreatedAt": "2019-02-14T01:32:54Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083/_data","Name": "1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083","Options": null,"Scope": "local"}
    ]
    

    我们发现这个volume是mount到本地的 /var/lib/docker/volumes/下。

  4. 再次创建一个mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
    
  5. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    local               4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    

    又产生了一个新的volume。

  6. 查看新产生的volume的详细信息

    [vagrant@10 ~]$ docker volume inspect 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    [{"CreatedAt": "2019-02-14T01:37:02Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8/_data","Name": "4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8","Options": null,"Scope": "local"}
    ]
    

    如果我们删除volume对应的mysql容器,这个volume是不会自动删除的,我们实验一下。

    删除mysql2

    docker stop mysql2 && docker rm mysql2
    

    查看本地volume情况

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    local               4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    

    我们发现这个volume是没有跟着删除的,达到了数据持久化的目的,解决了数据丢失。

  7. volume设置别名

    我们可以发现volume的名字有点太长了,并且不友好。

    那我们可以给volume设定一个别名,这样更方便我们识别volume。

    删除我们之前创建的所有mysql容器和数据卷volume。

    docker stop mysql1 && docker rm mysql1
    docker volume rm 1f40fd
    

    查看数据卷是否全部删除

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    

    重新创建一个mysql容器

    docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
    

    查看本地的volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               mysql
    
  8. 验证是否数据的生成的数据同步到这个mysql数据卷内

    进入mysql容器

    docker exec -it mysql1 /bin/bash
    

    进入mysql数据库命令行

    mysql -u root
    

    显示当前数据库的databases

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.03 sec)
    

    创建一个新的docker databases

    mysql> create database docker;
    Query OK, 1 row affected (0.01 sec)
    

    查看mysql当前的databases

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | docker             |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    

    退出mysql和容器

    exit
    exit
    

    删除mysql1容器

    docker stop mysql1 && docker rm mysql1
    

    查看volume是否还在

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               mysql
    

    我们发现是还在的。那我们后面再重新创建一个mysql并使用这个volume,是不是刚刚创建的docker databease还会存在呢?答案是的。

    再次创建一个mysql2容器,并还是使用刚刚的mysql数据卷

    docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
    

    进入mysql容器并查看databases

    docker exec -it mysql2 /bin/bash
    
    root@b0614271afc6:/# mysql -u root
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | docker             |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    

    我们发现docker database还在。

总结

在以后的工作中,如果你使用docker,那么你可能会经常使用volume,它可以帮助我们保护数据而不随着容器的销毁而销毁。

docker的数据持久化也比较简单,在容器的Dockerfile中添加 VOLUME 字段,那么容器在创建的时候会映射到docker的volume上并生成一个名字,但是这个名字很难记,是一堆字符串。那么我们可以通过 -v参数来修改这个volume的名字,让我们可以更好的识别它。

18-数据持久化-Data Volume相关推荐

  1. 三剑客”之Swarm应用数据持久化管理(volume 、bind 、 nfs)

    1.前言  在上一篇文章 <"三剑客"之Swarm集群架构.集群管理 .服务管理>中,大家已了解swarm集群管理以及如何管理swarm集群中的服务.试想一下,如果sw ...

  2. @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)

    文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...

  3. docker mysql data volume_Docker 持久化存储, Data Volume/Bind Mounting

    docker容器, 再启动之后 我们可以对其进行 修改删除等等. 如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失.  就需要持久化数据存储. Data Volume 这是 do ...

  4. 从零开始学习docker(九)持久化存储和数据共享之 Data Volume

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 有些时候容器会产生一些数据,而我们不希望这些数据随着容器的删除而删除.想保证数据的安全,一般用在数据库. 首先看 ...

  5. docker学习笔记(四)docker数据持久化volume

    docker数据持久化 官网:https://docs.docker.com/storage/volumes/ docker中的容器是可以随时销毁的,容器中的数据会随着容器的消亡而消亡.然而很多容器都 ...

  6. Named Volume 在 MySQL 数据持久化上的基本应用

    原文作者:春哥 非常感谢春哥的投稿,同时也有一些感慨. 初识春哥时,春哥是美术设计大咖.后不久,创业并致力于游戏开发,已有3年.从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术 ...

  7. 【Docker系列 Swarm】 swarm volume 数据持久化

    Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...

  8. iOS 数据持久化 -- Core Data (2)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...

  9. Android数据持久化:SharePreference

    SharePreference:作为Android数据持久化的一种,具有一定的便捷性,适合存储一些体积小的数据. 存储数据方式:键值对的方式,类似于Map: 利用SharePreference.Edi ...

最新文章

  1. R语言四格表的统计分析及假设检验
  2. JavaWeb学习笔记①——Java向下转型在JavaEE中运用——登陆验证
  3. 用私有构造器或者枚举类型强化Singleton 属性
  4. muy bien_配置Java EE应用程序或“将Bien付诸实践”
  5. python 使用requests模块进行 视频文件的下载
  6. [Linux] undefined reference to `itoa'
  7. Linux调优(文件系统)
  8. 智慧城市建设亟待突破大数据瓶颈
  9. 改变变压器联接方式可消除某些特定次数的谐波_电工牛人10年经验,总结的4电工常用接线方法41例,电机、变压器、接触器..都有...
  10. (转)教你记住ASP.NET WebForm页面的生命周期
  11. Css盒模型有哪几部分,标准盒模型和IE盒模型有哪些区别
  12. 【悟空云课堂】第四十三期:空指针解引用CWE-476: NULL Pointer Dereference
  13. 苹果手机电池健康怎么看_打开手机这个功能,就能知道手机电池的健康度,安卓苹果都可以!...
  14. 不用群发,就可以查看你被哪些微信好友删除了
  15. yum 无法安装gcc 出现Run “yum repolist all” to see the repos you have异常
  16. seo是什么,干什么用,有什么作用(二)
  17. 防疫主题的微信公众号图文排版有哪些技巧?
  18. 汉字转16进制 php,PHP实现中文汉字与16进制编码转换
  19. 关于对技术群中群友积极参与问答的一点看法
  20. 地理信息可视化——Python之matplotlib Basemap简介

热门文章

  1. 计算机知识产权 教学目标,计算机教学设计模板
  2. com.android.tools.build:gradle:2.3.3,关于com.android.tools.build:gradle:3.4.2的构建问题
  3. Python 线程障碍对象 Barrier - Python零基础入门教程
  4. mysql查看服务器版本sql_云服务器Windows系统查看mysql版本
  5. linux maven自动构建,Centos7.3+Jenkins+Git+Maven 自动化构建部署项目
  6. vim中自动添加文件的作者、时间信息、版本等
  7. 单片机c语言 外部中断,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
  8. java 1的阶乘之和_1-20的阶乘之和(java)
  9. idea测试连接mysql报错08001_IDEA连接MySQL(版本8)数据库失败的解决方法(报错08001)...
  10. cmd c语言 图形,CMD-C彩图隐写方案