🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
Docker 架构解析:理解 Docker 引擎和容器运行时
摘要:
本篇博客《Docker 架构解析:理解 Docker 引擎和容器运行时》深入探讨了 Docker 技术的核心概念和关键组件。在引言部分,简要介绍了 Docker 的重要性和普及程度,并提出了本文的目的:帮助读者深入理解 Docker 架构、引擎和容器运行时。
随后,我们分别阐述了 Docker 是什么以及它的核心概念,引入了 Docker 的主要组件和工作原理。紧接着,我们对 Docker 的整体架构进行了概述,并解释了各个组件的作用,包括 Docker 镜像、容器、Docker 引擎和容器运行时等。
在深入理解 Docker 引擎一节中,我们探讨了 Docker 引擎的结构和功能,特别强调了 Docker 守护进程、Docker REST API 等关键角色的作用。接着,我们介绍了容器运行时的作用和重要性,探讨了常见的容器运行时实现,如 runc、containerd 等。
在 Docker 镜像部分,我们详细介绍了 Docker 镜像的概念和特点,解释了其分层结构和联合文件系统的设计原理。然后,我们对 Docker 与传统虚拟化技术进行了对比,着重强调了 Docker 在性能、启动速度和资源利用率方面的优势。
在应用场景部分,我们探讨了 Docker 在开发、测试、部署等方面的广泛应用,包括应用开发与测试、持续集成与持续交付、云端应用部署与扩展、微服务架构等。同时,提供了一些实际案例和使用场景,展示了 Docker 技术在实际应用中的灵活性和高效性。
最后,我们在总结部分简要回顾了 Docker 的架构和关键组件,并强调了 Docker 对于现代应用开发和部署的重要性。Docker 作为一项革命性的容器化技术,为软件开发和部署带来了巨大的便利和效率。它的高性能、轻量级以及广泛的应用场景,使得 Docker 成为当今不可或缺的核心技术。随着 Docker 生态系统的不断发展和创新,我们有理由相信 Docker 将继续引领应用开发和部署的未来。
一、引言
Docker 是当今流行的容器化技术,已经在软件开发、测试和部署等领域广泛应用。它的普及程度和影响力在软件行业不断扩大,成为现代应用开发和运维的重要工具。
本文的目的是对 Docker 的架构进行深入解析,特别关注 Docker 引擎和容器运行时等核心组件,以便读者能够更全面地理解 Docker 技术的工作原理和优势。在探索 Docker 架构的过程中,我们将会了解 Docker 是如何实现应用程序的隔离和打包,以及如何提供高效、可靠的容器运行环境。
如果您对 Docker 技术感兴趣或者希望更深入地了解容器化技术的内部工作原理,本文将为您提供有价值的信息和见解。让我们开始这段关于 Docker 架构解析的探索之旅吧!
二、什么是 Docker?
Docker 是一种开源的容器化平台,旨在简化应用程序的开发、交付和部署过程。它通过利用容器技术,将应用程序及其所有依赖项打包到一个独立的单元中,称为 Docker 容器。这使得应用程序可以在任何环境中都能一致地运行,无论是开发人员的笔记本电脑、测试服务器还是生产环境。
核心概念:
-
镜像(Image):Docker 镜像是一个轻量级、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件等。镜像是容器的基础,通过镜像可以创建多个相同的容器实例。
-
容器(Container):Docker 容器是 Docker 镜像的运行实例。容器是隔离的进程空间,它使用了 Docker 镜像作为其文件系统并共享主机操作系统的内核。这使得容器能够在相对轻量且高效的环境中运行。
-
Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责管理和运行容器。它包含一个守护进程(dockerd)和一个 REST API,用于与 Docker 进行交互。
Docker 的工作原理:
- 开发者创建一个 Docker 镜像,其中包含了他们的应用程序和其它必要的组件。
- Docker 镜像可以上传到 Docker Hub 或私有的 Docker 仓库,供其他用户使用。
- 用户可以通过 Docker 镜像创建容器,容器是镜像的运行实例。
- 容器可以在任何支持 Docker 的环境中运行,它们是隔离的、独立的运行单元。
- Docker 引擎负责管理容器的生命周期,包括启动、停止、删除等操作。
通过使用 Docker,开发者可以更快速、一致地构建、交付和运行应用程序,同时极大地简化了应用程序的部署和管理流程。这使得 Docker 成为现代软件开发和部署的重要工具。接下来,我们将进一步探讨 Docker 的整体架构和各个组件的作用。
三、Docker 架构概述
Docker 架构是一个多层次的系统,由多个组件相互协作实现容器化应用的创建、运行和管理。在 Docker 架构中,包含以下核心部分:
-
Docker 镜像(Docker Image):
Docker 镜像是一个只读的模板,包含了应用程序运行所需的所有文件、依赖项和配置。镜像是构建容器的基础,可以看作是容器的快照。通过使用 Dockerfile 定义镜像的构建过程,开发者可以自定义镜像,使其满足特定应用的需求。镜像的分层结构和联合文件系统(UnionFS)使得镜像的创建和传播变得高效而节省空间。 -
Docker 容器(Docker Container):
Docker 容器是 Docker 镜像的运行实例。容器是隔离的、轻量级的运行环境,每个容器都运行在自己的进程空间中,互不干扰。容器在创建时,会使用镜像的文件系统作为基础层,并在其上添加一个可写层,用于保存运行时状态和数据。容器的隔离性和轻量性使得应用程序可以在不同的环境中以相同的方式运行。 -
Docker 引擎(Docker Engine):
Docker 引擎是 Docker 的核心组件,负责管理和运行容器。它包括以下主要部分:- Docker 守护进程(dockerd):作为后台服务运行,负责管理容器的创建、运行和停止等任务。
- REST API:提供了与 Docker 引擎进行交互的接口,允许用户通过 API 请求来管理容器和镜像。
- 命令行接口(CLI):通过命令行工具(docker)与 Docker 引擎进行交互,方便用户操作容器和镜像。
-
Docker 客户端(Docker Client):
Docker 客户端是用户与 Docker 引擎交互的主要方式。用户可以通过命令行工具(docker)或者 Docker 的图形用户界面(GUI)来与 Docker 引擎进行通信,执行创建、启动、停止、删除容器等操作。Docker 客户端会将用户的命令请求发送给 Docker 引擎的 REST API,由引擎来处理具体的操作。 -
容器运行时(Container Runtime):
容器运行时是一个负责运行容器的软件组件,它实际上是 Docker 引擎的一部分。容器运行时负责创建容器的运行环境,包括启动容器的进程、设置网络和文件系统等。常见的容器运行时实现包括 runc、containerd 等。
Docker 架构的这些组件共同协作,实现了容器化应用的生命周期管理。开发者可以通过定义镜像和容器来构建、交付和运行应用程序,而 Docker 引擎则负责管理这些容器和镜像的生命周期。了解 Docker 架构的工作原理,有助于更好地理解 Docker 技术的运作方式和优势。接下来,我们将深入理解 Docker 引擎及其关键角色。
四、理解 Docker 引擎
Docker 引擎是 Docker 的核心组件,是整个 Docker 架构的核心。它负责管理容器和镜像的创建、运行和停止等任务,提供了一个简单而强大的接口来与容器化应用程序进行交互。
1. Docker 守护进程(dockerd):
Docker 守护进程是 Docker 引擎的后台服务,负责持续运行并处理与容器相关的请求。它监听来自 Docker 客户端或其他组件的命令,并根据这些请求执行相应的操作。Docker 守护进程管理着整个容器的生命周期,包括创建、启动、停止和销毁容器。
2. Docker REST API:
Docker 引擎提供了一个 REST API,它允许用户和其他应用程序通过 HTTP 请求来与 Docker 引擎进行交互。这个 API 提供了对容器和镜像的管理功能,可以通过编程方式与 Docker 引擎进行通信。Docker 客户端通过调用这些 API 来实现用户的命令行操作,比如创建容器、上传镜像等。
3. Docker 命令行接口(CLI):
Docker 引擎的命令行接口(CLI)是用户与 Docker 守护进程交互的主要方式。通过在终端中输入各种 Docker 命令,用户可以创建、启动、停止、删除容器,以及构建、上传、下载镜像等。CLI 工具将用户的命令请求转发给 Docker 守护进程,并返回相应的结果。
4. 容器与镜像管理:
Docker 引擎负责容器和镜像的管理,包括以下任务:
- 创建镜像:根据 Dockerfile 和构建上下文创建 Docker 镜像。
- 存储镜像:将创建的镜像保存在本地或上传至 Docker Hub 等远程仓库。
- 创建容器:基于指定的镜像创建容器,并分配唯一的容器 ID。
- 容器生命周期管理:启动、停止、重启、销毁容器,并监控容器的状态变化。
- 网络管理:配置容器网络,实现容器间的通信和与外部网络的连接。
5. 安全性与隔离性:
Docker 引擎实现了一系列安全措施,确保容器之间和主机之间的隔离性。它使用 Linux 命名空间(namespace)和控制组(cgroup)等特性,以及基于用户的权限管理,确保容器运行在隔离的环境中,不会对其他容器或主机造成影响。
Docker 引擎的设计使得整个 Docker 架构变得灵活而高效。用户可以通过 Docker 客户端与 Docker 引擎交互,对容器和镜像进行管理和操作。理解 Docker 引擎的结构和功能对于深入探索 Docker 技术和合理使用容器化应用至关重要。接下来,我们将学习容器运行时的重要作用,它是 Docker 引擎的一个关键角色。
五、容器运行时(Container Runtime)
容器运行时是 Docker 引擎的一个重要组件,它负责管理和运行容器的实际进程。容器运行时在容器创建时负责设置容器的运行环境,并在容器内部启动应用程序进程。它为容器提供了隔离的运行环境,使得容器内的应用程序可以在与主机系统隔离的环境中运行,确保了应用程序在各种环境中的可移植性和一致性。
容器运行时的作用和重要性:
-
容器隔离:容器运行时使用 Linux 命名空间和控制组等技术,为每个容器创建一个隔离的运行环境。这使得容器内的进程与其他容器和主机系统完全隔离,确保容器内部的应用程序不会相互干扰,增强了安全性和稳定性。
-
资源管理:容器运行时可以限制容器对系统资源(如 CPU、内存、网络带宽等)的访问和使用,从而确保各个容器之间资源的公平共享,并避免容器对主机系统的过度占用。
-
启动和停止容器:容器运行时负责在容器内部启动应用程序进程,并在容器停止时停止和清理容器内的进程。它通过读取容器的配置和镜像信息,实现容器的启动和停止。
-
联合文件系统(UnionFS):容器运行时使用联合文件系统来实现镜像的分层和容器的可写层。联合文件系统允许多个文件系统合并挂载为单一文件系统,使得容器的镜像和存储占用更加高效。
常见的容器运行时实现:
-
runc:
runc 是一个由 Open Container Initiative (OCI) 维护的标准容器运行时实现。它是 Docker 最初使用的容器运行时,并已成为容器运行时标准的实现之一。runc 负责创建和管理容器的隔离环境,并在容器内部运行应用程序进程。 -
containerd:
containerd 是一个高级容器运行时管理程序,由 Docker 开发并捐赠给 Cloud Native Computing Foundation (CNCF)。它负责容器的生命周期管理,并支持多种容器运行时(如 runc、Kata Containers 等)。containerd 提供了更多的功能和抽象,使得容器的管理更加灵活和可扩展。 -
CRI-O:
CRI-O 是一个专门为 Kubernetes 设计的容器运行时。它符合 Kubernetes Container Runtime Interface (CRI) 规范,可以与 Kubernetes 集成,用于管理容器的生命周期。CRI-O 使用 runc 或 Kata Containers 作为底层的容器运行时实现。 -
Kata Containers:
Kata Containers 是一个轻量级的容器运行时,结合了虚拟机和容器的优势。它使用虚拟机技术来提供更高的隔离性,并通过轻量级的容器格式来降低启动时间和资源开销。Kata Containers 支持多种容器运行时实现,包括 runc 和 clear containers 等。
容器运行时在 Docker 引擎的架构中扮演着重要的角色,它为容器提供了安全、高效的运行环境,并为容器的隔离和资源管理提供了支持。了解容器运行时的作用和常见实现,有助于深入理解 Docker 技术的底层机制和原理。接下来,我们将介绍 Docker 镜像的概念和特点。
六、Docker 镜像
Docker 镜像是 Docker 的核心概念之一,它是用于构建容器的模板或静态快照。镜像包含了一个完整的文件系统,其中包括应用程序运行所需的所有文件、依赖项、库、环境变量和配置等。镜像是容器的基础,通过镜像可以创建多个相同的容器实例,每个容器都是镜像的一个运行实例。
Docker 镜像的特点:
-
轻量级和可移植性:
Docker 镜像是轻量级的,它只包含了应用程序运行所需的文件和依赖项,相对于传统虚拟机镜像来说更小巧。由于镜像是独立的、可移植的文件,因此可以轻松地在不同的环境中进行部署和运行,保证了应用程序在不同平台上的一致性。 -
分层结构:
Docker 镜像采用分层结构的设计。一个 Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。这种分层的结构使得镜像可以复用共同的部分,减少了镜像之间的冗余。当多个镜像共享同一层时,它们只需要存储该层的一个副本,而不需要多份拷贝。 -
联合文件系统(UnionFS):
Docker 镜像使用联合文件系统(UnionFS)来实现镜像的分层结构。联合文件系统允许多个文件系统挂载为单一文件系统,使得不同层的文件系统在容器启动时可以合并在一起。这样,镜像的修改操作可以通过添加一个新的可写层来实现,而不是在原有的镜像层上直接修改,保持了镜像的不可变性。 -
镜像版本控制:
Docker 镜像支持版本控制,每个镜像都有一个唯一的标签或 ID,用于标识镜像的不同版本。这使得开发者可以轻松地管理和追踪镜像的更新和变化。通过指定特定的标签或 ID,可以确保使用特定版本的镜像来构建容器。
Docker 镜像的分层结构和联合文件系统:
如前所述,Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。这些层按照从底向上的顺序依次叠加,形成一个完整的镜像。镜像的最底层是一个基础镜像(Base Image),上面叠加了一系列更高层的镜像,每个层都是前一个层的增量变化。
在容器启动时,Docker 引擎会将这些层通过联合文件系统合并成一个容器文件系统。在容器运行过程中,Docker 引擎将修改操作写入一个可写层(Writeable Layer),该层仅保存容器运行时的状态和数据。这种分层和联合文件系统的设计使得镜像的创建和传播非常高效,节省了存储空间和下载时间。
总结: Docker 镜像是构建容器的模板,它采用分层结构和联合文件系统来实现高效的存储和管理。镜像的轻量级、可移植性以及版本控制特性,使得它成为构建和交付容器化应用的核心基础。了解 Docker 镜像的概念和特点,有助于更好地理解 Docker 的工作原理和优势。接下来,我们将探讨 Docker 与传统虚拟化技术的对比。
七、Docker 与传统虚拟化技术的对比
Docker 是一种容器化技术,而传统虚拟化技术通常指的是基于虚拟机(Virtual Machine,VM)的虚拟化。虽然 Docker 和传统虚拟化技术都可以实现应用程序的隔离和部署,但它们在架构和性能方面存在显著的差异。
1. 架构比较:
传统虚拟化技术(基于虚拟机):
- 在传统虚拟化中,Hypervisor 负责创建和管理虚拟机,每个虚拟机运行一个完整的操作系统,包括内核和用户空间。
- 每个虚拟机都需要独立的操作系统和内核,因此虚拟机之间存在较大的资源开销。
Docker(容器化技术):
- Docker 使用容器来实现应用程序的隔离,容器共享主机操作系统的内核,避免了虚拟机的重复内核和操作系统资源。
- 容器内只包含应用程序和其依赖项,因此容器更加轻量级且资源开销较小。
2. 性能比较:
传统虚拟化技术(基于虚拟机):
- 由于每个虚拟机都运行一个完整的操作系统,虚拟化的性能开销较大,资源利用率较低。
- 虚拟机启动时间较长,通常需要几秒钟或更多时间来启动。
Docker(容器化技术):
- Docker 容器共享主机操作系统的内核,因此性能开销较小,资源利用率较高。
- 容器的启动时间通常在毫秒级别,几乎可以瞬间启动。
3. 资源利用率比较:
传统虚拟化技术(基于虚拟机):
- 每个虚拟机都需要独立的操作系统和内核,虚拟机之间的资源隔离较好,但资源利用率较低。
- 因为虚拟机有自己的内核,需要占用更多的内存和存储空间。
Docker(容器化技术):
- Docker 容器共享主机操作系统的内核,资源利用率较高,因为容器内只包含应用程序及其依赖项。
- 容器共享主机的内存和存储,因此更加高效地利用资源。
结论:
Docker 在性能、启动速度和资源利用率方面具有显著的优势,主要得益于其轻量级、分层的容器化设计。相比于传统虚拟化技术,Docker 更适用于轻量级应用和微服务架构,能够更快速地部署和扩展应用。另外,Docker 也更容易在不同环境中移植和迁移,因为容器本身就是独立的应用单元。
然而,对于一些特定场景,如需要隔离不同操作系统的应用或需要更高隔离性的应用,传统虚拟化技术可能更为适用。因此,在选择虚拟化技术时,需要根据应用的需求和环境的特点进行综合考虑。
八、Docker 的应用场景
Docker 是一种灵活、高效的容器化技术,它在软件开发、测试和部署等方面具有广泛的应用。以下是 Docker 在不同场景下的应用:
1. 应用开发与测试:
-
开发环境一致性:开发者可以在本地使用 Docker 镜像来搭建开发环境,确保开发环境与生产环境一致,避免由于环境差异导致的问题。
-
快速构建和迭代:Docker 镜像的轻量级和启动速度快,使得开发团队可以快速构建和测试应用程序,提高了开发效率。
-
集成测试环境:Docker 可以创建包含所有依赖项的测试环境,确保测试环境的一致性,使集成测试更加可靠。
2. 持续集成与持续交付(CI/CD):
-
自动化构建与部署:Docker 容器可以方便地与 CI/CD 工具集成,实现自动化构建、测试和部署流程,减少人工干预,提高交付效率。
-
快速部署和回滚:Docker 容器可以快速部署和回滚,确保交付的版本能够快速投入使用或进行回退。
3. 云端应用部署与扩展:
-
跨平台移植:Docker 镜像具有高度可移植性,可以轻松地在不同的云平台和服务器上部署和运行。
-
弹性扩展:通过 Docker 容器的弹性扩展功能,可以根据负载情况自动增加或减少容器的数量,实现应用的弹性扩展。
4. 微服务架构:
-
服务拆分:Docker 容器可以将复杂的单体应用拆分成多个独立的微服务,使得应用的开发和部署更加灵活和可维护。
-
独立部署:每个微服务都可以打包成 Docker 镜像并独立部署,实现微服务架构下的解耦和可扩展性。
5. 多租户环境隔离:
- 多租户隔离:Docker 容器提供了轻量级的隔离性,可以在同一主机上同时运行多个租户的应用,确保应用之间的资源和环境隔离。
实际案例和使用场景:
-
在线电商平台:使用 Docker 部署前端、后端和数据库等多个服务,实现快速的开发和部署,同时在高峰期根据负载自动扩展容器数量。
-
数据分析与处理:利用 Docker 镜像打包数据处理任务,快速构建和销毁容器,提高数据处理的效率和灵活性。
-
持续集成与部署:通过 Jenkins 等 CI/CD 工具与 Docker 集成,实现代码的自动化构建、测试和部署。
-
微服务架构:将复杂的应用拆分成多个微服务,使用 Docker 容器独立部署和运行,实现微服务架构。
-
敏捷开发与测试:开发者可以使用 Docker 容器在本地快速搭建开发环境,测试人员也可以在不同的测试环境中运行容器进行测试。
-
边缘计算:在边缘设备上部署 Docker 容器,实现本地数据处理和边缘计算。
以上只是 Docker 应用场景的一部分,Docker 的灵活性和高效性使其在众多领域都具有广泛的应用前景。随着技术的发展,Docker 及其生态系统将继续演进和完善,为应用开发、部署和管理带来更多便利和创新。
九、总结
Docker 是一种颠覆性的容器化技术,为现代应用开发和部署带来了革命性的变化。在本篇博客中,我们深入探讨了 Docker 的架构和关键组件,以及它在各个方面的优势和应用场景。
首先,我们了解了 Docker 的整体架构,包括 Docker 引擎、容器运行时、Docker 镜像等核心组件。Docker 引擎作为后台服务,负责管理容器和镜像的创建、运行和停止等任务。容器运行时实现了容器的隔离和运行环境,使得容器内的应用程序能够在与主机系统隔离的环境中运行。而 Docker 镜像作为容器的模板,包含了完整的文件系统和运行时依赖,实现了应用程序的快速部署和移植。
然后,我们探讨了 Docker 与传统虚拟化技术的对比。相较于传统虚拟化技术(基于虚拟机),Docker 具有更轻量级、更高效的特点。Docker 容器共享主机操作系统的内核,因此性能开销小、启动速度快,并且更高效地利用资源。这使得 Docker 在云端应用部署、持续集成与持续交付、微服务架构等方面具有明显的优势。
最后,我们探讨了 Docker 在实际应用中的广泛应用场景,包括应用开发与测试、持续集成与持续交付、云端应用部署与扩展、微服务架构、多租户环境隔离等。通过 Docker 的应用,开发者可以快速构建、部署和运行应用,提高开发效率和部署灵活性,同时实现资源的高效利用。
综上所述,Docker 不仅是一种技术,更是一种改变软件开发和部署方式的革新。它的出现使得应用开发者能够更加专注于业务逻辑,而不需要过多关注底层环境。同时,Docker 提供了强大的工具和生态系统,使得应用的构建、部署和管理变得更加简单、高效和可靠。
随着 Docker 生态系统的不断完善和发展,我们有理由相信,Docker 将在未来继续发挥重要的作用,推动应用开发和部署领域的创新和进步。对于现代化的软件开发和部署流程,Docker 已经成为一项不可或缺的核心技术。
十、参考文献
在编写本篇博客《Docker 架构解析:理解 Docker 引擎和容器运行时》时,参考了以下相关资料和文献:
-
Docker Documentation. (https://docs.docker.com/)
-
Morabito, R. (2020). “Docker Deep Dive”. Apress.
-
Poulton, A. (2015). “The Docker Book: Containerization Is the New Virtualization”. Leanpub.
-
Li, Y., & Chen, B. (2018). “Docker Containerization Cookbook”. Packt Publishing.
-
Cloud Native Computing Foundation (CNCF) Whitepapers. ( https://www.cncf.io/whitepapers/ )
这些资料和文献为本文提供了关于 Docker 架构、容器运行时、Docker 镜像等方面的详细信息和深入理解。它们是对 Docker 技术进行研究和了解的重要参考资源,为本文提供了丰富的知识和专业的背景支持。
Docker专栏文章目录预告
第一部分:Docker 基础知识与原理
-
Docker 基础知识解析:容器与虚拟化的区别与优势
2. Docker 架构解析:理解 Docker 引擎和容器运行时 - Docker 镜像解密:分层存储与镜像构建原理
- Docker 容器生命周期:创建、启动、暂停与停止
- Docker 网络模型:理解容器网络通信和连接
- Docker 存储驱动解析:选择最适合你的存储方案
原创声明
======= ·
- 原创作者: 猫头虎
作者wx: [ libin9iOak ]
- 今日已学习
本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。
作者保证信息真实可靠,但不对准确性和完整性承担责任。
未经许可,禁止商业用途。
如有疑问或建议,请联系作者。
感谢您的支持与尊重。文章来源:https://www.toymoban.com/news/detail-684695.html
点击
下方名片
,加入IT技术核心学习团队。一起探索科技的未来,共同成长。文章来源地址https://www.toymoban.com/news/detail-684695.html
到了这里,关于Docker 架构解析:理解 Docker 引擎和容器运行时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!