【docker概念和实践 5】(1) 容器数据卷

news2024/11/17 14:16:51

一、说明

        本文的主要内容

  • 什么是数据卷
  • 如何生成数据卷
  • 将数据卷挂在容器上
  • 多容器如何共享数据卷
  • 什么是绑定挂载

二、数据卷概念 

2.1 数据长久保存的要求

        在容器运行时,容器内有一个数据存储空间,但是当容器关闭后,这个存储空间内容将被丢失(图1)。因此,数据无法长期保存!那么,数据如何长期保存需要什么策略?

图1 容器内数据存储地

        

        通过在容器建立虚拟文件路径,此路径指向的物理地址是宿主机的文件系统,此时,当容器突然关闭,而所在宿主机上的文件系统依然无恙。这样就起到数据永久性保护的目的。

 2.2 容器数据卷特征

        数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器 (也就是数据卷可以把数据可以直接映射到容器中)

        数据卷的特性:
                1.数据卷 可以在容器之间共享和重用
                2.对数据卷的修改会立马生效
                3.对数据卷的更新,不会影响镜像
                4.数据卷 默认会一直存在,即使容器被删除

2.3 实验1:初步体验容器数据卷

【1】 简单地执行下列指令

docker run -it --name ubuntu_data -v /home/datatmp:/datatmp  ubuntu20.04 bash

   注意:

        1)上述指令的-v参数指的是:在宿主机下的目录/home/datatmp和容器的/datatmp目录是映射关系,也就是互相备份数据。

        2)上述宿主机目录 /home/datatmp以及容器目录/datatmp不需要预先建立,如无,run指令会自动建立,非常方便。

【2】 在宿主机建立文件:

        进入宿主机目录cd /home/datatmp ,然后建立一个文件host.txt:

cd /home/datatmp 
tounch host.txt

       进入容器:

   docker exec -it  ubuntu_data bash
   cd datatmp
   ls 

        发现有host.txt的存在.

        反之,在容器的/datatmp上建立文件cont.txt,回到主机的/home/datatmp也能看到cont.txt的存在。

2.4 容器数据卷的种类

第一种,直接挂载

        这种直接用-v实现的挂载上面已经实现。

docker run  -v  /home/mount/data:/var/lib/mysql/data

 第二种  匿名(默认路径)挂载

        这种挂载指明了容器内的路径,而是物理机的地址,是指docker-engine的管辖目录:/var/lib/docker/volumes/random-hash/_data下

 第三种  命名(默认路径)挂载

        这是最常见的容器卷管理。这种挂载是将卷命名后挂载,通过这种命名,可以允许多个容器挂载到一个挂载点上,实现数据共享。

  

2.5 数据卷容器的好处

        卷是持久化 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载取决于主机的目录结构和操作系统,但卷完全由 Docker 管理。与绑定挂载相比,卷有几个优点:

  • 卷比绑定挂载更容易备份或迁移。
  • 您可以使用 Docker CLI 命令或 Docker API 管理卷。
  • 卷适用于 Linux 和 Windows 容器。
  • 卷可以更安全地在多个容器之间共享。
  • 卷驱动程序允许您将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能。
  • 新卷的内容可以由容器预先填充。
  • Docker Desktop 上的卷比 Mac 和 Windows 主机上的绑定挂载具有更高的性能。
  • 此外,与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外。

三、Docker搭建MySQL并挂载数据

3.1 多路径挂载mysql

1、首先安装好 Docker,怎么安装?参看:【Docker概念和实践 2】虚拟机 ubuntu18上安装docker  。

2、下载 MySQL5.7 镜像。

docker pull mysql:5.7

3、创建容器并挂载数据。

docker run -d --restart=always --name mysql \
-v /itwxe/dockerData/mysql/data:/var/lib/mysql \
-v /itwxe/dockerData/mysql/conf:/etc/mysql \
-v /itwxe/dockerData/mysql/log:/var/log/mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci

参数说明:

