Docker容器与虚拟化技术:Docker架构、镜像管理

目录

一、理论

1.Doker概述

2.Docker核心概念

3.Docker安装

4.Docker的镜像管理命令

二、实验

1.Docker安装

2.查看Docker信息

3.Docker的镜像管理命令

三、问题

1.如何注册Docker账号

 2.如何设置Docker公共存储库

四、总结


一、理论

1.Doker概述

(1) IT架构

裸金属 → 虚拟机 → 容器→ 函数化、代码化

云计算涌现出很多改变传统IT架构和运维方式的新技术,比如虚拟机、容器、微服务、Serverless(无服务),无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题。

① 运行物理机,也称为裸金属

② 虚拟机VM,可以在一台物理机上创建多个虚拟机,并把物理配置分发成多个虚拟配置

缺点:性能损耗大,大约损耗50%
 

虚拟机常用软件:
VMware workstation(windows)
vm Sphere+ESXI (Windows server)
KVM(linux内核)

③ 容器 (常用软件:docker、podman、rocket、container)

  • 容器内部自身有一个小型操作系统

④ 函数(函数化,代码化)

(2)Docker初始
Docker是一个开源的应用容器引擎,基于go语言开发并遵守了apache2.0协议开源。

Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。

Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。

Docker的Logo:

  • Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
  • 鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker的设计宗旨:

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere

即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
docker是创建容器的工具。应用运行在容器中,每个容器都有一致的运行环境,所以可以在任何主机中运行。即实现“一次封装,到处运行”的目的。

(3)容器的特点

容器化越来越受欢迎,因为容器是:

灵活:即使是最复杂的应用也可以集装箱化。

轻量级:容器利用并共享主机内核。

可互换:可以即时部署更新和升级。

便携式:可以在本地构建,部署到云,并在任何地方运行。

可扩展:可以增加并自动分发容器副本。

可堆叠:可以垂直和即时堆叠服务。

(4)Docker容器与虚拟机的区别

容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用共他任何可执行文件的内存,非常轻量。

虚拟机运行的是一个完整的操作系统,每个虚拟机使用独立的内核,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

 

① docker就相当于宿主机的一个进程,所以损耗微乎其微。

② 虚拟机和操作系统之间是hypervisor,虚拟化管理程序,虚拟化各种硬件资源,这中间就会有资源损耗。

 (5)容器在内核中支持2种重要技术

docker本质就是宿主机的一个进程,docker是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制(限制硬件资源,限制2个容器相互之间抢资源),通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。

linux六大namespace(命名空间):
 

 

2.Docker核心概念

(1)镜像

Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

(2)容器

Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

(3)仓库

Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
 

3.Docker安装

(1)YUM安装Docker

目前 Docker 只能支持 64 位系统。

#关闭防火墙和selinux
 systemctl stop firewalld.service
 setenforce 0
 ​
 #安装依赖包
 yum install -y yum-utils device-mapper-persistent-data lvm2 
 --------------------------------------------------------------------------------------------
 #yum-utils:提供了 yum-config-manager 工具。
 #device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,
 它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
 #device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
 --------------------------------------------------------------------------------------------
 ​
 #设置阿里云镜像源
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
 ​
 #安装 Docker-CE并设置为开机自动启动
 yum install -y docker-ce      #docker-ce-cli、containerd.io 会作为依赖包被安装
 ​
 systemctl start docker.service
 systemctl enable docker.service 

(2) 查看Docker信息

