JFrog容器注册:城里有一个新的容器注册
DevOps领域的新成员是新的社区工具,JFrog容器注册表!了解有关市场上最新的容器注册表的演示和讨论,了解它如何与您现有的工具栈集成,以及如何入门。想要使用JFrog容器注册表进行试驾吗?
免费试用在这里
会议议程:
- 什么是JFrog容器注册表?
- JFrog容器注册表是如何不同的元数据,元数据,元数据安全?
- 是的!JFrog容器注册表与安全的JFrog x射线多注册表,一个无缝的推广
- 演示
- 常见问题
会议记录
今天的主题显然是JFrog容器注册。
所以,这是我们今天的议程。我们将要讨论,什么是JFrog容器注册表?为什么需要JFrog容器注册表?我们将讨论容器寄存器支持哪些技术。它支持什么类型的存储库。我们将讨论多存储库提升,这是一个非常非常重要的方面。我们将讨论元数据的重要性。我们将讨论构建集成和JFrog CLI。关于人工查询语言。关于安全。 I’m going to show you a demo. And we are going to talk a little bit about how JFrog Container Registry stack against competition. And then, we will have time for questions.
那就是我。我叫Baruch Sadogursky。我是JFrog的DevOps倡导负责人。但我们可以在推特上继续我们的对话。我的标签是,抱歉,我的推特账号是@jbaruch。
所以,JFrog容器注册表。首先也是最重要的是,您需要知道JFrog容器注册表是基于JFrog Artifactory的。所以它是JFrog Artifactory在引擎盖下,这意味着你得到同样的质量。你有10年管理二进制文件的经验。你已经证明了惊人的可扩展性。所有这些都是内置的,在JFrog Artifactory和JFrog Container Registry中。
它支持容器生态系统的两种主要技术,即容器镜像,即Docker和Helm存储库。我们加入的另一个非常重要的特性,我们会看到它有多有用,是对泛型存储库的支持,泛型…抱歉,泛型存储库基本上意味着你可以用它做任何你喜欢的事情,做任何需要的工作。
它的目的是让团队开始进行工件管理和容器化。显然,它是完全可操作的,你可以将它用于你的团队的任何状态。但主要目的是在开始时寻找一个容器注册表,这是一个很好的免费选择。这是混合动力车。这意味着您可以在本地使用它,也可以在云中使用它。这取决于你。你可以把两者结合起来。如果您需要安装多个容器注册表,您可以在云中组合,在本地进行设置,这就是混合的含义。
下一个问题是为什么JFrog容器注册表比其他所有的?首先,它是免费的。你可以下载,也可以使用。用户数量、服务器数量、硬件数量以及其他任何东西基本上都没有限制。它是完全免费的,没有任何限制。
它简化了流……它适合不需要管理中间二进制文件的简单流。因此,如果您只使用生成的映像中的版本,如果您不需要保存和管理中间二进制文件,那么JFrog Container Registry将完全覆盖您的场景。
这对于没有工件复制需求的位于同一位置的团队来说是很好的。所以,如果你有一个组织在当地的一个地方工作,这是很好的。如果你不需要任何复杂的分布情况,诸如此类的东西。基本上,如果您只需要容器注册表本身,我们相信JFrog容器注册表实际上是您的最佳选择。而且,正如我已经提到的,它是免费的。
正如我提到的,它支持Docker Registry。很快我们就会完全支持容器注册表规范[听不清00:05:09],现在它完全支持Docker。所以,这是开箱即用的。它还支持Helm,正如它在Helm 2和Helm 3中定义的那样,在没有容器注册表扩展的情况下构建Helm图表存储库,即Helm存储库。而且,正如我提到的,它支持通用存储库。通用存储库对于管理其他类型的工件非常有用。
对于存储库类型,它支持本地存储库。我们所说的本地存储库是指你部署自己的Docker映像和Helm图表的地方。这就像是Artifactory本身的物理存储。
远程存储库。远程存储库是远程注册中心和存储库的代理。所以,你可以代理Docker Hub,你可以代理世界上任何其他Docker注册表,Artifactory将很容易地存储来自JFrog容器注册表的工件……抱歉,JFrog容器注册表将很容易存储来自JFrog容器注册表的映像。因此,您通过这个远程存储库解决的所有问题都将被保存并保存在那里。您将在演示过程中看到它是如何工作的。很明显,这让你的生活更轻松,在解决时间方面,你也可以防止中断,等等。
存储库的第三部分是虚拟存储库。虚拟存储库对于提供单个URL、多个注册中心的单个注册中心视图或其背后的存储库非常有用。因此,您可以定义任意数量的不同注册中心(本地、远程或虚拟)。然后,你可以有一个虚拟注册表,它会给Docker一个URL来连接。再说一次,这是非常重要和独特的。其中三个的组合在不同的容器注册表中是独一无二的。你们会再次看到,在你们将要看到的演示中它们每一个的重要性。
多存储库设置带来的另一个非常重要的特性是多存储库提升。在如何跨Docker映像构建推广方面存在权衡。你可以提升Docker文件,然后从头开始重建。显然,这是非常危险的,因为您最终得到的Docker容器可能与您在生产环境中想要的容器不同。另一个选择是安装多个注册器。那么,如何在这些多个注册中心之间进行推广呢?通常你需要做一些像pull, retag, push这样的事情,而Docker的镜像又大又慢,这是行不通的。
有了JFrog容器注册表,所有这些问题都解决了,因为你实际上从相同的后端,从相同的存储中设置了多个注册表。它看起来像Docker的不同注册表,它提供了严格的安全性和质量门槛。促销实际上是免费的。实际上是即时的,甚至不是快速的,而是即时的,因为这些文件不仅不需要从网络上下载和上传它们不需要从网络上下载和上传它们不需要从网络上下载和上传。它们甚至不会在本地文件系统中移动,因为文件系统保持不变。所以,你得到了拥有多个注册表的所有好处,严格的大门,但没有任何成本,而且推广实际上是免费的。同样,我们也会在演示中讲到这个。
元数据。JFrog Container Registry在元数据方面很出色,显然,由于元数据的工作,JFrog Container Registry继承了这一点。存在的所有三种类型的元数据。隐式元数据,如文件名称或Docker映像。层的路径,校验和,大小,这些信息。显式元数据,例如,它是如何创建的,构建名称是什么,构建号是什么?以及任何您想要添加的自定义元数据,例如QA状态、目标架构或任何其他类型的元数据都是可用的。然后,一旦你有了这个元数据,你就可以通过构建集成,JFrog CLI, REST API和矩阵参数,甚至UI来设置它。显然,你可能不会通过UI来实现,但这也是存在的。
然后,当你消费元数据时,你可以通过矩阵参数过滤来消费它。因此,您可以构造一个查询,该查询只引用处于特定状态或特定成熟度的图像。显然,另一个选择是使用JFrog CLI。这也是一种很好的方法,但您甚至可以使用REST API来实现。另一个非常非常强大的选择是使用人工查询语言。给你们一个例子Artifactory Query Language是什么样子的,这是一个JSON查询,你可以看到它是如何查询来自某个build的特定文件和build号。你可以想象它是如何与其他元数据一起工作的。例如,你可以查询一个下载的文件,或者文件的数量,或者是由某个用户创建的,或者有一些目标架构,或者,显然,这些的任意组合。
容器注册表的另一个非常重要的方面是安全映像扫描。你需要它来防止下一次心脏流血[听不清00:12:37]有两个方面。首先是控制。很明显,这是内建的,有一个通用的存储库给你提供了更多的控制,因为它允许你不仅控制你的图像,还控制你的依赖。我将向您展示一个示例,如何确保您拉入Docker映像的内容也在您的控制之下。
实际上,JFrog容器注册表为您提供来自JFrog x射线的信息,这是JFrog的安全工具,具有世界上最好的安全可再生数据库[听不清00:13:32]安全性。你的JFrog容器注册表将能够显示来自这个来源的Docker镜像上的漏洞,来自[听不清00:13:46]。马上就要来了。我有一个demo的预览。但是,在一天结束的时候,你也会得到它,你会免费得到它。
好了,让我们开始演示。所以,我想给你看的是,假设我有一个Docker映像,它行为不正常,我需要排除它的故障,有些东西不工作。问题是我对Docker的形象了解不多。这个名字是最新的,它对我没有什么帮助。我不知道发生了什么。我能做的就是在这个图像上运行docker inspect,看看它能不能给我更多的信息。
我在这里看到了什么?我看到的层,是一堆校验和,然后是更多的校验和,然后是一些标志。这些是环境变量,都是Java。其实没什么用。这里唯一有用的信息是该图像的sha256。我要取它,我要去JFrog容器注册表。看看能不能打听到什么信息。这里有一个校验和搜索,我可以使用它,我可以看到发生了什么。这一层,实际上是一堆Docker图像。所以我有最新的,但我也知道相同的图像实际上是一堆其他的。 So, for example, 21 and 19, 23 and 26. It was rebuilt multiple times. And this actually is already very, very important information from which I know what’s going on.
所以,我可以去任何一个。比如第26页。我可以看到,我的Docker图像发生了什么。我可以看到这里,Docker信息,我可以看到每一层,每一张幻灯片上实际发生了什么。我也可以在不同的视图中得到相同的信息。有一个包视图可以显示所有的包。这是我的JFrog Docker应用,这里是最新的,这是我的版本号,还有26,这是真正的版本号。这里,我可以看到这些层,我可以看到发生了什么。
所以,回头看看我们在看什么。我们看到的Docker图像在这里。它位于一个名为docker-prod-local的存储库中。Docker-prod-local26,这就是我们要找的。现在,让我们看看我们是如何得到它的。我们可以看元数据,这里的属性并看到一些有用的东西,比如build name, build number,还有build URL。Build URL,这是一个到创建Docker镜像的CI服务器的链接。我们去看看吧。
我们使用的CI服务器是不同的管道,那是JFrog的CI和CD2预览版,但我认识的人认识的人给了我访问权限,所以我可以给你们展示它的样子。但我们真正感兴趣的是看到这条管道。让我们看看它,并试着理解发生了什么,以及这个Docker图像是如何结束的。
因此,我们可以看到一些步骤。第一个是buildDockerApp。我们可以看到,我们是怎么做的。我们只需要运行DockerBuild,然后构建我们的镜像。没什么有趣的。pushDockerApp。这是更有趣的一步。你可以看到我们在这里执行DockerPush,我们可以将DockerPush形成一个存储库,形成一个注册表,就在这里,叫做docker。它叫做docker。这个码头是什么? docker, if we look at the list of our repositories is this one. This repository is a Docker registry and it’s called docker. And it’s actually where our CI actually pushed our image. And what we can see here, that we have a list of included repositories. That means that docker is a virtual repository. So, if you are going to list of virtual repositories, we can see our docker registry right here. That’s our repository and that’s our registry. And you can see here that it includes four other Docker repositories, Docker registries, docker-prod-local, docker-dev-local, and then docker-remote and bintray-docker-remote, two local store remotes.
现在,虚拟意味着它实际上在单个URL下隐藏了多个注册表。当管道将图像推送到这个注册表时,问题是这四个图像中,它到底去了哪里?为此,我们在这里有一个设置,它是默认的部署存储库。默认部署存储库,这是被推入该存储库的文件的最终位置。我们可以看到,它们最终会出现在docker-dev-local中。
现在,回到存储库列表,这是我们的docker-dev-local。我们可以看到它很空。这里只有一个,26不在这里,local不在这里。问题是,到底发生了什么?为什么不在这里?因为,正如你们所记得的,我们看到它在这里推,推是成功的。答案是在这个管道中还有两个额外的步骤。下一个是publishBuildInfo。publishBuildInfo是关于这个构建的元数据的发布。因此,如果我们可以转到Docker注册表,我们将看到CI服务器创建的构建实际上被记录在JFrog容器注册表的构建浏览器中。
你可以在这里看到,我们有demo_kubecon构建,这里有很多构建。你可以看到它们是如何注册的。你可以看到哪些模块发布了,哪些环境变量可用。例如,我们可以看到我们使用了哪个版本的Java。我想是的。这里还有什么。所有这些信息实际上都是作为一个JSON文件推送的,这就是publishBuildInfo步骤所做的。
下一步是推广构建。提升构建是在我们运行测试之后。这里没有测试,但在您的环境中,显然会有测试。您可以仅使用REST API,或者使用JFrog CLI,或者使用CI服务器的本地功能,将这个构建从docker-dev-local提升到docker-prod-local。这是一个使用REST API的例子,我们只使用curl。
你可以在这里看到我们运行的是推广,我们从docker-dev-local推广到docker-prod-local,我们推广我们的构建。这就是为什么当我们查看容器注册表时,我们实际上会看到我们的映像不在docker-dev-local中,而是在docker-prod-local中。这是26号。
为什么这很重要?这一点很重要,因为从Docker客户端的角度来看,Artifactory中的每个Docker存储库,比如Docker -dev-local或Docker -prod-local实际上是一个完整的Docker注册表。如果您在Artifactory中构建了将文件从一个存储库移动到另一个存储库的提升管道,那么您将从Docker客户端的角度构建这些质量和安全闸门。因此,例如,使用这种提升,您可以保证运行时环境在提升到生产环境之前甚至不会看到任何内容,因为它只会看到Docker -prod-local作为Docker注册表。在映像最终出现在docker-prod-local中之前,您的生产环境甚至无法看到它们。移动它们只需要一个CPI的问题,这很简单,可以移动它们。
这里还有两个REST api。所以,我们先看看它们。这个其实也做了一些很有趣的事情。你可以看到,这是对相同推广API的调用。但这一次,它实际上将映像保存在从docker-prod-local到docker-prod-local的同一个存储库中,但它将映像从构建号重命名为最新版本,并进行复制。这就是为什么我们在这里,同样的图像下面有两个不同的[听不清00:24:28]。这是26号,最新的是它们实际上指的是同一张图片。这是非常强大的,因为虽然我们都知道最新的问题,最新的可能不是指最新的,有能力使用最新的实际上是非常方便的,因为你只需要做docker拉,你会得到一个,这是最新的时刻。我们如何确保最新的是指目前最新的?和你看到的一模一样。 We are going to retag every new build as latest.
但是现在,又有一个问题,怎么知道最新指的是什么?我们提供这些信息作为额外的元数据,就像我告诉过你们的,我们谈到的自定义元数据。这里有一个例子说明我们是如何做到的。我们添加了一些属性,这个属性叫做docker。我把它放在最新的版本上,我把build号放在这里。你可以看到,如果我看最新的,看它的属性,我可以看到这里有一个条目,docker。指的是26,这就是我如何知道它实际上指的是26号图像。我知道最新的是这个。这显然是非常非常强大的。
好了,现在,在展示了它是如何工作的之后,让我们看一下创建它的Docker文件。所以,你可以看到,它在哪里?我可以在GitHub上给你们看。这是Docker文件,它是Docker -app。你可以看看Docker文件。这就是它的全部功能。它基本上获取一些WAR文件并将其添加到Docker映像中。然后,我们就可以开始了。
现在,这里有趣的部分是来源。Docker镜像是我们镜像的一个基本依赖,它也是一个来自JFrog Container Registry的镜像。这张图片叫做JFrog Docker Framework。你可以很明显地在这里看到。这就是jfrog-docker-framework,我们依赖于第5个。这是经过检验并证明可靠的最新版本。这个JFrog -docker-框架也是使用JFrog管道构建的。也经历了同样的升职之类的事情。
如果你看这里可用的管道,我们可以看到这里我们有buildDockerFramework。最后一个是,我们看看,这是Docker App,我们找到第5个。好了,开始吧。buildDockerFramework。这就是我们要讲的第5个框架。你可以在这里看到它是怎么建立的,然后它被推动,然后它被推广,非常相似。这里我想给你们展示的是如何从另一个创建。好的,这已经是复制了。
我想告诉你们依赖关系是从哪里来的。这里,artifactory_configure, docker_login。好吧。我看不见它。获取管道。好了,这就是我们建造容器的地方。这里,所有这些文件、tomcat和JDK都来自JFrog容器行业。它们来自我们拥有的通用存储库。这里我们有一个泛型文件,其中包含框架所需的依赖项。因此,您可以在这里看到我们使用的Java JDK和我们使用的Apache Tomcat。 And they also come from JFrog Container Registry, they also come from a controlled resource. This is how you can guarantee that you don’t download a bunch of unknown files from unknown resources over the internet. But instead, you have everything controlled in one repository.
说到控制以及如何控制一切,你可以看到它与安全部分的集成。如果我们回头看看我们的docker-prod-local和我们的应用程序,我们可以在这里看到。抱歉,[听不清00:30:23]。你可以在这里看到一个x光标签。这是与JFrog Xray集成的预览。你可以看到这里有很多漏洞。您可以单击其中任何一个,并查看有关错误的所有信息。所以,你可以在这里看到我们在Tar中有漏洞。这个漏洞就在这一层。这一层在Docker图像中。然后,你可以看到组件,摘要,描述。 And comes from us information about the CVE, the CVE it contains, and then all the information you need in order to see, and understand what’s the issue with this image. And, obviously, you will see all the vulnerabilities for all those files.
概括一下,JFrog容器注册表,你可以在本地免费安装它,你可以在任何主要的云提供商,亚马逊网络服务,谷歌云平台和微软Azure的免费层下免费获取它。这些都是免费的。您可以在JFrog Container Registry中创建无限数量的注册中心,它们要么是本地的,要么是您部署的映像的存储。或者作为远程存储库代理的远程服务器。我没给你看遥控器。Docker -remote,您可以在这里看到它实际上从Docker Hub缓存了三个不同的映像。这是我们用来做底图的。它们也会被缓存,你在那里也有控制权。或者虚拟的,它允许你定义一个统一的URL,或者为多个Docker存储库定义统一的视图,这意味着Docker注册表在下面。然后,一旦你这样做了,你就可以建立从一个注册表到另一个注册表的促销,这是即时和免费的。
很明显,元数据的重要性。你看到了Docker image上的属性是如何给你任何关于它的信息的。您可以在这里添加自定义属性,然后使用REST API或人工查询语言查询它们。Docker和Helm都是一样的。你可以在这里看到我们有一个Helm包,Artifactory JFrog Container Registry在这里。这是一个Helm存储库,你可以看到所有的图表并深入到任何图表中查看任何细节。
好了,让我们回到幻灯片上来谈谈竞争。所以,在竞争中你可以看到JFrog是如何与众不同的。这和我给你们看的演示有关。所以,我谈到了它是如何混合的。它在本地和云端,支持Docker Registry, Helm Repository,通用存储库,远程和虚拟,以及对元数据的支持。如果你将它与亚马逊ECR进行比较,很明显,它是在AWS的云中。它们有一些本地功能,但非常有限。它基本上只支持Docker Registry。您可以在图像上应用某种元数据,但没有什么比JFrog CLI或附带的人工查询语言更强大。
谷歌容器注册表,完全相同。它在云端,仅此而已。它只支持Docker,除此之外什么都不支持。Azure Container Registry也一样,它支持Helm存储库,但仅此而已。其他的几乎都不存在。GitLab容器注册表。它们既在本地,也在云端,所以它们是混合的。但是,同样,它们只支持Docker,而不支持其他任何选项。港湾拥有最先进的设备。安装在本地,但没有任何好的云解决方案。 It supports Docker. It supports Helm. There is some kind of remote repositories, but they are not integrated. And they are no promotion. Obviously no virtual repositories. And the metadata capabilities are very limited and nothing that can compare to Artifactory Query Language. So, I hope I convinced you that JFrog Container Registry is the best container registry out there at the moment.
说到这里,我们有大约10分钟的时间来回答你们的问题。所以现在是问他们的好时机,如果你还没有问的话。哇,有很多问题。这太棒了。那么,让我们开始解决这些问题吧。
好的,第一个问题是,“JFrog容器注册表和人工开源之间的关系?”所以,我想说这些是JFrog Artifactory的不同版本,它们支持的技术子集不同,而JFrog Artifactory的完整版本支持这些技术子集。开放源码版本支持、Java存储库和通用存储库。JFrog容器注册表支持Docker、Helm和generic。显然,没有办法将它们结合起来。如果您需要全面的支持,我建议您使用JFrog Artifactory。如果您仍然在寻找免费的解决方案,那么您很可能安装其中的两个。这样做没有许可证限制。我个人认为,管理越来越多工具的麻烦,在某个时间点上,将比仅仅拥有一个支持所有工具的Artifactory实例更昂贵。我希望这能说得通。
另一个问题是,“我可以代理需要许可证认证才能访问的Docker容器注册表吗?”答案是肯定的。在设置远程存储库时,有一种方法可以提供身份验证。这就是你如何连接到其他容器注册,这需要认证[听不清00:38:14]。
另一个问题。“上次我看到推广Docker映像[听不清00:38:24]存储库需要API调用,这对[听不清00:38:27]来说很好,但一个小项目可能需要手动过程。UI中有按钮吗?”UI中没有按钮。这是一个API调用。对于不想处理curl上所有这些标志的小型团队,我的建议是编写一行带有两个参数的shell脚本,从而简化工作。UI中没有按钮。据我所知,这并不是事先计划好的。
“我没听错吧,Xray将免费提供给JFrog Container Registry?”是的,你说了。你没听错。来自Xray的信息将在JFrog容器注册表中免费提供。您将有一个视图,允许您从JFrog x射线的JFrog容器注册表中查看图像上的所有漏洞,是的。很高兴,这太令人兴奋了。这对我们来说也是令人兴奋的。
“请展示如何使用Docker构建通用代表”啊,好的。我想我理解这个问题了。问题是,“我如何在构建信息中提供关于我所做的事情的信息?”我怎样才能提供……“对不起”,我用我的通用回购做什么?我如何在构建信息中提供这些信息?”为此,我将再次分享我的屏幕,因为我想告诉你们在文档中哪里可以找到它。这非常非常简单和直接。
因此,如果您只是谷歌for JFrog CLI,您将能够找到文档。在JFrog CLI Core Artifactory中,您将看到所有构建集成部分。所以,你可以在这里看到,例如,[听不清00:40:53]文件规格。你可以在这里看到,你如何提供一个文件规范,它是一组文件。然后,您可以将构建名称和构建号添加到用于下载和上传这些文件规范的命令中。然后,这些文件将作为依赖项或工件记录在构建信息中。下载的文件将成为依赖项。您上传的文件将成为工件。这就是它的工作原理。
所以,基本上,当你运行命令,比如,让我快速找到它,下载文件和上传文件。这里,上传文件。因此,当您运行一个上传命令时,您可以提供一个文件规格,然后是构建名称和构建号。这样做之后,您下载的那些文件将成为构建的依赖项。所以,我希望这能有所帮助。
“数据是如何存储的?我们正在寻找一种跨地区共享注册表的方法,我们可以与JFrog合作吗?”因此,JFrog Artifactory有许多不同的数据提供程序,范围从本地文件系统到NFS,一直到S3数据提供程序。它们在不同的订阅中是不同的。JFrog Container Registry提供了一个本地文件存储,这意味着文件将保存在本地磁盘上。
如果您需要更多可伸缩的解决方案,比如一直到S3,那么考虑不同的订阅、JFrog Artifactory的不同许可(如Pro和Enterprise甚至Enterprise+)可能是有意义的。此外,为您提供跨区域共享注册表的是复制,这在Artifactory Pro、Enterprise和Enterprise+中也可用。复制将使您可以在JFrog Artifactory的其他实例中使用Docker映像。目前,它们被推到JFrog Artifactory的本地实例中。
“您可以在映像推送后或仅在构建时向其添加元数据吗?”显然,我们可以随时添加元数据。我们在管道中看到的是一个独立的步骤。所以,这与构建无关。我们首先建造了它。然后,我们添加了元数据,但这要晚得多。我们希望在推送过程中添加一些元数据,这些元数据将是构建过程中的构建名称、构建号和环境变量。所有这些信息,都与构建本身相关,但我们可以很容易地添加越来越多的元数据,实际上是在任何时间点。
另一个问题是免费对云业务模式意味着什么。这意味着我们有一个免费的层,就像云中的任何其他容器寄存器提供商一样。您可以在一定的存储和流量限制下免费使用它。所以,答案是肯定的,即使在云端也是免费的。
另一个问题是,“如果我已经在使用Artifactory,我是否需要使用JFrog容器注册表?”这是什么关系?”所以,好消息是,如果您已经在使用Artifactory,除非它是其他免费版本,如开源版本,或Conan版本,社区版本,完整的JFrog Artifactory已经包含了JFrog容器注册表的所有功能。所以,你不需要做任何事情。您已经将JFrog容器注册表内建到任何JFrog Artifactory Docker Artifactory实例中。
我想差不多就这些了。如果你们还有其他问题,我可能还有几分钟。如果没有,非常感谢你们的到来。我希望这个网络研讨会对你有用。请继续使用JFrog容器注册表,我们将非常高兴,如果你只是抓取它,安装它,开始使用它。不要问任何问题。这是我们送给您的免费和无限制的使用。
好了,说到这里,非常感谢。