-v /itwxe/dockerData/mysql/data:/var/lib/mysql:将数据文件夹挂载到主机
-v /itwxe/dockerData/mysql/conf:/etc/mysql:将配置文件夹挂在到主机,可以在宿主机放一份自定义 my.cnf文件,那么容器就会按自定义配置启动
-v /itwxe/dockerData/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
-p 3306:3306:将容器的3306端口映射到主机的3306端口
-e MYSQL_ROOT_PASSWORD=123456:初始化123456用户的密码
--character-set-server=utf8mb4:设置字符集
--collation-server=utf8mb4_general_ci:排序方式

4、进入 MySQL 容器内部。

docker exec -it mysql /bin/bash

5、登录 MySQL。

mysql -uroot -p123456

6、查看字符集是否生效。

show variables like 'character_set_%';

3.2 挂载是否生效

1、上传备份 sql 到宿主机,复制宿主机备份 sql 到容器。

sudo touch  /itwxe/dockerData/sunny.sql

docker cp /itwxe/dockerData/sunny.sql mysql:/

2、进入 mysql 容器内部,导入sql。

docker exec -it mysql /bin/bash

mysql -uroot -p123456

create database sunny;
use sunny;
source /sunny.sql;

3、数据导入成功可以查询后,删除容器,并重新用命令创建容器,查看数据存在。

docker stop mysql && docker rm mysql

        使用上面的命令重新创建容器,查看数据是否正常,可以看到数据正常挂载查询,此处演示的数据正常挂载保存宿主机。

四、通过-mount挂载的数据卷

4.1 多路径挂载mysql

1)删除容器,准备重新生成

        同样是挂载mysql数据库,我们将上面所生成的容器全部删除。

docker rm -f mysql

2)生成三个容器卷名称

docker volume create  mysql_data & 
docker volume create mysql_conf &
docker volume create mysql_log

3) 生成容器

docker run -d --restart=always --name mysql \
 --mount type=volume,source=mysql_data,destination=/var/lib/mysql \
 --mount type=volume,source=mysql_conf,destination=/etc/mysql \
 --mount type=volume,source=mysql_log,destination=/var/log/mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci

 docker inspect mysql

 以上说明,在定义容器卷后,同样可以挂载。

 4.2 选择 -v 或 --mount 标志

        -v就是卷的意思,类似的标记有--mount,两者有少许区别。

1)最主要区别:

  •  -mount可以支持创建集群服务的数据卷,而-v不行。

       

  • 通常,--mount 更明确和冗长。最大的区别是 -v 语法将所有选项组合在一个字段中,而 --mount 语法将它们分开。这是每个标志的语法比较。
  • 如果需要指定卷驱动程序选项,则必须使用 --mount。

2)-v( --volume)的要点

        由三个字段组成,以冒号字符 (:) 分隔。字段的顺序必须正确,每个字段的含义不是很明显。

  • 在命名卷的情况下,第一个字段是卷的名称,并且在给定的主机上是唯一的。对于匿名卷,省略第一个字段。
  • 第二个字段是文件或目录在容器中的挂载路径。
  • 第三个字段是可选的,并且是以逗号分隔的选项列表,例如 ro。这些选项将在下面讨论。

3)--mount要点

        由多个键值对组成,以逗号分隔,每个键值对由一个 <key>=<value> 元组组成。 --mount 语法比 -v 或 --volume 更冗长,但键的顺序并不重要,标志的值更容易理解。

  • 挂载类型,可以是 bind、volume 或 tmpfs。本主题讨论卷,因此类型始终是卷。
  • mount的来源。对于命名卷,这是卷的名称。对于匿名卷,省略此字段。可以指定为 source 或 src。
  • destination 将文件或目录挂载在容器中的路径作为其值。可以指定为目的地、dst 或目标。
  • readonly 选项(如果存在)会使绑定挂载以只读方式挂载到容器中。可以指定为只读或 ro。
  • 可以多次指定的 volume-opt 选项采用由选项名称及其值组成的键值对。
docker service create \
    --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

五、数据卷管理操作

        与绑定挂载不同,您可以在任何容器范围之外创建和管理卷。(这里“绑定挂载”就是run中用-v的语句)。

