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"
     }
     ...
]

测试数据卷文件同步

  1. 容器同步到宿主机;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 volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove unused local volumes
  rm          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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arm-linux-gnueabihf-gcc默认目录

默认编译的头文件目录: /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib 默认编译的库文件目录: /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/include/ …

校招生如何准备软件测试、测试开发岗位的面试?

校招生如何准备软件测试、测试开发岗位的面试? 求职建议 大家都很困惑如何学习测试?如何准备测试方面的面试? 我有朋友是做研发的,他认为测试不用准备,直接用开发的简历就行。也有人认为要学习一些测试理论&#xf…

使用 create-vue 脚手架工具创建一个基于 Vite 的项目,并包含加入 Vue Router 等可选项

如果你打算启动一个新项目,你可能会发现使用 create-vue 这个脚手架工具更容易,它能创建一个基于 Vite 的项目,并包含加入 Vue Router 的选项,指令如下: // npm npm create vuelatest// yarn yarn create vue// pnpm …

HTML、CSS --javaweb学习笔记

记录一些重要的知识点 CSS引入方式 行内样式&#xff1a;<h1 style"...">内嵌样式&#xff1a;<style>…</style>外联样式&#xff1a;xxx.css <link href"..."> 颜色表示 关键字&#xff1a;red、green.......rgb表示法&…

java快速构建飞书API消息推送、消息加急等功能

文章目录 飞书机器人自定义机器人自定义应用机器人 自定义应用发送消息普通文本 text富文本 post图片 image文件 file语音 audio视频 media消息卡片 interactive分享群名片 share_chat分享个人名片 share_user 批量发送消息消息加急发送应用内加急发送短信加急 发送电话加急spr…

【随身wifi京东金榜排名】格行vs华为vs上赞随身wifi哪款最好用?格行随身wifi官方正品,格行随身wifi怎么样?

第一名&#xff1a;格行随身wifi 综合分99.1 随身WiFi行业领跑品牌 &#xff0c;15年行业经验 &#xff0c;随身WiFi口碑榜第一名。轻便小巧&#xff0c;支持三网通&#xff0c;可以随时随地提供稳定高速的网络连接。使用目前先进的马维尔芯片&#xff0c;信号稳定&#xff0…

Unet++(pytorch实现)

Unet++网络 Dense connection Unet++继承了Unet的结构,同时又借鉴了DenseNet的稠密连接方式(图1中各种分支)。 作者通过各层之间的稠密连接,互相连接起来,就像Denset那样,前前后后每一个模块互相作用,每一个模块都能看到彼此,那对彼此互相熟悉,分割效果自然就会变好…

位像素海外仓管理系统对接ERP系统教程,一对一教学

在海外仓管理过程中&#xff0c;对接ERP系统的重要性不言而喻的。这种对接不仅能让数据实时共享&#xff0c;还能让海外仓管理者优化整个供应链管理流程。 因此&#xff0c;今天小编就来教大家&#xff0c;海外仓仓库系统是怎么对接ERP物流系统的&#xff1f; 1.分析需求 在对接…

2024年危险化学品经营单位安全管理人员证考试题库及试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位安全管理人员证考试题库及危险化学品经营单位安全管理人员试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff0…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

2024年mathorcup数学建模思路及论文助攻

题目C题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同流向进行分拣并发往下一个场地&#xff0c;最终使包裹到达消费者…

在 macOS 上安装 Jenkins

Jenkins常用命令&#xff1a; 安装最新的 LTS 版本&#xff1a; brew install jenkins-lts 安装特定的 LTS 版本&#xff1a; brew install jenkins-ltsYOUR_VERSION 启动Jenkins服务&#xff1a; brew services start jenkins-lts 重启Jenkins服务&#xff1a; brew services…

[大模型]Yi-6B-Chat FastApi 部署调用

Yi-6B-Chat FastApi 部署调用 环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8&#xff08;11.3 版本以上的都可以&#xff09;。 接下来打开刚刚租用服务器的 JupyterLab…

文件上传【2】--靶场通关

1.前端禁用js绕过 上传文件&#xff0c;进行抓包&#xff0c;没有抓到&#xff0c;说明这里的验证是前端js验证跳出的弹窗 禁用js后&#xff0c;php文件上传成功。 2.文件上传.htaccess 上传png木马后连接不上 代码中存在.htaccess&#xff0c;判断此时应该就是需要用到.htac…

Xlinx相关原语讲解导航页面

原语就是对FPGA底层器件的直接调用&#xff0c;与IP功能是类似的&#xff0c;将原语的参数变成IP配置时的GUI界面参数&#xff0c;可能会更加直观。IP的缺陷在于繁杂&#xff0c;比如SelectIO IP内部包含IDDR、ODDR等等IO转换的功能&#xff0c;如果只想使用单沿转双沿一个功能…

Python根据主播直播时间段判定订单销售额归属

写在前面&#xff1a;最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的&#xff0c;于是就想用Python来实现。 需求描述&#xff1a;根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 from datetime import datetime, timed…

图片合成二维码怎么实现?图片二维码的生成技巧

图片合成二维码如何制作呢&#xff1f;现在很多的二维码都会提供图片预览的功能&#xff0c;我们可以用手机扫描二维码来查看图片的信息&#xff0c;比如很多的产品信息、旅游攻略、产品海报等等类型经常会制作这种类型的二维码。 其实图片制作二维码的方法很简单&#xff0c;…

自建远程桌面服务器,控制免root安卓手机和pc

RustDesk是一个开源的远程桌面软件&#xff0c;它允许用户通过互联网在不同设备之间共享桌面和控制权限。这款软件以最少的配置提供了自托管和安全保障&#xff0c;是一个类似于TeamViewer的开源替代品​ (RustDesk)​。RustDesk支持在Windows、macOS、Linux、iOS、Android以及…

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21”空难的发生…

基于ES-EKF的LiDAR/GNSS/IMU传感器融合轨迹估计(附项目源码)

基于改进EKF的LiDAR/GNSS/IMU传感器融合轨迹估计&#xff08;附项目源码&#xff09; 算法概述PredictionCorrectionES-EKF算法融合算法实现轨迹估计实验结果 最近在研究传感器融合&#xff0c;看到一个很好的开源项目&#xff0c;适合小白学习&#xff0c;为以后做传感器融合、…