Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
一、前言
记录时间 [2024-4-11]
系列文章简摘:
Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)
Docker 学习笔记(三):Centos7 中 Docker 使用,镜像、容器,以及操作等常用命令小结
Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer
更多 Docker 相关文章请参考上面专栏哦,入门篇 1~5 已完结,接下来是精髓篇:容器数据卷、Dockerfile、Docker 网络。
学习工具包:
- Docker 学习视频
- Docker 官方文档
- Docker 远程仓库
- Linux 云服务器/虚拟机
- FinalShell 远程连接工具
文章内容速览:
本文主要介绍容器数据卷技术,介绍数据卷的两种挂载方式,体验匿名挂载与具名挂载的区别之处,不仅实现了容器与宿主机的数据同步,还实现了多个容器之间的数据同步,具体有:
- 数据卷的两种挂载方式:1. 使用
-v
命令来挂载;2. 使用Dockerfile
构建。 - 如何区分:具名挂载 / 匿名挂载 / 指定路径挂载?
- 数据卷容器(父容器)介绍;
- 容器数据卷实战:MySQL 的安装和数据同步。
关于数据卷技术的小结论:
-
数据卷技术并不是简单的共享,而是拷贝。
-
容器 – 容器:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
-
容器 – 宿主机:一旦数据持久化到了本地,本地的数据是不会删除的。
二、容器数据卷技术介绍
在之前的 Docker 学习中,我们了解到:
- Docker 将应用和环境打包成一个镜像
- Docker 在容器中运行镜像
- Docker 容器之间是互相隔离的
由此引发一个问题:如果容器被删除了,容器中的数据会随之一起丢失怎么办?
数据卷技术恰能解决此问题,实现数据持久化。
通过将容器内的目录挂载到 Linux 上,实现 Docker 容器中产生的数据同步到本地;通过将容器挂载到父容器,实现容器之间的数据共享。
以后修改容器内的配置文件在本地就可以完成,不需要特地进入容器了。
三、命令挂载 / Dockerfile 挂载
数据卷的两种挂载方式:1. 使用
-v
命令来挂载;2. 使用Dockerfile
构建。Dockerfile 方式使用较多,因为经常需要自己构建镜像;若构建镜像时没有挂载卷,则需要手动命令挂载。
1. 使用命令挂载
操作步骤
docker run -it -v 主机目录:容器内目录
测试一下,将 centos
容器的 /home
目录挂载到宿主机的 /home/ceshi
目录
docker run -it -v /home/ceshi:/home centos /bin/bash
启动后通过 inspect
查看详细信息
docker inspect 容器id
查看结果,Mounts
下面就是 -v
命令挂载信息
"Mounts": [{"Type": "bind","Source": "/home/ceshi", # Source 主机内地址"Destination": "/home", # Destination docker 内容器地址"Mode": "","RW": true,"Propagation": "rprivate"}...
]
测试数据卷文件同步
- 容器同步到宿主机;2. 宿主机同步到容器
测试一:容器同步到宿主机
在容器的 /home
文件夹下新建一个测试文件
touch test.java
然后查看宿主机的 /home/ceshi
文件夹
cd /home/ceshi
查看文件目录发现,宿主机的文件夹中同时拷贝了这个测试文件,结果如图所示:
测试二:宿主机同步到容器
停止该容器:
exit
在宿主机上修改这个文件内容,先打开文件,按住 i
键进入修改
# 先打开文件
vim test.java# 按住 i 键进入修改,写入内容
Hello, Linux updated!# 按下 ESC 键,保存文件并退出
:wq
查看之前运行过的容器,获取容器 id
docker ps -a
启动并进入容器:
# 启动容器
docker start 容器id# 进入容器
docker attach 容器id
查看文件内容,发现容器内的数据依旧是同步的。
cat /home/test.java
2. 使用 Dockerfile 构建
Dockerfile 是一个命令脚本,用于构建 Docker 镜像文件。
通过这个脚本可以生成镜像。镜像是一层一层的,脚本是一个一个的命令,所以每个命令都是一层。
在创建镜像之时,就完成了数据卷挂载。
创建 Dockerfile 文件
Dockerfile 文件名可以随意,但是,建议使用 Dockerfile
在 /home
目录下新建 docker-test-volume
文件夹,Dockerfile 在这个文件夹下构建镜像。
新建目录:
mkdir docker-test-volume
cd
进入目录,创建 dockerfile1
文件
vim dockerfile1
写入内容并保存退出
# 文件的内容 指令(大写)+ 参数
# 这里的每个命令,就是镜像的一层# 基于镜像 centos
FROM centos# 数据卷挂载目录,可以写多个
# 这里是匿名挂载
VOLUME ["volume01","volume02"]# 完成后 输出信息
CMD echo "--------end----------"# 进入容器控制台的方式
CMD /bin/bash
查看下文件内容,确定下有没有问题
cat dockerfile1
构建 Docker 镜像
基于 dockerfile1,在当前目录下,生成 1.0 版本的 yuanyuan/centos 镜像。
# 最后的 . 表示 当前目录
docker build -f dockerfile1 -t yuanyuan/centos:1.0 .
构建过程如下:
不难发现,它没有输出完整的构建过程信息,比如 VOLUME,比如 echo,难道是构建有问题?
笔者通过查看镜像,以及镜像元数据发现,数据卷挂载目录写入成功,镜像也完成了创建,构建没有问题。
查看一下刚刚构建的镜像吧
[root@localhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuanyuan/centos 1.0 b19d22d998db 2 years ago 231MB
详细构建过程查看
所以是它省略了步骤,那如果要看详细的构建过程,应该如何操作呢?当然是添加参数啦。
- 方法一:
DOCKER_BUILDKIT=0
- 方法二:
--progress=plain
拿上面的构建命令举例,大家可以自行尝试一下。
# 方法一
DOCKER_BUILDKIT=0 docker build -f dockerfile1 -t yuanyuan/centos:1.0 .# 方法二
docker build -f dockerfile1 -t yuanyuan/centos:1.0 --progress=plain .
启动容器并查看
启动容器,并进入到容器中:
docker run -it b19d22d998db /bin/bash
进入目录查看,如图,可以看到挂载的两个数据卷目录已经生成了。这两个数据卷目录在容器外部一定有同步的目录。
查看宿主机同步情况
查找同步目录
在容器内,进入 volume01 目录,并创建测试文件:
[root@e773f0b76b59 /]# cd volume01
[root@e773f0b76b59 volume01]# touch container.txt
然后 exit 退出容器,查看该容器的信息:
docker inspect 容器id
在 Mounts 中找到如下信息:
- Source 为外部宿主机的同步目录
- Destination 为容器中的同步目录
"Mounts": [{"Type": "volume","Name": "20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556","Source": "/var/lib/docker/volumes/20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556/_data",// Source 中即为外部宿主机的同步目录"Destination": "volume01","Driver": "local","Mode": "","RW": true,"Propagation": ""},// ......volume02 省略],
在容器外部(宿主机)查看同步情况
进入 volume01 的 Source 目录,查看情况:同步成功了
[root@localhost docker-test-volume]# cd /var/lib/docker/volumes/20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556/_data
[root@localhost _data]# ls
container.txt
四、匿名挂载 / 具名挂载
1. 匿名挂载
匿名挂载的配置方式为:-v 容器内路径
运行一个 nginx 试试:
# -P 表示随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
学习下 volume 如何使用:
docker volume --help
volume 使用方式如下:
[root@localhost ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove unused local volumesrm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
查看本地所有 volume 的情况:
docker volume ls
查看发现,匿名挂载是很长一串。
因为 -v
只写了容器内的路径,没有写容器外的路径。
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 70addcda47d2d792fce62f674394a8a3df02042fbf5a8e05ed8462e8065d89d2
2. 具名挂载
通过具名挂载可以方便地找到卷,大多数情况使用具名挂载
具名挂载的配置方式为:-v 卷名:容器内路径
运行一个 nginx 试试:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
查看本地 volume 的情况,可以看到具名挂载卷的名字是刚刚设置的 juming-nginx
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
查看一下这个卷:
docker volume inspect juming-nginx
结果如下,可以发现,Docker 容器内的卷在没有指定路径情况下,默认会在 /var/lib/docker/volumes/xxx/_data
[root@localhost ~]# docker volume inspect juming-nginx
[{"CreatedAt": "2024-04-10T20:54:37+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
进入目录查看一下,我们成功拿到了 nginx 的配置文件 nginx.conf
[root@localhost _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
3. 如何区分
如何区分:具名挂载 / 匿名挂载 / 指定路径挂载?
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
4. 拓展:读写权限
改变读写权限
# 通过 -v 容器内路径:ro rw 改变读写权限
ro read-only # 只读
rw read-write # 可读可写# 举个例子
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
一旦设置了容器权限,容器对挂载出来的内容就会有限定。
/etc/nginx:ro
表示容器内的 /etc/nginx
会被挂载为只读模式,意味着不能在容器内部对这个目录进行写操作。
五、数据卷容器(父容器)
1. 原理介绍
数据卷技术不仅可以完成容器和宿主机之间的同步,也可以完成两个/多个容器之间的同步。
使用方式,将一个容器挂载到另一个容器上,被挂载的容器,我们称之为父容器,或数据卷容器。
2. 启动容器测试
通过上面 Dockerfile 制作的 yuanyuan 镜像,我们启动 3 个容器,来测试多个容器之间数据同步。
启动并进入容器 docker01
docker run -it --name docker01 yuanyuan/centos:1.0
查看详细目录,可以看到数据卷目录:
[root@b3824bd95c81 /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume02
启动并进入容器 docker02
为了方便测试,我们可以使用 FinalShell 创建多个 SSH 连接,3 个都连接我们的 Linux,第 1 个进入 docker01 容器,第 2 个进入 docker02 容器。
我们把 docker01 作为数据卷容器,docker02 挂载到 docker01 上。
# 挂载参数 --volumes-from
docker run -it --name docker02 --volumes-from docker01 yuanyuan/centos:1.0
查看详细目录,可以看到数据卷目录:
[root@6ff9c85ebd26 /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume02
启动并进入容器 docker03
docker03 也挂载到 docker01 上
# 挂载参数 --volumes-from
docker run -it --name docker03 --volumes-from docker01 yuanyuan/centos:1.0
查看详细目录,可以看到数据卷目录:
[root@2f1eead0d71f /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 06:08 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume02
3. 测试容器间的数据同步
通过
--volumes-from
,可实现容器间的数据同步。数据同步是双向的。
测试 docker01 ==> docker02
在 docker01 容器的 volume01 卷中创建文件
[root@b3824bd95c81 /]# cd volume01
[root@b3824bd95c81 volume01]# touch docker01
在 docker02 容器的 volume01 卷中查看
可以看到,docker01 中创建的内容同步到了 docker02 上。
[root@6ff9c85ebd26 /]# cd volume01
[root@6ff9c85ebd26 volume01]# ls
docker01
测试 docker02 ==> docker01
在 docker02 容器的卷中创建文件
[root@6ff9c85ebd26 volume01]# touch docker02
在 docker01 容器的卷中查看
可以看到,docker02 中创建的内容同步到了 docker01 上。
[root@b3824bd95c81 volume01]# ls
docker01 docker02
测试 docker03 ==> docker01 / 02
在 docker03 容器的卷 volume01 中创建文件
touch docker03
分别在 docker01 和 docker02 容器的 volume01 卷中查看
可以看到,docker03 中创建的内容同步到了 docker01 和 docker02 容器上。
4. 删除父容器
删除 docker01 容器:
[root@localhost ~]# docker rm -f docker01
在 docker02 / docker03 容器中查看数据卷,发现文件依然存在,它们依然可以访问这个数据卷。
[root@6ff9c85ebd26 volume01]# ls
docker01 docker02 docker03
这说明:数据卷技术并不是简单的共享,而是拷贝。
docker02 和 docker03 是把 docker01 中的数据卷拷贝了一份到自己那里。
注意:就算此时父容器 docker01 被删除了,docker02 和 docker03 依然能够实现数据同步!
容器 – 容器:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
容器 – 宿主机:一旦数据持久化到了本地,本地的数据是不会删除的。
六、MySQL 实战
实战:MySQL 的安装和数据同步;思考:MySQL 的数据持久化问题。
1. 安装 MySQL
获取镜像
获取镜像,下载 MySQL:
docker pull mysql:5.7
运行容器
在 docker hub
上查看如何使用 mysql
:参考这里
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
运行容器,需要做数据挂载,注意安装启动 mysql 需要配置密码
-d
:后台运行-p
:端口映射-v
:卷挂载-e
:环境配置--name
:容器名字
注意:命令中的斜杠 \
是在一条命令没写完但是要进行换行情况下使用,如果命令写在同一行就不需要斜杠。
docker run -d -p 3346:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
测试连接
测试一下自己电脑上能不能连接成功
使用数据库工具,比如 Navicat、WorkBench 之类的测试一下
输入宿主机的 ip
,还有映射的端口号 3346
,以及用户名和密码
在本地创建一个数据库 test
Linux 中查看容器挂载目录 /home/mysql/data
,发现数据库 test
完成了同步
说明映射路径是正确的
删除容器
删除 mysql01
容器
docker rm -f mysql01
然后查看 /home/mysql/data
目录,发现挂载的数据卷依然存在,不会和容器一起删除。
实现了数据持久化功能!
2. 多个 MySQL 实现数据同步
启动两个 mysql 容器,让他们实现数据同步
先启动容器 mysql01,配置一下容器内数据卷路径
docker run -d -p 3346:3306 -v /etc/mysql/conf.d -v /var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
再启动 mysql02,把 mysql02 挂载到 mysql01 上
docker run -d -p 3346:3306 \
-e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
注意:
端口设置一样的话,相当于两个容器共用一个数据库。无论是在本地连接还是各自容器内查看,它们的内容都保持一致。
但不能同时启动,因为端口同一时刻只能分配给一个容器。
七、总结
本文主要介绍了容器数据卷技术,介绍了数据卷的两种挂载方式,体验了匿名挂载与具名挂载的区别之处,不仅实现了容器与宿主机的数据同步,还实现了多个容器之间的数据同步。初学入门,挑战容器数据卷技术一文通。
一些参考资料
狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html
相关文章:

Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
一、前言 记录时间 [2024-4-11] 系列文章简摘: Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用) Docker 学习笔记(三)&#x…...

csdn怎么变得这么恶心,自动把一些好的文章分享改成了vip可见
刚刚发现以前发的一些文章未经过我同意,被csdn自动改成了VIP可见,这也太恶心了,第一你没分钱给我,第二我记录下一些问题也不是为了赚钱,而是为了提升自己和帮助别人,这样搞是想逼更多人走是吗?...

自然语言处理NLP:文本预处理Text Pre-Processing
大家好,自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向,其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容,助力自然语言处理和模型的生成使用。 1.文本…...

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总
由于我是在虚拟机中安装的security onion,在此过程中,遇到很多的网络访问不通的问题,通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上,网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…...

2024年外贸行业营销神器推荐
2024年外贸行业营销神器推荐:外贸人每天面对的不是国内客户,而是全球客户,相对于国内来说,会更加麻烦和繁琐,今天就码一篇2024年外贸行业营销神器的推荐文章,希望可以减轻各位外贸人的负担! 1、…...

k8s高可用集群部署介绍 -- 理论
部署官网参考文档 负载均衡参考 官网两种部署模式拓扑图和介绍 介绍两种高可用模式 堆叠 拓扑图如下(图片来自k8s官网): 特点:将etcd数据库作为控制平台的一员,由于etcd的共识算法,所以集群最少为3个&…...

【GDAL-Python】1-在Python中使用GDAL读写栅格文件
文章目录 1-概要2.代码实现 1-概要 提示:本教程介绍如何使用 Python 中的 GDAL 库将栅格数据读取为数组并将数组另存为GeoTiff 文件 视频地址:B站对应教程 目标: (1)读写GeoTiff影像; (2&…...

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
目录 一、前言 二、explicit关键字是什么? 三、构造函数还具有类型转换的作用 🍎单参构造函数 ✨引出 explicit 关键字 🍍多参构造函数 ✨为什么需要explicit关键字? ✨怎么使用explicit关键字? 四、总结 五…...

maven引入外部jar包
将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…...

李沐37_微调——自学笔记
标注数据集很贵 网络架构 1.一般神经网络分为两块,一是特征抽取原始像素变成容易线性分割的特征,二是线性分类器来做分类 微调 1.原数据集不能直接使用,因为标号发生改变,通过微调可以仍然对我数据集做特征提取 2.pre-train源…...

【小程序】生成短信中可点击的链接
文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求,需要给用户发送炮轰短信,用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的,生成的倒是快速…...

欧拉函数(模板题)
给定 n 个正整数 ai,请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数 n。 接下来 n 行,每行包含一个正整数 ai。 输出格式 输出共 n 行,每行输出一个正整数 ai 的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2109 输…...

Thingsboard PE 白标的使用
只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…...

智能物联网远传冷水表管理系统
智能物联网远传冷水表管理系统是一种基于物联网技术的先进系统,旨在实现对冷水表的远程监测、数据传输和智能化管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.远程监测:系统可以实现对冷水表数据的远程监测,无…...

Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
汇创慧玩 写在前面1. 查看系统架构相关指令2. ARM64交叉编译器环境搭建3. Qt编译arm64环境搭建4. 配置 Qt的本地aarch64交叉编译器5. 工程建立及编译验证 写在前面 苦辣酸甜时光八载,春夏秋冬志此一生 Qt简介: Qt(官方发音 [kju:t]ÿ…...

2024年华为OD机试真题-最长子字符串的长度(二)-Python-OD统一考试(C卷)
题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写的字母组成的字符串。 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母…...

【24届数字IC秋招总结】正式批面试经验汇总5——蔚来、tp-link
文章目录 一、蔚来-数字芯片验证工程师1.1 一面面试问题1.2 二面面试问题二、tp-link-数字IC验证工程师2.1 面试问题一、蔚来-数字芯片验证工程师 面试时间:9.6 10.6 1.1 一面面试问题 1、 讲下项目结构 2、 scoreboard如何进行数据对比的 3、 golden 数据怎么产生的 4、 在…...

【JAVA基础篇教学】第八篇:Java中List详解说明
博主打算从0-1讲解下java基础教学,今天教学第八篇:Java中List详解说明。 在 Java 编程中,List 接口是一个非常常用的集合接口,它代表了一个有序的集合,可以包含重复的元素。List 接口提供了一系列操作方法,…...

RN向上向下滑动组件封装(带有渐变色)
这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…...

27、Lua 学习笔记之五(Lua中的数学库)
Lua中的数学库 Lua5.1中数学库的所有函数如下表: math.pi 为圆周率常量 3.14159265358979323846 数学库说明例子方法abs取绝对值math.abs(-15)15acos反余弦函数math.acos(0.5)1.04719755asin反正弦函数math.asin(0.5)0.52359877atan2x / y的反正切值math.atan2(9…...

【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:C❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 1、概念 2、特征 二、赋值运算符重载 1、运算符重载 2、赋值运算符重载 3、前置…...

OpenHarmony实战开发-页面深色模式适配。
介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 1. 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值…...

域名解析出现错误,该如何解决?
域名作为网络地址,是我们访问网站的必经之路,域名解析就是把你的域名解析成一个ip地址,在使用的过程中遇到域名解析文件异常也是常有的事。如果域名解析出现错误,该怎么解决呢? 一、打开网页时,显示域名解析…...

从iPhone恢复已删除照片的最佳软件
本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片,请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片? 没有什么比丢失iPhone上的重要数据更痛苦的了,尤其是一些具有珍贵回忆的照片。有时…...

MySQL模糊查询
一、MySQL通配符模糊查询(%,_) 1.1.通配符的分类 1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次) 2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然…...

QEMU_v8搭建OP-TEE运行环境
文章目录 一、依赖下载二、设置网络三、安装下载四、运行OP-TEE 一、依赖下载 更新依赖包,下载一系列依赖。比如Python需要Python3.x版本,需要配置git的用户名和邮箱等。这里不详细展开了,很多博客都有涉及到。 二、设置网络 这一点非常重…...

C++11 设计模式0. 设计模式的基本概念,设计模式的准则,如何学习设计模式,24种设计模式的分为3大类
一 设计模式的基本概念: 模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。 设计模式,是在特定问题发生时的可重用解决方案。 设计模式一般用于大型项目中。 大型项目中,设计模式保证所设计的模块之间代码的灵…...

(十)C++自制植物大战僵尸游戏设置功能实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 游戏设置 游戏设置功能是一个允许玩家根据个人喜好和设备性能来调整游戏各项参数的重要工具。游戏设置功能是为了让玩家能够根据自己的需求和设备性能来调整游戏,以获得最佳的游戏体验。不同的游戏和平…...

数据结构——通讯录(顺序表的实战项目)
(—).通讯录的功能 大家应该都十分了解通讯录的功能吧,无非就是对联系人的增添删除,还有信息的修改,并且联系人信息要包含名字,电话,性别,地址等。我把通讯录的功能总结如下&#x…...

数据库-Redis(14)
目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?...