#查看 docker 版本信息
 docker version
 #注意:Yum安装默认安装最新版本,目前最新版本是2020版本。但工作中不会用这么新的版本,前一个版本是2019版本。
 ​
 #docker信息查看
 docker info
 //查看的部分信息如下:
 Client:
  Context:    default
  Debug Mode: false
  Plugins:
   app: Docker App (Docker Inc., v0.9.1-beta3)
   buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
   scan: Docker Scan (Docker Inc., v0.17.0)
 ​
 Server:
  Containers: 0                #容器数量
   Running: 0
   Paused: 0
   Stopped: 0
  Images: 0                    #镜像数量
  Server Version: 20.10.17     #server版本
  Storage Driver: overlay2     #docker使用的是overlay2 文件驱动
   Backing Filesystem: xfs     #宿主机上的底层文件系统
   Supports d_type: true
   Native Overlay Diff: true
   userxattr: false
  Logging Driver: json-file
  Cgroup Driver: cgroupfs      #cgroups 驱动,默认为cgroupfs,也可以修改为systemd
  Cgroup Version: 1
  Plugins:
   Volume: local
   Network: bridge host ipvlan macvlan null overlay
   Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  Swarm: inactive

4.Docker的镜像管理命令

(1) 搜索镜像

 格式:docker search 关键字(镜像名称或仓库名)
 ​
 docker search nginx        #搜索nginx的镜像
 ​
 docker search clearlinux   #搜索指定仓库clearlinux中的镜像

(2) 获取镜像(下载镜像)

 格式:docker pull 镜像名称[:标签]
 #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 的镜像。
 ​
 docker pull nginx   #下载nginx镜像

(3) 镜像加速下载

 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
 ​
 mkdir -p /etc/docker
 tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]   #写入自己的加速器地址
 }
 EOF
 ​
 systemctl daemon-reload      #重新加载
 systemctl restart docker     #重启docker
 ​
 docker info   #查看是否启用了镜像加速

登录阿里云平台,获取加速器地址:

配置镜像加速

(4) 查看本地有哪些镜像

镜像下载后存放在 /var/lib/docker

 #查看下载到本地的所有镜像
 docker images
 REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    89da1fb6dcb9   2 weeks ago   187MB

 ------------------------------------------------------------------------------------
 #注释:
 REPOSITORY:镜像属于的仓库;
 TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
 IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
 CREATED:镜像创建时间;
 VIRTUAL SIZE:镜像大小;
 ------------------------------------------------------------------------------------
 ​
 #镜像下载后存放在 /var/lib/docker 
 #查看下载的镜像文件信息
 cat /var/lib/docker/image/overlay2/repositories.json

(5) 查看镜像的详细信息( 获取容器/镜像的元数据 )

 格式:docker inspect 镜像ID号/容器ID     #根据镜像的唯一标识 ID 号,获取镜像详细信息
 ​
 docker inspect  89da1fb6dcb9 

(6) 为本地的镜像添加新的标签

添加标签后,镜像的ID号并不会改变。

 格式:docker tag 名称:[标签] [仓库名/]名称:[新标签]
 ​
 示例:
 docker tag nginx:latest nginx:web       #为nginx镜像添加web标签
 docker tag nginx:latest 仓库名/nginx:web   #为镜像添加库标识,方便上传到官方仓库,因为上传镜像时必须指定仓库
 docker images | grep nginx

(7) 删除镜像

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

 格式:
 docker rmi 镜像名:标签      #删除指定标签
 docker rmi 镜像ID -f       #删除指定镜像
 ​
 ​
 docker rmi nginx:web          #删除nginx镜像的web标签
 docker rmi ac826143758d       #删除镜像,该镜像只有单个标签的情况下
 docker rmi  89da1fb6dcb9  -f    #删除镜像,镜像有多个标签时需要加-f

(8) 批量删除镜像

 docker images        #查看本地所有镜像
 docker images -q     #查看本地有哪些镜像,只显示镜像ID
 docker rmi $(docker images -q) -f    #批量删除本地所有镜像

(9) 存出镜像:将镜像保存成为本地文件

将镜像保存成为本地文件,实际是将镜像打包成一个tar包。

 格式:docker save -o 存储文件名 存储的镜像
 docker save -o mynginx.tar nginx:latest     #打包镜像命名为mynginx.tar存在当前目录下
 ls -lh

