Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)

为什么要做数据持久化?


 当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。


Docker数据持久化方案:


  • 基于本机文件系统的Volume。可以执行Docker createDocker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

  • 基于plugin的Volume,支持第三方的存储方案,比如NAS,AWS。

基于本机文件系统的Volume:


  • Data Volume:挂载数据卷

  • Bind Mouting: 挂载本地目录

数据持久化之Data Volume:


1.下载mysql镜像

[root@localhost ~]# docker search mysql      //搜索mysql镜像
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9468                [OK]            
[root@localhost ~]# docker pull mysql      //下载mysql镜像
...
bcc6c6145912: Pull complete
951c3d959c9d: Extracting [===============================================>   ]  3.998MB/4.178MB
[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
mysql                           latest                   a7a67c95e831        10 days ago         541MB

2.启动mysql1容器并查看容器内与容器外的volume对象


-i:以交互模式运行容器,通常与 -t 同时使用


-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用


-d:后台运行


--name 容器名: 为容器指定一个名称


-e:操作mysql的内部命令


   --MYSQL_ALLOW_EMPTY_PASSWORD=true:代表密码设置为空

[root@localhost ~]# docker run -itd --name mysql1 -e MYSQL_ROOT_PASSWORD=123 mysql:latest
109d0290ccbfe0d6d335b0e9842c770f21123b3ba42587bb8b389765c2be063c
     //指定容器名称为mysql1,-e设置mysql1容器数据库密码为123
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               8931d175e3b22ea7d963d76b1ea2ee9347b546ddfb86ab17940fac44466acd03
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
109d0290ccbf        mysql:latest        "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       3306/tcp, 33060/tcp   mysql1

 可以看到如果不指定-v参数就直接启动mysql1容器,那么默认产生的volume对象就是一串ID。


3.删除mysql1容器,查看volume对象是否被删除

[root@localhost ~]# docker stop mysql1
mysql1
[root@localhost ~]# docker rm mysql1
mysql1
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               8931d175e3b22ea7d963d76b1ea2ee9347b546ddfb86ab17940fac44466acd03

 可以看到在删除mysql1容器后,这个volume对象并没有随着容器的删除而丢失。


4.删除之前mysql1容器默认生成的volume对象

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               8931d175e3b22ea7d963d76b1ea2ee9347b546ddfb86ab17940fac44466acd03
[root@localhost ~]# docker volume rm 8931d175e3b22ea7d963d76b1ea2ee9347b546ddfb86ab17940fac44466acd03
8931d175e3b22ea7d963d76b1ea2ee9347b546ddfb86ab17940fac44466acd03

5.启动mysql2容器并指定volume对象名称(挂载目录)


-v:挂载宿主机的一个目录/数据卷(宿主机目录如果不存在,则会自动创建)


   用法:-v 宿主机目录/数据卷:容器内目录(容器目录必须为绝对路径)


docker volume管理命令:


docker volume create 数据卷:--> 创建volume


docker inspect 数据卷:--> 查看数据卷信息


docker run -itd -v 数据卷:容器内目录:--> 使用某个数据卷


docker volume ls:--> 列出所有数据卷


docker volume rm 数据卷:--> 删除某个数据卷

[root@localhost ~]# docker run -itd --name mysql2 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
1d90619790ecb9ff9bd63524048fef777a39b8cb14652eade5b1551e30bd4964
        //数据卷mysql若不存在,则会自己创建
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               mysql
[root@localhost ~]# docker volume inspect mysql
[
    {
        "CreatedAt": "2020-05-09T03:01:17+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql/_data",
        "Name": "mysql",
        "Options": null,
        "Scope": "local"
    }
]

 因为我们挂载时没有指定mysql目录绝对路径,用volume inspect可以查看volume挂载的信息,若挂载宿主机目录时不使用绝对路径,则默认挂载在/var/lib/docker/volumes/目录下,也可以指定路径(如:-v /mnt/mysql:/var/lib/mysql)


验证Data Volume持久化:


1.进入mysql2容器创建test库并删除容器mysql2

[root@localhost ~]# docker exec -it mysql2 /bin/bash
root@1d90619790ec:/# mysql -uroot -p123
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.68 sec)
mysql> create database test;    //创建test库
Query OK, 1 row affected (0.24 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.01 sec)
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1d90619790ec        mysql               "docker-entrypoint.s…"   3 hours ago         Up 3 hours          3306/tcp, 33060/tcp   mysql2
[root@localhost ~]# docker rm -f mysql2    //强制删除mysql2容器
mysql2

2.新启动mysql3容器,并使用-v参数挂载之前的mysql数据卷

[root@localhost ~]# docker run -itd --name mysql3 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
96a5f81cd671f57cb52df89ae5ae130207aec454f4f55d4746b00a8655ed5113
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
96a5f81cd671        mysql               "docker-entrypoint.s…"   27 seconds ago      Up 16 seconds       3306/tcp, 33060/tcp   mysql3
[root@localhost ~]# docker exec -it mysql3 /bin/bash

3.进入mysql3容器,查看mysql数据卷中的数据是否还在

[root@localhost ~]# docker exec -it mysql3 /bin/bash
root@96a5f81cd671:/# mysql -uroot -p123
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |     ---》test库依然存在
+--------------------+
5 rows in set (0.01 sec)

Data Volume 数据共享:


 数据卷可以被挂载到多个容器中,这时候数据卷中的数据被共享。


 如果要共享数据卷,需要使用--volumes-from参数。


1.进入mysql3容器,查看mysql数据卷数据

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
96a5f81cd671        mysql               "docker-entrypoint.s…"   2 days ago          Up 7 seconds        3306/tcp, 33060/tcp   mysql3
[root@localhost ~]# docker exec -it mysql3 /bin/bash
root@96a5f81cd671:/# mysql -uroot -p123
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |        -----》之前创建的test库
+--------------------+
5 rows in set (0.01 sec)

2.新启动mysql4容器,共享mysql数据卷


注意:


  在启动mysql4容器之前,需要先停止mysql3数据库容器,经测试不能同时开启做数据共享(使用同一个数据卷)的两个mysql容器。

[root@localhost ~]# docker stop mysql3      //停止mysql3容器
mysql3
[root@localhost ~]# docker run -itd --name mysql4 --volumes-from mysql3 -e MYSQL_ROOT_PASSWORD=123 mysql
7632976b82d40de79ed0c165d0f7d0757fd4e1088fb638ed405c0a67c9656cf1
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
7632976b82d4        mysql               "docker-entrypoint.s…"   38 seconds ago      Up 37 seconds       3306/tcp, 33060/tcp   mysql4

3.进入mysql4容器,查看数据库中共享数据卷mysql后的数据

[root@localhost ~]# docker exec -it mysql4 /bin/bash
root@7632976b82d4:/# mysql -uroot -p123
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |    ---》可以看到mysql数据卷中的数据的确存在
+--------------------+
5 rows in set (0.01 sec)
相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
613 5
|
8月前
|
存储 安全 数据建模
Docker数据卷深入解析与操作技巧
通过巧妙使用Docker数据卷,我们就能实现数据的灵活管理和无缝迁移,享受容器化的便捷,同时确保数据的安全与高效共享。
157 6
|
9月前
|
关系型数据库 MySQL Docker
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
14240 38
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
295 27
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用。掌握这些Docker基础概念和操作,可以显著提高开发和部署效率,确保应用程序的可移植性和可扩展性。
263 22
|
存储 Ubuntu 关系型数据库
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
226 13
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
999 108