Docker基本操作【一篇学会项目部署】

news2024/11/20 20:44:39

文章目录

  • 一、Docker简介
  • 二、Docker安装
  • 三、配置镜像加速
  • 四、Docker部署
  • 五、Docker基础操作
    • 1. 常见命令
    • 2. 操作演示
    • 3. 数据卷
      • ①nginx的html目录挂载
      • ②分析匿名数据卷
      • ③MySQL的本地目录挂载
    • 4. 自定义镜像
      • ①Dockerfile
      • ②构建镜像
    • 5. 网络
      • ①常见命令
      • ②自定义网络
  • 六、DockerCompose
    • 1. 基础语法
    • 2. 基础命令
    • 3. docker-compose示例


本文均学于“黑马程序员”
本文所用环境:CentOS7 、HeidiSQL 、MobaXterm、MySQL

一、Docker简介

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

Docker分为如下三个概念:

  • 镜像(Image): 类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
  • 容器(Container): 类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
  • 仓库(Repository): 类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

二、Docker安装

  • 1. 安装yum工具
yum install -y yum-utils
  • 2. 配置Docker的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 3. 安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 4. 启动Docker
systemctl enable docker   //设置开机自启
systemctl start docker    //开启Docker
  • 5. 校验Docker
docker ps

三、配置镜像加速

这里使用阿里云镜像加速

- 1. 产品 —> 容器 —> 容器镜像服务ACR
在这里插入图片描述

  • 2. 管理控制台
    在这里插入图片描述
  • 3. 镜像工具 —> 镜像加速器
    在这里插入图片描述
  • 4. 回到Linux,根据自己的加速器地址 执行如下命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

四、Docker部署

这里以MySQL为例进行部署

在CentOS下执行如下命令:

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql

其中:

  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行

  • --name mysql : 给容器起名字叫mysql

  • -p 3306:3306 : 设置端口映射

    • 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
    • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
    • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口
  • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数

    • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定
    • TZ=Asia/Shanghai是设置时区;
  • MYSQL_ROOT_PASSWORD=123456:是设置MySQL默认密码

  • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

    • 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
    • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest
      在这里插入图片描述
      如上 该一条指令MySQL安装完成,可通过任意客户端工具即可连接到MySQL
      这里我采用HeidiSQL进行连接
  • 填入相关信息即可
    在这里插入图片描述

  • 连接成功!
    在这里插入图片描述

五、Docker基础操作

1. 常见命令

在这里插入图片描述

2. 操作演示

以下以nginx为例,使用MobaXterm对CentOS进行远程操控

  • 1. 拉取nginx镜像
docker pull nginx
  • 2. 查看镜像
docker images
  • 3. 打包保存镜像
docker save -o nginx.tar nginx
  • 4. 删除镜像
docker rmi nginx:latest    //:latest表示为最新的
  • 5. 重新从包中获取镜像,无需重新拉取
docker load -i nginx.tar

在这里插入图片描述

  • 6. 创建并运行Nginx容器
docker run -d --name nginx -p 80:80 nginx   //第一个nginx为容器名 第二个为依赖的镜像
  • 7. 查看运行中的容器
docker ps     //正常查看
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"   //格式化查看
  • 8. 访问网页,地址:http://虚拟机地址
// 浏览器输入
http://192.168.80.130:80

在这里插入图片描述

  • 9. 停止容器
docker stop nginx
  • 10. 查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
  • 11. 再次启动nginx容器
docker start nginx
  • 12. 再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

在这里插入图片描述

  • 13. 查看容器详细信息
docker inspect nginx

在这里插入图片描述

  • 14. 进入容器,查看容器内目录
docker exec -it nginx bash
  • 15. 退出容器
exit

在这里插入图片描述

  • 16. 删除容器
docker rm nginx
docker rm -f nginx   //强制删除
  • 17. 给命令起别名
vi /root/.bashrc   //修改/root/.bashrc文件

//例如:
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

在这里插入图片描述

source /root/.bashrc    //使别名生效

在这里插入图片描述

3. 数据卷

数据卷(volume) 是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

常见命令:
在这里插入图片描述
Tips:

  • 容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
  • /var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
  • 让容器直接与宿主机目录挂载而不使用数据卷

操作演示

①nginx的html目录挂载

  • 1. 删除nginx容器
docker rm -f nginx
  • 2. 创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
  • 3. 查看数据卷
docker volume ls
  • 4. 查看指定数据卷详情
docker volume inspect html
  • 5. 查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
  • 6. 进入该目录,修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html