(10) 载入镜像:将镜像文件导入到镜像库中

 格式:
 docker load < 存出的文件
 或者
 docker load -i 存出的文件
 ​
 #主机A通过scp命令将打包好镜像文件传给主机B,主机B将镜像文件导入到docker本地
 scp ~/mynginx.tar 192.168.204.141:/root/
 ​
 #主机B将镜像文件导入到镜像库中 
 docker load < mynginx.tar  或者   docker load -i mynginx.tar 

(11) 上传镜像(将镜像上传到官方仓库)
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号,hub.docker.com 。默认上传到公有仓库,其他人可以下载仓库中的镜像。如果想设置成私有仓库(仅自己可见),不允许其他人下载,需要付费。

可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。docker logout 命令进行登出。

在上传镜像之前,还需要先对本地镜像添加新的标签,在镜像名称前加上仓库名,然后再使用 docker push 命令进行上传。

 docker tag nginx:latest jiajianwei/nginx  #添加新的标签,在镜像名称前加上仓库名,jiajianwei为仓库名称
 ​
 docker login            #登录公共仓库
  Username:  #账号
  password:  #密码
 ​
 docker push jiajianwei/nginx     #上传镜像
 docker search jaijianwei        #搜索jiajianwei仓库中的镜像
 docker pull jiajianwei/nginx     #下载jiajianwei仓库中的镜像

 docker logout                   #登出公共仓库


 

二、实验

1.Docker安装

(1)YUM安装Docker

关闭防火墙和selinux

 安装依赖包

 设置阿里云镜像源

 安装 Docker-CE并设置为开机自动启动

 启动服务

2.查看Docker信息

查看 docker 版本信息

docker信息查看

3.Docker的镜像管理命令

(1)搜索镜像

搜索nginx的镜像,STARS越多,表示使用的人越多

  搜索指定仓库clearlinux中的镜像

 (2)获取镜像(下载镜像)

如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 的镜像。

 (3)镜像加速下载

查询

 配置镜像加速器(添加地址)

 重新加载、重启docker

 查看是否启用了镜像加速

 (4)查看本地有哪些镜像

查看下载到本地的所有镜像

查看下载的镜像文件信息

 (5)查看镜像的详细信息( 获取容器/镜像的元数据 )

 (6)为本地的镜像添加新的标签

添加标签后,镜像的ID号并不会改变。

为nginx镜像添加web标签

(7)删除镜像

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

删除镜像,镜像有多个标签时需要加-f

 

(8) 批量删除镜像

(9) 存出镜像:将镜像保存成为本地文件

将镜像保存成为本地文件,实际是将镜像打包成一个tar包。

(10) 载入镜像:将镜像文件导入到镜像库中

主机A通过scp命令将打包好镜像文件传给主机B,主机B将镜像文件导入到docker本地

 主机B将镜像文件导入到镜像库中

镜像ID和主机A中的一致

(11)上传镜像(将镜像上传到官方仓库)

添加新的标签,在镜像名称前加上仓库名,jiajianwei为仓库名称

 登录公共仓库

 上传镜像

 在自己的仓库中可以看到上传的镜像,默认上传到公共仓库中

私有仓库需要付费

登出公共仓库

 搜索jiajianwei仓库中的镜像

 下载jaijianwei仓库中的镜像

三、问题

1.如何注册Docker账号

(1)注册界面

 https://hub.docker.com

(2)填写完信息,出现人机验证

 (3)点击人机验证

 (4)邮箱验证

 2.如何设置Docker公共存储库

(1)公共存储库

公共存储库可用于托管Docker镜像,可供其他人使用。Docker Hub中提供的镜像就是一个例子。大多数镜像,如Centos,Ubuntu和Jenkins都可以公开提供给所有人。我们还可以通过将其发布到Docker Hub上的公共存储库中,使镜像可用。

(2)选择命名空间Namespace、创建存储库  Repository Name

 (3) 创建成功

四、总结

Docker是创建容器的工具。应用运行在容器中,每个容器都有一致的运行环境,所以可以在任何主机中运行。即实现“一次封装,到处运行”的目的。