1.新建数据卷容器

docker volume create my-vol

2 查看卷(当前引擎下)

docker volume ls

3 查看容器内部 

docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

 4 删除卷

docker volume rm my-vol

六、后记

        数据规模越大、数据多样性更大,越要使用容器数据卷。尤其在compose、machine 和 swarm三大应用场合下,数据卷应用将更加频繁。

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

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

相关文章

PYTHON官方教程:Python3.11中文版文档

Python 每年都会发布新版本&#xff0c;上半年是功能锁定的测试版&#xff0c;年底是最终版本。 Python 3.11 的特性集刚刚定稿&#xff0c;测试版本已经发布&#xff0c;开发人员在非生产代码上可以尝试使用这个最新版本&#xff0c;验证它能否在你的程序中工作&#xff0c;并…

小白入门pwn笔记--elf文件概述

笔记是根据哔哩哔哩视频所写2、ELF文件概述_哔哩哔哩_bilibili第一集看过大概&#xff0c;很久之前安装过一些工具&#xff0c;所以直接从第二集开始看&#xff0c;遇到没有安装的工具再安装。从今天开始入坑pwn0.pwn的简单介绍exploit&#xff1a;用于攻击的脚本与方案。paylo…

一、代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

数组基础理论数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的。数组内存空间的地址是连续的正是因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。数组的元素是不能删的&…

关于CADC数据集的处理笔记

简要介绍 数据集 Canadian Adverse Driving Conditions Dataset&#xff08;CADC&#xff09;是全球首个针对寒冷环境的自动驾驶数据集&#xff0c;其内包含&#xff1a; 56,000 张相机图像&#xff1b;7,000 次 LiDAR 扫描&#xff1b;75 个场景&#xff0c;每个场景 50-100…

Vue中作用域插槽solt详解

作用域插槽插槽可以实现父子组件通信(通信的结构)默认插槽具名插槽作用域插槽:子组件的数据来源于父组件,子组件是决定不了自身结构与外观的直接上代码&#xff01;&#xff01;父组件&#xff1a;<template><div><h2>效果一: 显示TODO列表时, 已完成的TODO为…

蓝桥杯STM32G431RBT6学习——M24C02

蓝桥杯STM32G431RBT6学习——M24C02 前言 IIC是单片机的通用协议&#xff0c;在蓝桥杯单片机、嵌入式中都是考点。国信长天开发板板载M24C02&#xff08;IIC驱动&#xff09;作为调电存储模块&#xff0c;可以通过IIC对其写入数据后&#xff0c;掉电进行保存以供读取。其硬件…

Linux(centos7)基本操作---进程管理

进程管理进程管理&#xff08;process&#xff09;相关的名词解释静态进程查看动态进程查看进程控制作业管理&#xff08;jobs&#xff09;文件虚拟系统&#xff08;proc&#xff09;进程管理&#xff08;process&#xff09; 相关的名词解释 PID&#xff1a;进程的身份证号,…

对象之间的拷贝与转换

这里写目录标题Lambda 的 builderidea 自动生成插件 GenerateAllSetterMapStructDozer在开发的时候经常会有业务代码之间有很多的 JavaBean 之间的相互转化&#xff0c;比如 PO/DTO/VO/QueryParam 之间的转换问题&#xff0c;本文总结一下各种转换方法Lambda 的 builder 使用构…

【Qt】11.Linux下,Qt程序打包

目录 获取Release模式下的可执行文件 打包的目录结构搭建 安装linuxdeployqt 环境准备 下载linuxdeployqt 编译安装 复制快捷方式 配置环境变量 使生效 查看版本 安装unixODBC库 解压 配置 编译安装 重启系统 打包 原因 解决方法 打成deb包 打deb包目录构建…

Python虚拟环境大总结(virtualenv pipenv)

文章目录1 virtualenv1.1 安装1.2 测试安装是否成功1.3 主要命令1.4 virtualenvwrapper1.4.1 创建虚拟环境1.4.2 列举所有虚拟环境1.4.3 激活虚拟环境1.4.4 取消激活虚拟环境1.4.5 删除虚拟环境1.4.6 创建指定版本的虚拟环境2 pipenv2.1 安装2.2 创建虚拟环境2.3 进入虚拟环境2…