// 例如:将第十二行改为" <h1>Welcome to 比特冬哥!</h1> "
  • 7. 重新打开页面,查看效果
// 浏览器输入
http://192.168.80.130:80

在这里插入图片描述

  • 8. 上传一张图片放置 /var/lib/docker/volumes/html/_data目录下
    在这里插入图片描述

  • 9. 进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化

docker exec -it nginx bash
cd /usr/share/nginx/html
ls

在这里插入图片描述

②分析匿名数据卷

  • 查看数据卷详情信息
    可知,上面我们是没有对MySQL容器进行挂载操作的
docker inspect mysql

在这里插入图片描述
可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷。
在这里插入图片描述
可以发现,其中有几个关键属性:

  • Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。
  • Source:宿主机目录
  • Destination : 容器内的目录
    上述配置是将容器内的/var/lib/mysql这个目录,与数据卷3756e6eda3cf6fa74dadc79840c6b5ab6063a5fb7b95ca1e48fd659a6e9c5830
    挂载。于是在宿主机中就有了/var/lib/docker/volumes/3756e6eda3cf6fa74dadc79840c6b5ab6063a5fb7b95ca1e48fd659a6e9c5830/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

③MySQL的本地目录挂载

  • 1. 删除原来的MySQL容器
docker rm -f mysql
  • 2. 进入root目录
cd ~
  • 3. 创建文件夹用于本地目录挂载
mkdir mysql
cd mysql
mkdir data
mkdir conf
mkdir init
  • 4. 将事先准备好的文件拉入文件中
    该两文件主要是用于配置MySQL的默认编码(改为utf8mb4) 和 初始化SQL脚本
    在这里插入图片描述

  • 5. 创建并运行新mysql容器,挂载本地目录

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql
  • 6. 查看容器信息
dps
  • 7. 查看data目录,会发现里面有大量数据库数据,说明数据库完成了初始化
ls -l data
  • 8. 进入MySQL容器
docker exec -it mysql mysql -uroot -p   //mysql -uroot -p为进入容器后执行的指令
  • 9. 查看编码表
show variables like "%char%";  //发现编码是utf8mb4没有问题

在这里插入图片描述

4. 自定义镜像

自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包

①Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile

常用语法:
在这里插入图片描述

②构建镜像

这里已提前获取构建镜像需要的基础镜像包

Dockerfile文件内容如下:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 1. 加载jdk镜像
docker load -i jdk.tar
  • 2. 查看jdk镜像是否加载成功
dis
  • 3. 在demo目录下构建自定义镜像
cd demo/
docker build -t docker-demo .

命令说明:
docker build : 就是构建一个docker镜像
-t docker-demo :-t参数是指定镜像的名称(repository和tag)
. : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录

  • 4. 查看自定义镜像(docker-demo)是否加载成功
dis
  • 5. 在docker-demo镜像中创建一个容器并运行
docker run -d --name dd -p 8090:8090 docker-demo    //dd为容器名  docker-demo为镜像
  • 6. 查看容器的运行情况
dps

在这里插入图片描述

5. 网络

用于解决不同容器之间的通信

①常见命令

在这里插入图片描述

②自定义网络

  • 1. 创建一个网络
docker network create bit_dong  //bit_dong为网络名
  • 2. 然后查看网络
docker network ls
  • 3. 查看容器
dps
  • 4. 让dd和mysql都加入该网络,网络内各容器可以用容器名互相访问!
docker network connect bit_dong mysql    //mysql和dd为容器名
docker network connect bit_dong dd
  • 5. 进入dd容器,尝试利用容器名访问mysql
docker exec -it dd bash
ping mysql
  • 6. 也可以通过在创建容器的时候就绑定自定义网络
docker run -d --name dd -p 80:80 --network bit_dong mysql  

在这里插入图片描述

六、DockerCompose

Docker Compose可以帮助实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

1. 基础语法

例如,用docker run部署MySQL的命令如下:

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --network hmall
  mysql

如果用docker-compose.yml文件来定义,则为:

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: hmall

对比如下:
在这里插入图片描述

2. 基础命令

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
在这里插入图片描述

3. docker-compose示例

以下是“黑马程序员”提供的docker-compose.yml文件

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

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

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

相关文章

五种雷达波束模式简介及其应用场景

图1 雷达天线方向图一览 一、铅笔光束——Pencil beam: 方位角和仰角都很窄的光束&#xff08;像铅笔一样细&#xff09;&#xff1b;用于三维雷达&#xff0c;如仪表雷达、天气雷达和防空雷达。 二、扇形波束——Fan beam 方位角非常窄&#xff08;接近1至2&#xff09;&am…