Docker是基于go语言开发的开源容器引擎,可以在任何主机上运行容器应用,并且每个容器都是一个轻量级的虚拟机。实现“一次封装,到处运行”的目的。

Docker的三大核心概念:镜像、容器、仓库

镜像管理命令:

命令	                        作用
docker search         <仓库/镜像名>	搜索镜像
docker pull           <仓库/镜像名>	下载镜像
docker images	      查看本地的所有镜像
docker images -q	  只显示本地所有镜像的ID号
docker inspect        <镜像ID/容器ID>	查看镜像的详细信息( 获取镜像/容器的元数据 )
docker tag            名称:[标签] [仓库名/]名称:[新标签]	为本地的镜像添加新的标签docker rmi < 镜像名称:标签>
docker rmi            <镜像ID> -f	删除指定镜像
docker rmi $(docker images -q)	删除本地所有镜像
docker save -o        镜像文件.tar 镜像名称:标签	存出镜像:将镜像保存为本地文件
docker load -i[或<]   镜像文件	载入镜像:将镜像文件导入到镜像库中
docker login	      登录公共仓库docker hub
docker push           仓库名/镜像名:标签	上传镜像(将镜像上传到官方仓库)docker logout

镜像加速


mkdir -p /etc/docker

vim /etc/docker/daemon.json

镜像下载后存放位置

/var/lib/docker

查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

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

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

相关文章

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金

近日&#xff0c;在日本千叶县举办的2023年第64届国际数学奥林匹克&#xff08;IMO&#xff09;竞赛公布比赛结果&#xff0c;中国队连续5年获得团体第一。奖牌榜显示&#xff0c;代表中国参赛的6名队员全部获得金牌。其中&#xff0c;猿辅导学员王淳稷、孙启傲分别以42分、39分…

LLaMA长度外推高性价比trick:线性插值法及相关改进源码阅读及相关记录

前言 最近&#xff0c;开源了可商用的llama2&#xff0c;支持长度相比llama1的1024&#xff0c;拓展到了4096长度&#xff0c;然而&#xff0c;相比GPT-4、Claude-2等支持的长度&#xff0c;llama的长度外推显得尤为重要&#xff0c;本文记录了三种网络开源的RoPE改进方式及相…

ArcGIS Pro 基础安装与配置介绍

ArcGIS Pro ArcGIS Pro作为ESRI面向新时代的GIS产品&#xff0c;它在原有的ArcGIS平台上继承了传统桌面软件&#xff08;ArcMap&#xff09;的强大的数据管理、制图、空间分析等能力&#xff0c;还具有其独有的特色功能&#xff0c;例如二三维融合、大数据、矢量切片制作及发布…

用vim打开后中文乱码怎么办

Vim中打开文件乱码主要是文件编码问题。用户可以参考如下解决方法。 1、用vim打开.vimrc配置文件 vim ~/.vimrc**注意&#xff1a;**如果用户根目录下没有.vimrc文件就把/etc/vim/vimrc文件复制过来直接用 cp /etc/vim/vimrc ~/.vimrc2、在.vimrc中加入如下内容 set termen…

树莓派3B CSI摄像头配置

1.硬件连接 1、找到 CSI 接口(树莓派3B的CSI接口在HDMI接口和音频口中间)&#xff0c;需要拉起 CSI 接口挡板,如下&#xff1a; 2、将摄像头排线插入CSI接口。记住&#xff0c;有蓝色胶带的一面应该面向音频口或者网卡方向&#xff0c; 确认方向并插紧排线&#xff0c;将挡板…

app专项测试:app弱网测试

目录 弱网测试背景 网络测试要点 弱网测试关注指标 弱网测试工具 fiddler模拟网络延时场景 网络设置参考 Network Emulator Toolkit模拟网络丢包场景&#xff08;windows网络&#xff09; APP弱网测试 弱网使用工具&#xff1a; app弱网测试要点 APP网络测试要点 网络…

Mysql 搭建MHA高可用架构,实现自动failover,完成主从切换

