docker入门(docker入门视频)
本篇文章给大家谈谈docker入门,以及docker入门视频对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Docker从入门到精通之Docker Compose
- 2、docker 入门(二):docker 和 沙盒、虚拟机以及 Kubernetes 的关系
- 3、Docker 基础入门
- 4、超值一篇分享,Docker:从入门到实战过程全记录
- 5、Docker部署Rstudio Server【一】:Docker入门
- 6、Docker 入门 (01) CenterOS 配置 docker
Docker从入门到精通之Docker Compose
Compose是一个用缓返于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需一个命令,就可以从配置中创建并启动所有服务。
用python构建一个简易网页统计网页点击量,docker-compose进行发布
Step1:创建项目
Step2:创建Dockerfile文件
Step3:在docker-compose.yml中定义services
Step4:用Docker compose构建和运行app
Step5:绑定一个数据卷
将当前目录与容器的/code目录绑定,这样可以动态修改代码
Step6:重新构建和运行app
先docker-compose down停止服务,在构建
用YAML文件定义服务,默认文件是docker-compose.yml,包含4个顶级key,version、services、networks、volumes
参胡哪猜考compose-spec/spec.md at master · compose-spec/compose-spec · GitHub
指定本 yml 依从的 compose版本
定义多个应用服务,包含环境配置、镜像构建等
指定构建镜像的路径
定义服务的block IO配置,参考compose-spec/spec.md at master · compose-spec/compose-spec · GitHub
指定自定义容器名称
定义服务间启动或关闭的依赖关系
覆盖容器启动的默认命令
domainname declares a custom domain name to use for the service container.
覆盖容器默认的entrypoint
从文件中添加环境变量到容器,可以是一个或多个文件
文件格式:
添加环境变量
暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口
用于检测 docker 服务是否 健康 运行。
指定容器运行的镜像
设置容器标签
连接到另一个容器的网络,简单将就是让容器相互连通
服务的日志记录配置,driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
设置网络模式,格式如下:
配置容器连接的网络
指定ip地址
端口映射,映射主机与容器端口,格式:Host:ontainer
容器裤型重启策略
存储敏感数据,比如密码
将主机数据卷挂载到容器
覆盖容器工作目录
[img]docker 入门(二):docker 和 沙盒、虚拟机以及 Kubernetes 的关系
做开发的基本都听说过沙盒 (Sandbox) 和虚拟机 (Virtual Machine,简称 VM) ,如今容器技术很火,其中以 docker 最受大家欢迎。作为一种集群管理工具,K8s 最近也是火的不要不要的。 我们经常会讲 docker 和 K8s 联系起来,那么两者之间又存在什么关联呢?
首先 Sandbox 和 VM 都是属于 虚拟技术 ,用来虚拟软件运行环境并具有资源隔离的功能。Sandbox 比较“轻”(只需要虚拟出一个小的环境)且一旦退出就释放之前占用的资源;VM 则比较重(虚拟出整个操作系统,相当于子电脑)。关于 Sandbox 和 VM 的区别可以参考博客: 。
容器是属于 Sandbox 的一种。 顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。 容器技术的核心功能 ,就是通过 约束和修改进程的动态表现 ,从而为其 创造出一个“边界” 。正是因为这个边界才会让容器里面的程序看不到宿主机上其他的程序从而给程序一种它就是在一个独立的操作系统上的假象。容器具有如下几个优点:
Docker 是一种 轻量级的虚拟化 技术,即容器技术。随着 Docker 的开源,docker 凭借其“轻”的特点得到迅速的普及。
这三个优点恰是 VM 的缺点。
Docker 原意是指处理码头集装箱的工人。 首先需要注意的是, Docker 本身不是容拦尘雀器 ,而是一个 开源的应用容器引擎 。Docker 让开发者可以以统一的方式 打包 他们的 应用以及依赖包 到一个 可移植的容器 中,然后 发布 到任何 安装了docker引擎的服务器上 (包括流行的Linux机器、windows机器),也可以实现虚拟化。兄州从这个描述可以看出 Docker 的几种常用任务:
Docker 的两句口号很准确地描述了其功能:
1. Build, ship and run
顾名思义,创建、运输和运行。
举个例子来理解:比如说我在 A 地建好了一个厂区,该厂区主要的是车间,其次还有一些配套的生活设施(比如食堂、超市、宿舍、水电等)。现在我要将厂迁到 B 地,按照常规思路就是把 A 地的车间拆了运到 B 地重新组装、并在 B 地建好配套的生活设施,工程量明显很大。假设现在有一种魔法能够在A地将车间及其配套的生活设施 复制一份并打包成一个镜像 image(文件) ,然后将该镜像迁移到 B 地,这样在B地马上就能够投入使用,省去了拆机、重装以及搭建配套生活设施的工作,非常方便快捷。
现在我们将 车间类比成一个application ,将 配套的生活设施类比成依赖 ,那么 docker 就是这种魔法 。
2. Build once, run anywhere
顾名思义,一次创建、随地运行。
我们知道 车间是用于工业生产的 ,即一个application。在这个世界,还存在很简早多其他的application,比如学校、医院、写字楼、商场、体育场等,它们各自负责不同的用途。假设这些 application 都是能够共享的,那么这个效率将会很高,比如国家A需要用到体育馆,可以从国家B复制一个过来;国家B需要用到学校,可以从国家A复制一个过来。Docker 使用的就是这种理念,Docker 中包含三个核心部分:
镜像仓库(Repository)可以是私有的(比如本地机器的 Docker repository),也可以是公有的(比如 Docker 官方提供的Docker Hub、第三方的 Hub)。 负责管理镜像仓库(Repository)的是 Docker Registry 服务 (就像是图书馆管理员)。Docker 官方提供的 Docker Hub 对于镜像来源有着严格的把控,有很多高质量的 application 镜像,也是开发人员用的最多的public registry 服务。
那么为什么需要 Kubernetes 呢?就在 Docker 容器技术被炒得热火朝天之时,大家发现,如果想要将 Docker 应用于具体的业务实现(当 容器和服务器的数量达到一定规模 的时候,就会碰到管理的
问题,即 如何有效管理大量的服务器和容器 ,保证 应用的稳定运行、方便升级和故障的快速解决 ),是存在困难的—— 编排、管理和调度等各个方面都不容易 。于是就迫切 需要一套容器编排工具 ,能够对 Docker 和容器进行 更高级、灵活的管理 。容器编排工具提供图形化界面或者命令行来管理容器和服务器集群,提供容器配置、任务发布、服务发现、负载均衡、系统监控和故障恢复、声明式系统配置以及有关容器部署和性能的规则和约束定义机制等。
就在这个时候, Google开发的 Kubernetes 从众多编排工具中脱颖而出 ,赢下了容器编排工具大战。Kubernetes 是一种 基于容器的集群管理平台 。Kubernetes 是希腊语,意为“舵手、领航员”,大家都习惯将 Kubernetes 简称为K8s(ubernete 包含8个字母)。K8s 最初由 Google 创建而后加入 openstack 基金会并发布了 K8s V1.0。
Docker 公司自己有一款名为 Docker Swarm的产品,它是一个容器集群和调度工具,功能类似于Kubernetes。相比 Kubernetes,Swarm在集群搭建和使用上要相对简单一些,学习和部署成本相对低一些。较新版本的Docker已经集成了Swarm。Swarm支持跨多个主机进行编排,管理较小规模的容器集群也绰绰有余,对于初学者也可以很快的部署和运行。
笔者水平有限,如有错误,敬请指正!
参考:
Docker 基础入门
软件开发最大的麻烦事之一,就是环境配置。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。而且换一台机器,就要重来一次。Docker可以解决这个问题
Docker 属于 Linux 容差神器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。容器是进程级别的,相比虚拟机有很多优势:(1)启动快;(2)资源占用少(3)体积小。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
本小节介绍如何制作 image 文件,以及 docker 的一些高级用法
主要是编写 Dockerfile 文件,此外用.dockerignore文件排除不想打包的文件。Dockerfile 文件它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
然后执行 docker image build -t 容器名称 . 即可构建一个 image
微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。如何管理这多个容器呢,即一行命令同时启动或关闭多个容器。Docker Compose可以做到。你需要定义一个 YAML 格式的配置文件 docker-compose.yml ,写好多个容器之间的调用关系。
docker-compose up // 启动
docker-compose stop // 关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的圆碧时候,还可以复用。
docker-compose rm // 把这两个容器文件删除
以下两种玩儿发都需要配置国内镜像代理,否则速度极慢,虚腔亏代理配置参考注
超值一篇分享,Docker:从入门到实战过程全记录
作者 | 天元浪子
来源 | CSDN博客
想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。
那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。
1.1 虚拟机和容器
借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储资源多(GB级简袭)、启动速度慢(分钟级)的缺点也是显而易见的。
相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储资源少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。
1.2 容器、镜像和Docker
Docker是一个开源的应宽凯用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、资源、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。
1.3 Docker 和 k8s
作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。
k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。
Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。
2.1 在ubuntu中安装
在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。
安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:
然后,重启docker服务:
最后,关闭当前的命令行,重新打开新的命令行就可以了。
顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:
这是由于docker和Podman冲突造成的,需要先卸载Podman:
2.2 在Win10中安装
Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似拦巧兄于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!
我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:
然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。
2.3 Hello world
docker服务启动的情况下,运行下面的命令:
此命令的含义是:
第一次运行时,因为本地没有ubuntu:20.04镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。
docker官方还提供了一个hello-world镜像,可以直接运行:
此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。
从hello world的例子中,也可以体验到,docker实例的运行是非常快的。
docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。
新建文件/etc/docker/daemon.json,输入如下内容:
然后重启docker的服务:
3.1 列出本地所有镜像
执行命令 docker images 可以查看
当前我本地只有刚才安装的两个镜像。
3.2 从镜像库中查找镜像
执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。
最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。
3.3 下载新的镜像
执行命令docker pull 镜像名称:版本号即可下载新的镜像。
镜像下载后,就可以使用镜像来创建容器了。
4.1 启动容器
执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:
比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:3.8
4.2 将宿主机的文件挂载到容器
docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。
比如我们在宿主机上有一个hello.py,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。
我的hello.py保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/hello.py:
4.3 容器的端口映射
我们修改一下hello.py,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:
在容器内执行:
接下来,尝试用telnet命令连接,结果却是失败的。原因是,127.0.0.1是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。
需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127.0.0.1的ip,在容器中运行时,需要绑定所有ip,即0.0.0.0。
然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。
这样,就将容器的5000端口映射到了宿主机的5001端口,使用:
即可与容器中的服务器进行连接。
4.4 容器管理
上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:
显示的内容有下面几列:
要想结束容器,可以使用docker kill 容器ID命令。
一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。
要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:
注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。
5.1 自制显示文本文件内容镜像
编写cat.py,接收一个文件名,由python读取文件并显示文件的内容:
这个例子比较简单,缩写Dockerfile如下:
这个Dockerfile的含义是:
需要说明的是,ENTRYPOINT有两种写法:
这里采用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:
这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为1.0,别忘了最后那个.,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:
即可看到~/docker_test/cat/files/test.txt的内容。
5.2 自制web服务器镜像
我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。
测试的ws.py如下:
编写Dockerfile文件如下:
在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:
执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:
在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。
在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:
此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:
上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:
使用这种写法,docker run命令中的参数才可以传递给hello.py:
这个命令中,--port=9000被作为参数传递到hello.py中,因此容器内的端口就成了9000。
在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:
这种方式下,即使当前的控制台被关闭,该容器也不会停止。
5.3 自制apscheduler服务镜像
接下来,制作一个使用apscheduler编写的服务镜像,代码如下:
Dockerfile也是信手拈来:
生成镜像:
应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:
前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的图片等资源,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。
docker hub上有个一python:3.8-alpine镜像,大小只有44.5MB。之所以小,是因为alpine是一个采用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。
还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为72.9MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。
看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。
多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。
1、在ubuntu镜像的基础上安装python:
然后运行:
这样,就生成了python:3.8-ubuntu镜像。
2、在python:3.8-ubuntu的基础上安装pip:
然后运行:
这样,就生成了python:3.8-ubuntu-pip镜像。
3、多阶段构建目标镜像:
这个dockerfile需要解释一下了,因为它有两个FROM命令。
第一个是以python:3.8-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。
第二个FROM是以FROM python:3.8-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。
最后,再运行:
这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。
到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?
刚才使用docker images命令时,已经看到了生成的镜像:
我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个.tar格式的压缩文件:
将hello.tar复制到生产环境的机器上,然后执行导入命令:
就可以使用了。
Docker部署Rstudio Server【一】:Docker入门
实验室的服务器上,使用Docker部署环境已经有一段时间了,收到的反响还不错。接下来,以Rstudio Server的官方镜像为例子,学习Docker的基本使用方法。
直接来到Rstudio在DockerHub上的官方地址: ,在一台安装了Docker,但没有容器运行的机器上,直接输入Quickstart下面的一行命令:手则
机器上若没有 rocker/rstudio 镜像,会花一点时间,将镜像拉到本地。
之后,输入 XXX.XXX.X.XXX:8787 (XXX等表示服务器等IP地址,8787是Rstudio Server的端口),熟悉的登录界面出现,容器运行成功!
根据官方文档说明,此时以用户名 rstudio ,密码 yourpasswordhere ,即可成功登录Rstudio Server。
成功登录拍薯扰Rstudio,命令行开头第一句话 R version 4.0.3 (2020-10-10) -- "Bunny-Wunnies Freak Out" 。可是,我们使用的很多R包并没有适配4版本的R,还是需要旧版本的R包。而Rstudio官方提供了带不同R版本的镜像供使用,点击 即可查看:
例如,我们要使用3.6版本的R,只需把命令末尾的 rocker/rstudio 替换为 rocker/rstudio:3.6.1 即可袭旦。 rocker/rstudio 不添加其他后缀,则默认等效为 rocker/rstudio:latest 。
Docker 入门 (01) CenterOS 配置 docker
序言禅闷闹:
本次教程是我第一次学习docker时候写下的笔记和心得 , 用的云服务器也是新安装纯净的centeros 系统 , 过程中可能涉及到一些额外的系统操作,
本系列文章不会涉及太多的理论和原理,更倾向于操作,适合新手无脑上手, 请各位大神手下留情啊,如果有更好罩仿的操作方法,欢迎留言支出错误,互相学习
目标:
通过本次学习,让大家可以在centeros 系统中 快速安装docker
环境信息:
运营商: 百度云盘
系统: centeros 8.0 64位
操作步骤:
结语:
如果大家运行最后一步,能够顺利看到 success相关信息贺罩 , 证明docker已经安装成功了!
关于docker入门和docker入门视频的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。