Spring框架数据访问

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

机器学习:随机森林

集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习方法&#xff0c;通过将多个基本学习算法的预测结果进行组合&#xff0c;以获得更好的预测性能。集成学习的基本思想是通过结合多个弱分类器或回归器的预测结果&#xff0c;来构建一个更强大的集成模…

《Spring框架前世今生》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

基于SSM的在线电影评价系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

LVGL_基础控件滑动条slider

LVGL_基础控件滑动条slider 1、创建滑动条控件 // 创建一个 slider 组件(对象)&#xff0c;他的父对象是活动屏幕对象 lv_obj_t *slider lv_slider_create(lv_scr_act()); LV_LOG_USER("lv_slider_get_value(slider) %d", lv_slider_get_value(slider));/* 设置位…

Python 办公自动化Excel修改数据

如何修改Excel 符合条件的数据&#xff1f;用Python 几行代码搞定。 需求&#xff1a;将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500&#xff0c;并保存Excel文件。如下图 Python 修改Excel 数据&#xff0c;常见步骤&#xff1a; 1&…

Git分布式版本控制工具(学习git,这一篇就够了)

1.1、Git Git 是分布式的 ,Git 不需要有中心服务器&#xff0c;我们每台电脑拥有的东西都是一样的。我们使用 Git 并且有个 中心服务器&#xff0c;仅仅是为了方便交换大家的修改&#xff0c;但是这个服务器的地位和我们每个人的 PC 是一样的。我们可以 把它当做一个开发者的…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具

文章目录 openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具91.1 gs_ctl&#xff08;全量和增量&#xff09;91.2 gs_basebackup91.3 gs_dump91.4 gs_restore openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT…

Spring MVC工作原理

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

松鼠搜索算法(SSA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

【GSEP202303 C++]】1级 每月天数

[GSEP202303 一级] 每月天数 题目描述 小明刚刚学习了每月有多少天&#xff0c;以及如何判断平年和闰年&#xff0c;想到可以使用编程方法求出给定的月份有多少天。你能做到吗&#xff1f; 输入格式 输入一行&#xff0c;包含两个整数&#xff0c;分别表示一个日期的年、月…

Flow Chart 的中文意思是什么?请说出自然界中河流的三种流动方式。事件驱动是什么?

目录 Flow Chart 的中文意思是什么? 请说出自然界中河流的三种流动方式。 事件驱动是什么? 请介绍一下 亚特兰大这座城市 Flow Chart 的中文意思是什么? 流程图 请说出自然界中河流的三种流动方式。 自然界中的河流可以以多种不同的方式流动&#xff0c;以下是其中三…

NSS [HNCTF 2022 WEEK2]ez_SSTI

NSS [HNCTF 2022 WEEK2]ez_SSTI 开题&#xff0c;已经提示了是SSTI 参数是name&#xff0c;测试得出模板是jinja2。 先跑一下fuzz。字典在我博客CTFshow的SSTI那篇。 看了一下&#xff0c;貌似没过滤。 六种执行命令方式我们选择eval执行命令。其他几种也行。 找os._wrap_clo…

选择适合户外篷房企业的企业云盘解决方案

“户外篷房企业用什么企业云盘好&#xff1f;Zoho WorkDrive企业网盘可以帮助户外篷房企业实现文档统一管理、提高工作效率、加强团队协作&#xff0c;并且支持各种文件类型的预览和编辑。” S公司是一家注重管理规范的大型户外篷房企业&#xff0c;已经有10余年的经验。作为设…

Cocos Creator3.8 项目实战(五)背景无限滚屏效果如何实现

在游戏中&#xff0c;我们经常会实现背景无限滚动的效果。那这些效果是怎么实现的呢&#xff1f; 原理很简单&#xff0c;就是使用多张背景图&#xff0c;每张图&#xff0c;每一帧都同时移动&#xff0c;当图移出屏幕外时&#xff0c;将其位置设置到下一张图的初始位置&#x…

练[watevrCTF-2019]Cookie Store

[watevrCTF-2019]Cookie Store 文章目录 [watevrCTF-2019]Cookie Store掌握知识解题思路关键paylaod 掌握知识 ​ 抓包放包&#xff0c;set-cookie和cookie的联系&#xff0c;base64编码&#xff0c;cookie请求头 解题思路 打开题目链接&#xff0c;发现响应速度有点慢。发现…

【伪彩色图像处理】将灰度图像转换为彩色图像研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…