【Docker】有用的命令

文章目录

  • Docker
    • Docker 镜像与容器的差异
    • Docker的好处
    • Hypervisor
    • 运维
  • 一、安装docker
  • 二、启动docker
  • 三、获取docker镜像
  • 四、创建镜像
    • 使用命令行创建镜像
    • 使用dockerfile创建镜像
  • 五、docker报错

Docker

  1. docker镜像(Image)
    docker镜像类似于虚拟机镜像,可以将其理解为一个只读模板。除了提供容器运行时所需的程序、库、资源、配置等文件外,docker镜像还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
    镜像是创建docker容器的基础,它可以通过版本管理和增量的文件系统,如Docker Hub。

  2. docker容器(container)
    docker容器(container)类似于轻量级的沙箱,docker利用容器来运行和隔离应用。
    容器是从镜像创建的应用运行实例, 可以将其启动、开始、停止、删除,但是所有的容器是相互隔离的,互不可见的,这就提供了一个实体机可以安装多个容器,且很轻量级相对于虚拟机。镜像本身是只读的,容器从镜像启动的时候,docker会在镜像的最上层创建一个可写层,镜像本身保持不变。

  3. docker仓库(repository)
    docker仓库(repository)类似于代码库,是docker集中存放镜像的场所。 实际上,注册服务器是存放仓库的地方,其上往往存放着很多仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
    根据存储的镜像公开分享与否,docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载,国内的公开镜像包括Docker Pool,可以提供稳定的国内访问,与GitHub类似。

  4. Dockerfile
    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

Docker 镜像与容器的差异

Docker 容器和镜像是 Docker 技术中两个不同的概念,它们代表了不同的层次和功能。

  1. Docker 镜像:

    • Docker 镜像是 Docker 容器的基础。它是一个包含了应用程序运行所需的一切的只读模板。镜像可以包含操作系统、运行时环境、应用程序代码、依赖关系和配置等。镜像是通过 Docker 镜像构建命令(比如 docker build)或者从 Docker Hub 等镜像仓库中下载的。
    • 镜像的特点是不可更改和只读的,它可以被用来创建多个可运行的 Docker 容器。镜像是多层存储结构,每个层都可以复用和共享,这使得镜像可以高效地分发和部署。
  2. Docker 容器:

    • Docker 容器是由 Docker 镜像创建的可运行实例。容器是在镜像层之上(镜像是只读的),添加一个可写的容器层。容器可以被启动、停止、删除和重新启动。每个容器都是相互隔离的,具有自己的文件系统、网络和进程空间。容器可以在不同的主机和不同的 Docker 引擎中运行,具有高度的可移植性和可复制性。
    • 容器通常用来运行单个应用程序或者服务,每个容器都有自己的运行环境和运行时配置。

总结来说,Docker 镜像是一个只读的模板,用于创建 Docker 容器。镜像具有不变性和可重用性的特点。而容器是由镜像创建的可运行实例,具有自己的文件系统和运行环境,通常用于运行应用程序或者服务。在 Docker 中,镜像与容器之间是父子关系,镜像是容器的基础。

Docker的好处

  1. 更便捷的应用交付和部署
    在这里插入图片描述

  2. 更便捷的升级和扩缩容
    在这里插入图片描述

  3. 更简单的系统运维
    在这里插入图片描述

  4. 更高效的计算资源利用
    在这里插入图片描述

Hypervisor

Hypervisor(虚拟机监视器)是一种软件、硬件或者组合形式,用于虚拟化计算机资源,并管理多个虚拟机的创建、运行和监控。

Hypervisor可以分为两种类型:

  1. Type 1 Hypervisor(裸金属/直接运行型):直接运行在物理硬件上,也称为裸金属或裸机型Hypervisor。它具有更高的性能和直接的硬件访问能力。Type 1 Hypervisor负责管理裸机资源,将其划分为多个虚拟机,每个虚拟机可以运行自己的操作系统。常见的Type 1 Hypervisor有VMware ESXi和Microsoft Hyper-V。

  2. Type 2 Hypervisor(主机操作系统运行型):运行在主机操作系统之上,也称为主机型Hypervisor。Type 2 Hypervisor在主机操作系统上创建和管理虚拟机,并提供对虚拟机的资源分配和监控。它通常用于开发和测试环境。常见的Type 2 Hypervisor有VMware Workstation和Oracle VirtualBox。

