18-数据持久化-Data Volume

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的名字,让我们可以更好的识别它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19-数据持久化-Bind Mounting

19-数据持久化-Bind Mounting Bind Mounting 与 Data Volume区别 Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。 Bind Mounting 则不需要在 Dockerfile 声明 volume,只需要在创建容器的时候,也就是 run 的时候声明即可。 如: dock…

go自定义包教程

go自定义包教程 而是环境为 go version go1.11 linux/amd64linux mint 19 创建一个自定义的包 切换到src目录下,创建demo目录 cd src mkdir demo再创建smap 文件夹 cd demo mkdir smap创建包文件 cd smap touch map.gomap.go文件内容 package smapimport "…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此,我需要执行以下操作: 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先,在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript编译压缩

javascript编译 js是JavaScript 源码文件, .min.js是压缩版的js文件。 .min.js文件经过压缩,相对编译前的js文件体积较小,传输效率快。经过编码将变量和函数原命名改为毫无意义的命名,以防止他人窥视和窃取 js 源代码 在线版 g…

vscode设置中文

vscode设置中文 当我们安装完成vscode后,会发现它是中文的,因为默认情况下,vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的,不是看不懂,而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库,all的话就是全部编译,只想…

C++通过原子变量代替互斥量

C通过原子变量代替互斥量 废话不多说&#xff0c;直接上代码。 实现类似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安装配置

conky安装配置 安装conky sudo apt-get install conky-all修改配置 在主目录下创建’.conkyrc’ 文件内容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系统安装图形界面

Windows子系统安装图形界面 有很多同学需要使用 linux 系统,但是又不想真正安装一个 linux 系统。于是微软大哥就把 ubuntu 系统集成到 windows 内了&#xff0c;你说 微软 屌不屌&#xff1f; 言归正传。 安装Xlaunch 因为这个是最靠谱的图形化界面了&#xff0c;所以不解…

C++ 判断类是否有某变量

C 判断类是否有某变量 话不多说上代码。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++将地址转换为字符串

C将地址转换为字符串 有时候在做程序设计的时候&#xff0c;有可能需要做一个类似messageBus的功能&#xff0c;并且需要一个key保证唯一&#xff0c;那么如何实现这个key的唯一呢&#xff1f;大致两种思路: 使用函数签名&#xff0c;因为messagebus绑定的是一个函数&#xf…

Angular 8之升级和新功能摘要

Angular 8之升级和新功能摘要 Angular 8已经到来,并带来了大量的工作流程和性能改进。就像我们之前发布的几个版本一样,让我们回顾一下Angular 8的新功能,以及如何将Angular 7应用程序升级到Angular 8。 Angular 8中明显的新功能数量有限,但确实还有一些好东西: Differen…

Linux下查看显卡PCIE速率x16x8x4及设定

Linux下查看显卡PCIE速率x16x8x4 由于linux软件并不是很齐全所以查看显卡占用PCIE的带宽并不直观&#xff0c;所以本文介绍如何查看。 Windows下使用GPU-Z即可查看 Linux 确定当前显卡型号 lspci | grep NVIDIA返回 02:00.0 3D controller: NVIDIA Corporation GM107M [GeFor…

Deepin安装最新显卡RTX2080Ti及CUDA10.1

Deepin安装最新显卡RTX2080Ti及CUDA10.1 废话不多说直接上教程。 本系统为Deepin 15.10.2&#xff0c;是基于debian 9发布的&#xff0c;不排除后续deepin升级为debian 10&#xff0c;就目前来看是和ubuntu 16.04一样&#xff0c;使用的是debian 9&#xff0c;所以下载安装包等…

Anaconda安装Tensorflow环境

Anaconda安装Tensorflow环境 Anaconda安装 下载安装包&#xff0c;请到这个地址下载 安装 打开终端执行&#xff1a; bash Anaconda3-5.3.1-Linux-x86_64.sh安装过程全部yes即可。 然后重新启动。 验证是否安装成功 conda --version如果没有报错&#xff0c;并且输出下面内容…

Windows下Qt Creator设置IDE菜单字体样式

Windows下Qt Creator设置IDE菜单字体样式 本文为解决以下问题&#xff1a; IDE的菜单字体太小IDE的菜单字体样式&#xff0c;可以更换为微软雅黑 创建样式文件 在Qt Creator目录下C:\Qt\Qt5.12.2创建 custom-style.css 文件&#xff0c;内容如下&#xff1a; QWidget { fo…

Clonezilla再生龙备份与还原linux系统

文章目录Clonezilla再生龙备份与还原linux系统简介功能与要求一、制作再生龙启动盘1.下载镜像2.制作启动盘二、系统分区三、备份系统四、还原系统注意事项Clonezilla再生龙备份与还原linux系统 简介 再生龙&#xff08;Clonezilla&#xff09;是一个免费的灾难恢复、硬盘克隆…

ubuntu Qt Creator不能输入中文

ubuntu Qt Creator不能输入中文 解决方式为下面的脚本&#xff0c;如果你的Qt是安装在根目录下&#xff0c;那么需要加sudo&#xff0c;如果不是&#xff0c;直接运行即可 sudo bash ChineseInputForQt-v1.1.sh# 或者bash ChineseInputForQt-v1.1.sh脚本内容为&#xff1a; …

修改gitlab数据卷的位置

修改gitlab数据卷的位置 在使用docker安装gitlab的时候&#xff0c;一开始没有考虑其他事情&#xff0c;直接在本地创建了一个数据卷就挂载到容器上了&#xff0c;导致后续数据越来越多&#xff0c;想将数据放到其他盘&#xff0c;大致可以这样操作。 1.停止容器 docker sto…