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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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)
相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
5天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
52 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
15天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
21天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
108 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
5天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
43 10
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
236 77
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
27天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
50 3
实战~如何组织一个多容器项目docker-compose
|
1月前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
123 3
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
78 14
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
142 7