Hypervisor的主要功能包括:

  • 资源虚拟化:将物理计算机的CPU、内存、存储等资源划分成多个虚拟机,并为每个虚拟机提供一定的资源配额。
  • 虚拟机管理:创建、启动、停止和删除虚拟机,提供虚拟机的管理接口和操作。
  • 资源调度:根据虚拟机的需求和主机资源的可用性,动态调整资源分配,以实现更好的性能和利用率。
  • 安全隔离:对不同虚拟机之间提供隔离性,确保一台虚拟机的故障或安全问题不影响其他虚拟机。
  • 监控和报告:监控虚拟机的性能指标、资源利用率和运行状态,并生成报告或提供警报。

Hypervisor的作用是实现虚拟化技术,使得一台物理计算机能同时运行多个虚拟机,并将它们隔离开来,从而提供更高的资源利用率、灵活性和可靠性。它是构建虚拟化环境和云计算基础设施的关键组件之一。

运维

运维,全称为运营和维护(Operations and Maintenance),是指对计算机系统、网络设施以及软件应用进行有效运行和稳定维护的工作。

在信息技术领域中,运维是一项重要的工作,它涵盖了硬件设备、网络设施、操作系统、数据库、服务器等各个方面。运维人员负责监控系统运行状态、处理系统故障、进行性能优化、部署更新和维护安全等工作。Docker是运维人员部署项目的高效工具。

一、安装docker

查看centos版本信息,centos7以上已内置docker安装比较方便,参考

cat /etc/redhat-release

centos 7下安装docker

# 安装Docker所需的一些依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装最新版本的Docker
sudo yum install docker-ce docker-ce-cli containerd.io

sudo yum install -y docker这条命令中,-y是一个命令行选项,表示在安装过程中自动应答"yes"到所有的确认提示。

这个选项对于在服务器环境中使用尤其有用,因为在这种环境中,可能需要进行大量的包安装和配置,如果每次都手动确认,会非常麻烦。使用-y选项可以自动应答所有的确认提示,大大简化操作。

启用并启动Docker服务

sudo systemctl enable docker
sudo systemctl start docker

验证docker是否安装成功

docker run hello-world
# 或者
sudo docker --version

二、启动docker

启动Docker服务,并设置为开机启动

systemctl start docker.service
systemctl enable docker.service

如果启动docker失败,可以先卸载再重装

查看docker的版本

docker version

在这里插入图片描述

修改镜像网址

创建daemon文件

vi /etc/docker/daemon.json

输入一下内容

{		"registry-mirrors":["https://registry.docker-cn.com"],"live_restrore":true}

然后esc键返回,并输入:wq保存退出文件

重启docker,并验证镜像是否安装成功

systemctl restart docker
docker search redis

三、获取docker镜像