游戏之外,元宇宙也在寻求与更多领域进行融合

在大众对元宇宙的构想中&#xff0c;“游戏”是优先级最高的落地场景之一。《头号玩家》、《赛博朋克2077》等作品中&#xff0c;“游戏”也多次成为元宇宙的主要载体&#xff0c;描画出人们对于这一前沿风口的想象。 2022年以来&#xff0c;监管侧陆续传来元宇宙产业发展的利…

python算法加密 pyarmor与docker

如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多支持呀&#xff01;关注、点赞、收藏、评论。 目录一、 基本语法 加密 Python 脚本二、运行加密脚本三、pyarmor&docker3.1 Dockerfile3.2 requirements.txt3.3 加密函数lock_by_pyarmor.py3.4 主函数myp…

元宵节营销活动策划,轻松拿下用户

热闹的春节刚过&#xff0c;又将迎来团圆美满的元宵节&#x1f3ee;。我们今天就来讲讲&#xff0c;关于节日营销的小巧思&#xff01; 【产品游戏】 在每一个关于节日的营销里&#xff0c;将游戏作为切入点与产品相结合&#xff0c;往往可以获得意想不到的效果。对于场景单一…

DynaSLAM-6 DynaSLAM论文解读

目录 1.论文摘要解读 1.1 原论文内容 1.2 个人理解 2.论文discusses related work部分 2.1 原论文内容 3.论文SYSTEM DESCRIPTION部分 3.1 使用Mask R-CNN对潜在的动态内容进行分割 3.2 低成本追踪 3.3 使用Mask R-CNN和多视角几何对动态内容进行分割 3.4 跟踪线程…

分享会上狂吹MySQL的4大索引结构红黑树、二叉树B+Tree,没想到~~~~

索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足 特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些数据结构 上实现高…

品优购网页制作

目录 favicon图标 TDK三大标签SEO优化 title网站标题 description网站说明 keywords关键字 首页制作 快捷导航模块 左浮动 右浮动 header头部模块制作 1.logo模块 2.search模块 3.热词模块 4.购物车模块 子绝父绝 nav导航模块 1.nav左边导航位置 2.上方导航位置 …

PCB覆铜很“上头”?一文帮你搞定实操要点和规范

1、覆铜覆盖焊盘时&#xff0c;要完全覆盖&#xff0c;shape 和焊盘不能形成锐角的夹角。2、尽量用覆铜替代粗线。当使用粗线时&#xff0c;过孔通常为非通常走线过孔&#xff0c;增大过孔的孔径和焊盘。修改后&#xff1a;3、尽量用覆铜替换覆铜走线的模式&#xff0c;后者常常…

11.深度优先搜索

一、算法内容 1.简介 深度优先搜索DFS&#xff08;Depth First Search&#xff09;按照深度优先的方式进行搜索&#xff0c;可以理解为“一条路走到黑”地穷举所有可行的方案&#xff0c;并不断尝试&#xff0c;直到找到一种情况满足问题问题的要求。那么这个方案就是一个问题…

shell 循环学习练习

目录 一&#xff0c;嵌套循环实现9*9乘法表 二&#xff0c;判定一个成绩&#xff1a; 三&#xff0c;循环创建用户&#xff1a;用户名为user01-user20 一&#xff0c;嵌套循环实现9*9乘法表 (for和while都可以) 选做&#xff1a;格式对齐&#xff0c;以及使用单层循环完成9*9乘…

精细管理——CRM销售漏斗管理

CRM销售漏斗涵盖了从接触客户到谈判、成单、回款的整个销售过程。一个典型的销售漏斗是由一个特定时间段里&#xff0c;例如一年或者一个季度或者一个月这个时间范畴之内&#xff0c;一系列有可能转化成订单的潜在销售机会所组成。在CRM客户管理系统中&#xff0c;销售漏斗管理…