基于OpenStack的Docker应用
- 格式:doc
- 大小:236.50 KB
- 文档页数:6
一、开篇介绍在云计算领域,OpenStack作为开源的云计算管理评台,被广泛应用于企业和科研机构中。
其中,创建虚拟机实例是OpenStack评台上最为基础和重要的操作之一。
本文将详细介绍如何使用OpenStack命令行工具来创建虚拟机实例。
二、准备工作1. 确保已经安装和配置了OpenStack命令行工具(OpenStackClient)。
2. 确保已经获取到OpenStack评台的认证信息,包括用户名、密码、项目名、以及认证终端URL等。
三、创建虚拟机实例的步骤1. 连接OpenStack评台在终端中通过以下命令连接到OpenStack评台:```openstack --os-username <用户名> --os-password <密码> --os-project-name <项目名> --os-auth-url <认证终端URL> login```2. 选择镜像通过以下命令列出OpenStack评台上可用的镜像:```openstack image list```选择一个合适的镜像ID,作为虚拟机实例的基础镜像。
3. 选择规格通过以下命令列出OpenStack评台上可用的虚拟机规格:```openstack flavor list```选择一个合适的规格ID,用于配置虚拟机实例的CPU、内存等资源。
4. 创建网络通过以下命令列出OpenStack评台上可用的网络:```openstack network list```选择一个合适的网络ID,用于连接虚拟机实例的网络。
5. 创建虚拟机实例通过以下命令来创建虚拟机实例:```openstack server create --flavor <规格ID> --image <镜像ID> --network <网络ID> <虚拟机名称>在命令中可以指定其它的参数,比如关联的密钥对、安全组等。
Docker容器技术在办公中的应用案例随着云计算和虚拟化技术的不断发展,Docker容器技术成为了企业中广泛使用的一种解决方案。
它提供了一种轻量级、灵活、可移植的方式来打包、发布和管理应用程序。
在办公场景中,Docker容器技术也有着许多应用案例。
一、开发环境的一致性在软件开发过程中,开发人员经常需要在不同的环境中进行测试和部署应用程序。
使用Docker容器技术,开发人员可以将应用程序及其所有的依赖项打包成一个镜像,然后在任何支持Docker的环境中运行。
这样一来,开发环境的配置就可以与生产环境保持一致,可以避免因为环境不同而导致的兼容性问题。
二、跨平台的应用部署在办公中,部署应用程序到不同的平台可能会遇到一些困难。
不同的操作系统、不同的硬件架构都会对应用程序的部署带来一些限制。
使用Docker容器技术可以解决这个问题。
只需要将应用程序打包成一个镜像,然后在目标平台上运行Docker容器,就可以轻松实现应用的跨平台部署。
三、快速搭建测试环境在进行软件测试的过程中,往往需要搭建各种不同的测试环境。
传统的方式是手动配置环境,这样耗时且容易出错。
使用Docker容器技术可以快速搭建各种测试环境。
只需要定义一个包含了测试所需组件和配置的Docker镜像,就可以随时随地地创建相同的测试环境,提高了测试的效率和准确性。
四、简化应用程序的维护和更新在办公环境中,应用程序的维护和更新是一个重要的任务。
但是传统的方式需要手动升级每个节点上的应用程序,非常繁琐。
使用Docker容器技术,可以轻松地部署新版本的应用程序。
只需要构建一个新的镜像,然后将旧的容器替换成新的容器,从而实现应用程序的无缝升级。
五、高效的资源利用和扩展在传统的虚拟化技术中,每个虚拟机都需要独立的操作系统和内核,占用了大量的资源。
而Docker容器技术可以实现操作系统级的虚拟化,多个容器可以共享同一个内核,大大提高了资源的利用效率。
此外,通过使用Docker容器技术,可以快速地进行水平扩展。
Docker的优势和应用场景详解一、引言Docker是一种轻量级的容器化技术,可以将应用程序及其依赖项打包成一个独立的容器,从而实现在任何环境中快速、高效地部署和运行。
Docker在近年来迅速崛起,并成为软件开发和部署的重要工具之一。
本文将详细介绍Docker的优势和应用场景。
二、Docker的优势1. 高效的资源利用Docker利用虚拟化技术,在物理机上运行多个容器,每个容器都是独立运行的环境,相互之间互不干扰。
这样可以最大程度地利用物理资源,提高服务器的利用率,降低运行成本。
2. 快速部署和扩展Docker容器可以在几秒钟内启动和停止,相对于传统的虚拟机,启动速度更快。
而且,由于容器是轻量级的,只包含应用程序及其依赖项,所以可以快速部署到不同的环境中。
另外,Docker还提供了自动化扩展的能力,可以根据需求来动态添加或删除容器,从而实现弹性扩展。
3. 环境一致性Docker容器可以在不同的操作系统中运行,而不需要修改应用程序代码。
这意味着开发人员可以将应用程序与其依赖项一起打包,并在不同的环境中进行部署,而无需担心环境差异的问题。
这大大简化了应用程序在不同环境中的部署和迁移流程,提高了开发和测试的效率。
4. 高度可移植性由于Docker容器是隔离的,不依赖于底层系统的特定配置,因此可以轻松地在不同的平台上移植和部署。
开发人员可以在本地开发和测试容器,然后将其部署到云上或其他服务器中,而无需担心运行环境的变化。
这种可移植性使得容器化技术成为云计算和DevOps领域的理想选择。
三、Docker的应用场景1. 快速部署和扩展的云计算Docker的快速部署和扩展能力使其成为云计算领域的热门选择。
云服务提供商可以使用Docker来部署和管理大规模的应用程序,根据用户需求进行弹性扩展和收缩。
而且,由于容器可以在不同的云平台上无缝移植,用户可以轻松地将应用程序迁移到不同的云服务商,实现灵活的云计算架构。
2. 敏捷的软件开发和测试Docker提供了一个一致的环境,使得开发团队可以在相同的环境中协作开发和测试应用程序。
第一章OpenStack是一个进行云部署的操作平台或工具集,可以控制大量的计算、存储、网络资源,但它本身不能进行虚拟化,需要依赖第三方软件。
与其它开源IaaS云平台相比,OpenStack具有项目松耦合、组件配置较为灵活、二次开发容易等优势。
搭建OpenStack环境时,一般需要控制节点、计算节点、块存储节点、对象存储节点和网络节点。
其中块存储节点、对象存储节点和网络节点不是必选节点。
OpenStack工作流程(能根据图1-5 OpenStack 概念架构图进行论述)Kubernetes是基于容器技术的分布式架构方案,也是一个开放的开发平台,既不限制编程语言,也不限定编程接口。
Kubernetes是一个典型的Master/Slave式分布式集群架构,拥有Master和Node 两类节点。
Master节点为控制节点,负责整个集群的管理;Node节点为工作节点,负责处理Master分配的工作负载。
第三章网桥是工作在数据链路层的一个物理或虚拟设备。
网桥在宿主机上创建,用于为虚拟机提供网络连接。
连接在同一个网桥上的虚拟机之间可以相互通信。
网关是在具有路由功能的设备上的一个端口。
网关为虚拟机提供三层网络的连通性。
为了减小广播域,将一个局域网划分成多个虚拟局域网VLAN,但是不同虚拟局域网VLAN的物理机和虚拟机之间需要通过网关进行通信。
为了解决服务器物理接口数量有限,不能为众多VLAN提供连接到网关的接口的问题,将物理接口划分为若干个子接口网桥或者交换机上的端口,可以配置成Access端口或者Trunk端口, Access端口只能传输同一个VLAN的数据, Trunk端口可以传输所有VLAN的数据第四章安装OpenStack的基础组件至少需要一个控制节点和一个计算节点。
安装前需要配置好时间服务,保证所有节点时间一致。
MySQL是OpenStack的数据库组件,安装在控制节点上。
RabbitMQ是OpenStack的消息队列服务组件,用于协调各服务组件之间的信息交换。
使用Docker容器实现应用程序部署近年来,Docker容器的应用越来越广泛,已经成为了现代应用程序部署的一种标准方案。
使用Docker容器可以在不同的运行环境中快速、可靠地部署应用程序,大大提高了应用程序的可移植性和可维护性。
而且,Docker容器的部署过程也非常简单,只需要几个命令即可完成整个部署过程。
本文将介绍如何使用Docker容器来部署应用程序,从而快速、可靠地完成应用程序的部署工作。
在本文中,我们将使用一个Web应用程序作为示例来演示如何使用Docker容器来进行部署。
我们将详细介绍每个步骤,从创建Docker容器,到构建、测试、发布应用程序。
一、创建Docker容器首先,我们需要创建一个Docker容器来承载我们的Web应用程序。
Docker容器本质上是一个封装了应用程序和所有依赖项的独立、可执行的单元。
通过使用Docker容器,我们可以确保应用程序在任何环境中都能够以相同的方式运行。
要创建Docker容器,我们需要编写一个Dockerfile文件,该文件描述了如何在容器中构建和运行应用程序所需的操作系统和软件环境。
在本文中,我们将使用Node.js作为Web应用程序运行环境,其他类似的语言和框架也可以使用类似的方法进行部署。
以下是一个简单的Dockerfile文件示例:```# 指定一个基础镜像FROM node:alpine# 在容器中创建一个工作目录WORKDIR /app# 将应用程序代码复制到容器中COPY . /app# 安装所有依赖项RUN npm install# 暴露容器上的端口EXPOSE 3000# 定义默认的启动命令CMD ["npm", "start"]```上面的Dockerfile文件包含了以下几个步骤:- 指定一个基础镜像,用于构建Docker容器。
- 创建一个工作目录,用于存放应用程序代码和所有依赖项。
- 复制应用程序代码到容器中。
《基于OpenStack的物联网仿真实验平台的设计与实现》篇一一、引言随着物联网技术的快速发展,物联网仿真实验平台在研究、开发及教育领域的应用日益广泛。
本文旨在设计并实现一个基于OpenStack的物联网仿真实验平台,以满足科研人员、开发人员及学生等用户群体的需求。
该平台能够提供灵活、可扩展且逼真的物联网仿真环境,以支持各类物联网相关实验。
二、平台设计1. 设计目标本平台设计的主要目标是提供一个稳定、可扩展、可定制的物联网仿真实验环境。
该平台应具备以下特点:支持多种物联网设备和协议的仿真、提供丰富的实验场景和案例、支持用户自定义实验、具备高度的可扩展性和灵活性。
2. 架构设计本平台采用基于OpenStack的架构设计,包括物理资源层、虚拟化层、OpenStack层和应用层。
物理资源层负责提供计算、存储和网络等资源;虚拟化层通过虚拟机技术实现资源的虚拟化;OpenStack层提供云计算资源的管理和调度;应用层则负责物联网仿真实验平台的实现。
3. 功能模块设计(1)资源管理模块:负责物理资源的虚拟化和管理,包括计算资源、存储资源和网络资源的分配和调度。
(2)仿真环境模块:提供多种物联网设备和协议的仿真,支持用户创建自定义的仿真环境和场景。
(3)实验管理模块:负责实验的创建、修改、删除和执行等操作,支持用户自定义实验。
(4)用户管理模块:负责用户的注册、登录、权限管理和实验数据存储等操作。
三、平台实现1. 技术选型本平台采用OpenStack作为云计算资源管理平台,使用Python作为主要开发语言,采用Docker容器技术实现资源的快速部署和隔离。
同时,采用Mininet等网络仿真工具实现网络环境的模拟。
2. 资源虚拟化与调度通过KVM等虚拟化技术,将物理资源虚拟化为虚拟机,再通过OpenStack进行管理和调度。
通过动态资源分配和调度策略,实现资源的合理利用和优化。
3. 物联网仿真环境的实现通过模拟物联网设备和协议,构建逼真的物联网仿真环境。
使用Docker构建容器治理平台的最佳实践使用Docker 构建容器治理平台的最佳实践近年来,容器化技术成为了软件开发和部署的主流趋势。
Docker 作为最受欢迎的容器化平台之一,为开发人员和运维人员提供了一种简便而高效的方式来构建、打包和交付应用程序。
在实际应用中,构建一个高效的容器治理平台对于企业来说至关重要。
本文将介绍使用 Docker 构建容器治理平台的最佳实践,帮助读者更好地利用 Docker 在企业环境中部署和管理容器化应用。
1. 定义容器治理平台的目标在开始构建容器治理平台之前,首先需要明确目标。
容器治理平台的主要目标是提供一个统一的管理界面,使得开发团队和运维团队能够轻松地管理和监控所有的容器。
此外,容器治理平台还应包括自动化和监控功能,以提高容器的可靠性和性能。
2. 设计容器镜像的最佳实践在构建容器治理平台之前,需要定义容器镜像的最佳实践。
容器镜像是容器的基本组件,其质量和安全性对整个平台的可靠性至关重要。
对于容器镜像的设计,以下是一些最佳实践建议:- 保持镜像的轻量化:将容器镜像设计为尽可能小且单一用途,避免包含不必要的组件和文件。
- 使用基础镜像进行构建:选择合适的基础镜像作为构建容器的基础,可以减少不必要的依赖和复杂性。
- 定期更新和验证镜像:定期更新和验证容器镜像中的软件包和依赖项,以确保镜像的安全性和稳定性。
3. 建立容器编排和管理工具为了更好地管理和编排容器,建议使用容器编排和管理工具。
Docker Compose 是一个常用的工具,它允许用户通过一个定义文件来管理多个容器的部署和运行。
通过使用 Docker Compose,可以轻松地定义容器之间的依赖关系,并实现容器的自动部署和扩缩容。
另一个值得考虑的容器编排工具是 Kubernetes。
Kubernetes 提供了更大规模和更复杂的容器集群管理能力,支持自动化的容器部署、扩缩容和滚动更新。
虽然Kubernetes 的学习曲线较陡峭,但它能提供更高级的容器治理功能,适用于大型企业和复杂的应用场景。
基于 OpenStack 高可用云计算平台研究与部署摘要】云计算是继互联网、计算机后在信息时代有一种新的革新,云计算是信息时代的一个大飞跃,未来的时代可能是云计算的时代。
随着云计算兴起与发展,对OpenStack的研究也风起云涌。
不同的云平台也都研究openstack技术,在此基础上搭建各自的私有云或公有云,本文深入分析OpenStack技术,并给出搭建云平台的不同部署方案。
【关键词】OpenStack;高可用云计算平台;研究;部署1. OpenStack技术概述1.1什么是云计算云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。
云计算早期,简单地说,就是简单的分布式计算,解决任务分发,并进行计算结果的合并。
因而,云计算又称为网格计算。
通过这项技术,可以在很短的时间内(几秒种)完成对数以万计的数据的处理,从而达到强大的网络服务。
云计算不是一种全新的网络技术,而是一种全新的网络应用概念,云计算的核心概念就是以互联网为中心,在网站上提供快速且安全的云计算服务与数据存储,让每一个使用互联网的人都可以使用网络上的庞大计算资源与数据中心。
1.2什么是openstackOpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。
由NASA(美国国家航空航天局)和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证)授权的开源代码项目。
OpenStack为私有云和公有云提供可扩展的弹性的云计算服务。
项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。
1.3Openstack组件类型OpenStack覆盖了网络、虚拟化、操作系统、服务器等各个方面。
下面介绍10个核心项目1、计算(Compute):Nova。
基于OpenStack的Docker应用作者:于建威等来源:《软件导刊》2015年第09期摘要:OpenStack是一个开源云计算管理平台,其能通过各种互补服务提供基础设施即服务(IaaS)的解决方案。
Docker是一个开源应用容器引擎,提供基于容器级虚拟化解决方案,同时也是平台即服务(PaaS)的重要组成部分。
提供一种方案,将Docker与Openstack进行集成,使Openstack也能基于Docker容器创建应用实例。
不但为openstack提供比直接创建VM更有效率的容器级虚拟化解决方案,也为PasS平台发展提供支持,为PaaS平台服务商提供更多选择。
关键词:Docker;container;PaaS;OpenStackDOIDOI:10.11907/rjdk.151572中图分类号:TP301文献标识码:A 文章编号文章编号:16727800(2015)0090046031 OpenStack与DockerOpenStack是一个开源云计算管理平台,由几个主要组件组合起来完成具体工作,该项目几乎支持所有类型云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。
OpenStack通过各种互补服务提供基础设施即服务(IaaS)的解决方案,为每个服务提供API以便进行集成。
Docker是由PaaS提供商dotCloud提供的基于LXC的开源高级容器引擎,整个项目基于Go语言开发,并遵从Apache 2.0开源协议。
Docker可在容器内部快速自动化部署应用,并可通过内核虚拟化技术(Namespaces及Cgroups等)提供容器资源隔离与安全保障。
以现实世界中货物运输作类比,集装箱解决了各种型号、规格尺寸的货物用不同运输工具进行运输问题。
发明Docker的初衷是将各种应用程序和其所依赖的运行环境打包成标准container/image,进而发布到不同平台上运行。
2 Docker特点及优势2.1 Docker特点Docker是基于Linux Container (LXC)技术发展而来的一种轻量级打包应用程序框架,结合了LXC技术特点,Docker具有以下特性:①密度大,启动关机速度快;②CPU/内存低消耗,省去GuestOS,节省更多CPU和内存资源;③隔离性好。
容器解耦了应用与操作系统,为应用分发提供可能,更适合SaaS。
它使用Namespace进程资源隔离(IPC,NET,PID,UTS,NS,USER),使用Chroot隔离根文件系统,并用Cgroup作资源限制;④所有容器共享内核,便于维护,所以无法做到彻底隔离,同时也带来安全性风险;⑤物美价廉,资源利用率高,所以应用运营成本比直接部署到OS要低很多;⑥跨云计算基础架构,不依赖IaaS层技术实现,无论是OpenStack还是AWS,只要有操作系统,即可创建容器;⑦隔离性不如虚拟机,如Netlink暂时不支持Namespace,所以导致不支持ISCSI存储;⑧无法在线迁移,所以最新推出的LXD要在LXC上添加等价虚机功能;⑨更高密度给网络设计带来了挑战。
2.2 Docker与VM的对比如图1所示,作为基于LXC技术构建的应用程序容器,Docker Container与普通虚拟机Image相比,最大区别是它并不包含操作系统内核。
普通虚拟机将整个操作系统运行在虚拟的硬件平台上,进而提供完整运行环境供应用程序运行,而Docker则直接在宿主平台上加载运行应用程序。
本质上,Docker在底层使用LXC启动一个Linux Container,通过Cgroup等机制对不同的container内运行的应用程序进行隔离、权限管理和quota分配等。
每个container拥有独立的命名空间(即资源),包括:PID进程、MNT文件系统、NET网络,IPC、UTS主机名等。
图1 Containers(Docker) vs VMs由于Docker通过操作系统层虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外操作系统开销,提高资源利用率,并且提升IO等方面的性能。
2.3 Docker优势根据Docker特点及Docker与VM比较,可看出Docker具有以下优点:(1)更快速的交付和部署。
对开发和运维人员而言,往往希望一次性创建或配置的应用程序可在任意地方正常运行。
开发者可使用一个标准镜像构建一套开发容器,完成开发后,运维人员可直接使用该容器部署代码。
Docker可快速创建容器,快速迭代应用程序,并使整个过程可视化,使团队中的其他成员更容易理解应用程序是如何创建和工作的。
Docker容器很轻,容器启动时间为秒级,节约了大量开发、测试、部署时间。
(2)更轻松迁移和扩展。
Docker容器几乎可在任意平台上运行,包括物理机、虚拟机、公有云、个人电脑、服务器等。
这种兼容性方便用户将应用程序从一个平台直接迁移到另外一个平台。
(3)管理更简单。
使用Docker,只需局部修改,就可替代以往大量的更新工作。
所有修改都以增量方式被分发和更新,从而实现自动化、高效管理。
3 Docker与OpenStack集成Docker基于LXC,利用LXC容器作为基础来抽象一个运行单一应用程序的容器。
LXD建立于LXC功能之上,其提供管理多个宿主容器的高级特性,包括动态迁移和创建在线运行状态镜像等功能。
LXD与OpenStack的结合使得私有云以及PaaS平台展现出更大优势,既可继承OpenStack的灵活性,又可发挥物理机性能,几乎没有额外虚拟机和内存开销。
这个新driver允许Linux容器被安排为OpenStack实例。
镜像通过OpenStack镜像服务Glance启动。
实例之间通讯基于Neutron网络功能,Docker在OpenStack中也可看作是实例的存在,类似于在KVM主机上运行虚拟机。
3.1 Docker与Nova集成在OpenStack中,Docker通过在Nova中以driver形式与OpenStack集成。
这种实现将Docker容器当作虚拟机使用。
但其目的并不是用来代替虚拟机,虚拟机有更好安全性和隔离性,Docker有更低损耗和更高的工作效率,在特定应用场合,虚拟机和容器可以相辅相成。
Nova Docker driver 与OpenStack集成流程如图2所示。
图2 nova docker driverNova Docker driver嵌入一个微小的HTTP客户端与 Docker内部REST API来通信,使用HTTP API控制Docker容器与获得容器信息。
通过配置Glance,Docker就能从Glance获得和上传镜像。
3.2 Docker与Heat集成在 OpenStack中,社区更倾向于使用Heat来协调使用Docker,而不是通过Nova driver将Docker容器当作虚拟机使用。
Nova Docker driver这种实现方式存在一定缺点,如标准API 扩展会使用虚拟机的一些特有功能,但这些功能对于Docker并不适用,而且将Docker当作虚拟机使用,Nova很难利用Docker已有功能,如连接容器(主要指Docker容器间通信)。
基于以上原因,Heat是更好的选择。
Heat在OpenStack 中提供资源协调功能,与AWS 的 CloudFormation兼容,允许用户上传描述资源的模板。
使用Heat插件机制,用户可以基于传统OpenStack部署方式部署和管理Docker容器。
Heat插件已经被OpenStack 社区接受,包含在Icehouse版本中。
举例说明如何使用Heat协调使用Docker:description:Single compute instance running cirros in a Docker container.resources:my_instance:type:OS::Nova::Serverproperties:key_name:ewindisch_keyimage:ubuntu-preciseflavor:rgeuser_data:#include https://get.docker.iomy_docker_container:type:DockerInc::Docker::Containerdocker_endpoint:{ get_attr:[ my_instance,first_address ]}image:cirros图3 heat docker plugin在上例中,只需要添加更多类似“my_docker_container”片段,就可创建多个容器并将它们连接起来,它们不受OpenStack API限制,可以充分利用Docker Remote API。
3.3 Docker与Cloud Foundry集成Cloud Foundry是VMware推出的第一个开源PaaS云平台,其支持多种框架、语言、运行环境、云平台及应用服务,并建立在IaaS平台OpenStack上。
开发人员能通过Cloud Foundry 在极短时间内进行应用程序部署和扩展,无需担心任何基础架构问题。
应用程序通常依赖于服务(例如:数据库、消息传递、第三方SaaS提供商运行)、存储数据和推动移动通知等。
除了为开发人员提供一个简单、快捷部署应用程序的方式外,Cloud Foundry还定义了服务实例。
当Cloud Foundry开发者定义并绑定一个服务到应用程序,负责提供服务的实例就称之为“Service Broker”。
“Service Broker”告知Cloud Foundry服务的目录和计划,并接收Cloud Foundry生命周期的调用,包括创建、删除、绑定和解除。
代理将这些调用传递给服务本身,服务提供者决定服务如何实现,Cloud Foundry只要求服务提供者实现“服务代理API”。
Containers Service Broker允许给用户提供的服务运行在绑定了应用程序的容器Docker 里,这些任务包括:用随机凭证提供一个服务容器;绑定一个服务容器到应用程序;从应用程序取消服务的容器绑定,释放一个服务容器;显示服务容器管理面板。
4 结语将Openstack与Docker相结合,前者用于管理整个数据中心,KVM用于多租户的计算资源管理,后者用于应用程序打包部署,该结合相对于单纯使用虚拟机有更高资源利用率,可秒级部署,跨平台打包部署应用。
在众多PaaS平台产品中发展迅速,获得社区认可与支持,与多个知名项目合作集成。
而与Heat项目的集成,为打通IaaS、PaaS平台提供了很好途径。
惠普最新推出的基于Cloud Foundry的PaaS平台Helion Development platform,也将Docker应用于HelionOpenStack平台上。