(注:该图来自该博客:(https://blog.csdn.net/qq_39311377/article/details/131730887))

在这里插入图片描述

将image文件从仓库下载到本地, pull获取镜像,library对应的文件组

docker pull library/hello-world

获取目标image_name镜像

docker pull image_name

下载centos7镜像,:7指定了对应的centos版本:

docker pull centos:7

下载python3.9镜像

docker pull python:3.9

查看已有镜像,Docker镜像保存在/var/lib/docker目录下

docker images

运行hello-world镜像

docker run hello-world

修改本地镜像名字(小写)

docker tag centos:7 mycentos:1

删除仓库为 docker.o/tomcat, 标签为7.0.77-jre7的镜像

docker rmi docker.io/tomcat:7.0.77-jre7

删除镜像ID为b39c68b7af30的镜像

docker rmi b39c68b7af30

本地镜像的删除

docker rmi centos:7

查看正在运行的容器

docker ps

查看所有容器,无论是否正在运行

docker ps -a

在这里插入图片描述

CONTAINER ID:容器的唯一表示ID。
IMAGE:创建容器时使用的镜像。
COMMAND:容器最后运行的命令。
CREATED:创建容器的时间。
STATUS:容器状态。
PORTS:对外开放的端口。
NAMES:容器名。可以和容器ID一样唯一标识容器,同一台宿主机上不允许有同名容器存在,否则会冲突。

根据已有的镜像创建容器

docker run -it --name=c2 centos:7

启动python3.9

docker run -it --name=python3.9 python:3.9

参数的解释:
-i表示让容器的标准输入保持打开
-t表示为容器重新分配一个伪输入终端
--name表示为创建出来的容器起一个名称,名称为c2
centos 表示根据镜像的名称
注意:这种方式表示前台运行容器,退出终端之后,容器会关闭,退出之前可以在xshell中打开另个一终端来查看目前正在运行的容器
退出终端之后,可以再次查看,看看容器是否关闭
如果需要在后台启动容器,可以加上参数-d
命令如下:

docker run -d --name=c3 centos:7

但是只加-d 不加-it会导致启动成功之后,容器就直接关闭,所以后台启动的时候通常都是使用-itd的方式运行容器

docker run -itd --name=c3 centos:7

例子

docker run -p localhost:3307:3306 --name scrapersql --privileged=true \-v /database/mysql:/var/lib/mysql \-e "MYSQL_ALLOW_EMPTY_PASSWORD=true" \-d mysql:5.7

说明
localhost的3307端口上创建一个MySQL服务,并将其映射到主机的3306端口
--name 设置镜像名字
-v将主机上的 /database/mysql目录挂载到容器内的 /var/lib/mysql目录
退出容器
-e:该选项用于设置环境变量。-e "MYSQL_ALLOW_EMPTY_PASSWORD=true"表示在容器中设置一个环境变量MYSQL_ALLOW_EMPTY_PASSWORD,并将其值设置为true。这个环境变量的作用是允许空的MySQL密码

exit

设置端口号

docker run -itd -p 8081:8080 tomcat

8081指的是宿主机的端口
8080指的是容器里面tocmat的端口号
-p 表示端口号参数
从客户机上访问容器,需要有端口映射,docker容器默认采用桥接模式与宿主机通信,需要将宿主机的ip端口映射到容器的ip端口上;
桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络。简而言之,这就好像在局域网中添加了一台新的、独立的计算机一样。因此,虚拟机也会占用局域网中的一个 IP 地址,并且可以和其他终端进行相互访问。

查看容器的详细信息

docker inspect container_id/container_name

查看容器的日志信息

docker logs container_id/container_name

如果提示FileNotFoundException 则有可能是 容器目录下的conf文件夹没有权限 可以使用 chmod -R递归设置权限

从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径

docker cp /root/123.txt mycentos:/home/
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysqldocker run -id \
-p 3366:3306 \
--name=c_mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/logs:/logs \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7参数说明:-p 3366:3306**:将容器的 3306 端口映射到宿主机的 3307 端口。
-v etc/conf:/etc/mysql/conf.d**:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
-v etc/logs:/logs**:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
-v etc/data:/var/lib/mysql** :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
-e MYSQL_ROOT_PASSWORD=root:**初始化 root 用户的密码。

启动容器

docker start  container_name/container_id

停止容器

docker stop container_name/container_id

重启容器

docker restart container_name/container_id

启动容器后,进入到容器内部

docker attach container_name/containere_id

删除容器

docker rm container_name/container_id

查看当前系统docker信息

docker info

获取最新的centos镜像

docker pull centos:latest

查看镜像信息

sudo docker images

查看docker信息

docker info
docker exec -it xxxxx bash

docker exec -it xxxxx bash,这是用于在运行的 Docker 容器中打开一个交互式终端(bash shell)的命令。

  • docker exec:这是 Docker 命令行工具中用于在运行的容器中执行命令的命令。
  • -it:这是两个选项的结合,-i 代表 interactive(交互式),-t 代表 tty(终端)。这两个选项一起使用,允许你在容器中运行一个交互式命令行会话。
  • xxxx:这是你要在其内部运行命令的 Docker 容器的 ID 或名称。你需要用你实际的容器 ID 或名称替换 xxxx
  • bash:这是你要在容器中运行的命令。在这个例子中,我们正在请求 Docker 在容器中启动一个 bash shell。因此,整个命令的意思是:“在运行的容器 xxxx 中启动一个交互式的 bash shell。”
mysql
create database `scraping` default character set utf8mb4;
create database `projectdb` default character set utf8mb4;
create database `taskdb` default character set utf8mb4;
create database `resultdb` default character set utf8mb4;
quit

通过上述命令进入mysql

docker build -t scraper:latest . # 注意后面的点. 

命令 docker build -t scraper:latest .用于在Docker环境中构建一个新的镜像,并将其标记为 scraper:latest。如果你要运行的程序在Dockerfile中已经定义好了,那么这条命令会从Dockerfile开始构建,然后创建一个包含你程序的新镜像。

如果在运行这个命令时遇到了问题,以下是一些可能的原因:

  1. Dockerfile不存在或者不在当前目录。你需要确保你在包含Dockerfile的目录下运行这个命令,或者使用 -f 参数来指定Dockerfile的位置。
  2. Docker环境没有正确安装或者配置。你可以通过 docker --version 来检查Docker是否正确安装并运行。
  3. 网络问题。在某些情况下,网络问题可能会阻止Docker从Internet下载需要的文件。如果可能的话,尝试更换网络环境或者使用VPN。
  4. Dockerfile有错误或者不完整。你需要检查你的Dockerfile以确保其正确性。

四、创建镜像

使用命令行创建镜像

docker commit 命令用于根据 Docker容器 的更改创建一个新的 Dokcer镜像。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。

docker commit 容器id 镜像名称:版本号

docker save 用来将一个或多个image打包保存。如:将本地镜像库中的image1和image2打包到images.tar中

docker save -o 压缩文件名称 镜像名称:版本号
docker save -o images.tag image1:v1 image2:v1

docker load用于将打包的tar中包含的镜像load到本地镜像库,但不能重命名其中的镜像名。

docker load –i 压缩文件名称
docker load -i images.tar

使用dockerfile创建镜像

dockerfile

FROM centos:7 							#定义父镜像
MAINTAINER  yjf 						#定义作者信息
RUN yum install -y vim					# 执行安装vim命令
WORKDIR /opt 							# 定义默认的工作目录
CMD /bin/bash							# 定义容器启动执行的命令

通过dockerfile构建镜像

docker build -f  my_dockerfile -t xxx:7

五、docker报错

ERROR【docker】报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/
需要使用root权限

ERROR docker pull mysql 报missing signature key错误
如果安装docker用的是yum install docker命令的话,下载下来的docker版本未旧版本,所有数字签名有问题
https://blog.csdn.net/Single_for_life/article/details/133653113

su root

https://www.php.cn/faq/506200.html
https://www.modb.pro/db/586199
https://www.bilibili.com/read/cv22443043/

https://blog.csdn.net/m0_73409141/article/details/131425285
https://worktile.com/kb/ask/30572.html
https://blog.csdn.net/swadian2008/article/details/109518783
https://blog.csdn.net/qq_47614329/article/details/130387532
https://blog.csdn.net/weixin_41384860/article/details/128819642
https://blog.51cto.com/u_16099211/6314870

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

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

相关文章

linux 安装anaconda踩坑——哈希值对不上

下载安装包时执行命令 curl -O https://repo.anaconda.com/archive/Anaconda3-<INSTALLER_VERSION>-Linux-x86_64.sh 其中的<INSTALLER_VERSION>需要填写下载的anaconda版本号&#xff0c;于是我就点开官网提供的版本号链接&#xff0c;将我要下载的版本号copy了一…

pom.xml常见依赖及其作用

1.org.mybatis.spring.boot下的mybatis-spring-boot-starter&#xff1a;这个依赖是mybatis和springboot的集成库&#xff0c;简化了springboot项目中使用mybatis进行持久化操作的配置和管理 2.org.projectlombok下的lombok&#xff1a;常用注解Data、NoArgsConstructor、AllA…

如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

2.20学习总结

1.【模板】单源最短路径&#xff08;弱化版&#xff09; 2.【模板】单源最短路径&#xff08;标准版&#xff09; 3.无线通讯网 4.子串简写 5.整数删除 6.拆地毯 【模板】单源最短路径&#xff08;标准版&#xff09;https://www.luogu.com.cn/problem/P4779 题目描述 给定一个…

Excel SUMPRODUCT函数用法(乘积求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…

Kubernetes安装nginx-controller作为统一网关

nginx-controller是什么呢? 它是一个能调度nginx的一个kubernetes operator,它能监听用户创建,更新,删除NginxConf对象,来调度本地的nginx实现配置的动态更新。如添加新的代理(http,https,tcp,udp),缓存(浏览器缓存,本地缓存),ssl证书(配置本身,ConfigMap,Secret),更新,删除等…

c语言结构体与共用体

前面我们介绍了基本的数据类型 在c语言中 有一种特殊的数据类型 由程序员来定义类型 目录 一结构体 1.1概述 1.2定义结构体 1.3 结构体变量的初始化 1.4 访问结构体的成员 1.5结构体作为函数的参数 1.6指向结构的指针 1.7结构体大小的计算 二共用体 2.1概述 2.2 访…

04 Aras Innovator二次开发-客户端方法

客户端方法为JS方法。 系统提供了很多触发点&#xff0c;可以嵌入客户端方法&#xff0c;如下&#xff1a; 1 对象类的客户端事件页签&#xff1a; 2 窗体的Form Event和Filed Event 3.关系类的网格事件&#xff1a; 4 属性事件&#xff1a; 5.可自定义Action,触发客户端事件…

数据结构与算法:栈

朋友们大家好啊&#xff0c;在链表的讲解过后&#xff0c;我们本节内容来介绍一个特殊的线性表&#xff1a;栈&#xff0c;在讲解后也会以例题来加深对本节内容的理解 栈 栈的介绍栈进出栈的变化形式 栈的顺序存储结构的有关操作栈的结构定义与初始化压栈操作出栈操作获取栈顶元…

VR全景开启线上卖房新渠道,助力房企改变营销方式

当下房产行业&#xff0c;还在依靠传统线下发传单、跑客户、做地推吗&#xff1f;在短视频和直播火热的今天&#xff0c;房产行业也开启了线上卖房的新渠道&#xff0c;通过VR全景技术&#xff0c;可以为各个小区的线上宣传增加趣味性和互动性。 一、VR全景漫游可以彰显房源真实…

如何更换过期的SSL证书?

SSL证书是保护网站安全的重要组成部分&#xff0c;它能在客户端和服务器之间建立数据传输加密通道&#xff0c;防止数据在传输过程中被泄露、劫持和窃听。但SSL证书也有有效期限&#xff0c;当SSL证书到期时&#xff0c;您需要及时更换它&#xff0c;以确保网站的安全性和可信度…

Git基本操作(2)

Git基本操作&#xff08;2&#xff09; 上交文件之后&#xff0c;git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退&#xff08;git reset&#xff09;撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…

Pandas快问快答16-30题

16. 如何对一个Pandas数据框进行聚合操作? 聚合操作是数据处理中的一种重要方式&#xff0c;主要用于对一组数据进行汇总和计算&#xff0c;以得到单一的结果。在聚合操作中&#xff0c;可以执行诸如求和、平均值、最大值、最小值、计数等统计操作。这些操作通常用于从大量数…

Vue-Ajax核心知识整理

在Vue框架中可以有很多方式实现 ajax, 其中有xhr、jQuery、fetch、axios、vue-resource, 其中Vue的作者尤雨溪推荐使用axios&#xff0c;所以在使用Vue框架时&#xff0c;尽量还是使用axios 但是当我们使用ajax时&#xff0c;经常会遇到跨域的问题&#xff0c;比如你本地的端口…

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式&#xff0c;一个job一个集群&#xff0c;提交时yarn才分配集群资源&#xff1b; 主要的进程&#xff1a;JobManager、TaskManager、Client 提交命令&#xff1a;bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…

Unity—JSON

每日一句&#xff1a;手简素中&#xff0c;感生活恬淡&#xff0c;心有所期&#xff0c;忙而不茫 目录 服务器 常见的服务器语言 Unity的开发语言 JSON 功能&#xff1a; JSON最简单的格式 JSON工具 支持的数据结构&#xff08;C#对于JSON&#xff09; 字符含义 JSON…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

2023年12月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(共15题,共30分) 第1题 下面有关函数参数的说法,正确的是( )。 A:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。 B:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子…

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…