目录 自动failover MHA&#xff1a; MHA 服务 项目&#xff1a;搭建Mysql主从复制、MHA高可用架构 实验项目IP地址配置&#xff1a; MHA下载地址 项目步骤&#xff1a; 一、修改主机名 二、编写一键安装mha node脚本和一键安装mha mangaer脚本&#xff0c;并执行安装…

网络安全 Day31-运维安全项目-容器架构下

容器架构下 6. Dockerfile6.1 Docker自动化DIY镜像之Dockerfile1) 环境准备2) 书写Dockerfile内容3&#xff09; 运行Dockerfile生成镜像4) 运行容器5) 小结 6.2 案例14&#xff1a;Dockerfile-RUN指令1) 书写Dockerfile2) 构建镜像3) 启动容器4) 测试结果 6.3 Dockerfile指令 …

小程序制作教程:从零开始搭建企业小程序

在如今的数字化时代&#xff0c;企业介绍小程序成为了企业展示与推广的重要工具。通过企业介绍小程序&#xff0c;企业可以向用户展示自己的品牌形象、产品服务以及企业文化等内容&#xff0c;进而提高用户对企业的认知度和信任度。本文将介绍如何从零开始搭建一个企业介绍小程…

【Vue-Router】命名视图

命名视图 同时 (同级) 展示多个视图&#xff0c;而不是嵌套展示&#xff0c;例如创建一个布局&#xff0c;有 sidebar (侧导航) 和 main (主内容) 两个视图&#xff0c;这个时候命名视图就派上用场了。 可以在界面中拥有多个单独命名的视图&#xff0c;而不是只有一个单独的出…

LeetCode150道面试经典题--最后一个单词的长度(简单)

1.题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 2.示例 3.思路 通过对字符串的反转&#xff0c;转为数组开始遍历&#xff0c…

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员&#xff0c;我们经常面临需要爬取大量数据的任务。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#xff0c;这就需要我们使用隧道爬虫ip来绕过这些限制&#xff0c;提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…

UML之四种事物

目录 结构事物 行为事物 分组事物&#xff1a; 注释事物 结构事物 1.类(Class) -类是对一组具有相同属性、方法、关系和语义的对象的描述。一个类实现一个或多个接口 2.接口(interface) -接口描述 了一个类或构件的一个服务的操作集。接口仅仅是定义了一组操作的规范&…

每日后端面试5题 第三天

1. 线程有哪几种状态以及各种状态之间的转换&#xff1f;(必会) 看图&#xff1a; 图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客 图片来自 总算把线程六种状态的转换说清楚了&#xff01; - 知乎 线程一共有4种状态&#xff0c;分别是&#xff1a; 1.…

【日常积累】RPM包依赖下载及私有yum仓库搭建

概述 某些时候&#xff0c;我们需要下载某个RPM包依赖的依赖。如某些内网环境&#xff0c;就需要自行准备rpm包。可以通过能上互联网的服务器进行相应的rpm包下载&#xff0c;然后在拷贝到相应的服务器安装&#xff0c;或者搭建自己的内容rpm包仓库。 查看*.rpm 包依赖&#…

分布式系统监控zabbix安装部署以及使用

文章目录 分布式系统监控zabbix安装部署及使用一.zabbix监控1.什么是zabbix2.zabbix功能3.zabbix的构成4.zabbix的3种架构4.1 C/S架构4.2 分布式架构&#xff1a;zabbix-proxy-client架构4.3 master-node-client架构 5.zabbix工作原理及数据流向6.zabbix监控模式 二.zabbix部署…

41、可靠传输——停等ARQ

前面两节内容我们学习了传输层的基本概况的一些知识&#xff0c;包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议&#xff0c;以及端口号、套接字等一些基本的概念。从这一节开始&#xff0c;我们将开启两大协议中TCP协议的学习。 但是&#xff0c;经过之前的学习&am…

Kotlin语法

整理关键语法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量&#xff0c;优先 var定义可变变量…

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式&#xff1f; 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符&#xff1a; 大小写字母…

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;ku…