《用Docker重新定义Java虚拟化部署(基础篇)》由会员分享,可在线阅读,更多相关《用Docker重新定义Java虚拟化部署(基础篇)(6页珍藏版)》请在金锄头文库上搜索。
1、用Docker重新定义Java虚拟化部署(基础篇)Docker是一个用于构建、分发、运行分布式应用的开源平台。Docker化的应用可以在开发者的电脑上运行,并能够被部署到生产的云环境中,Docker正以前所未有的方式,在持续集成和持续部署中发挥着巨大作用。希云认为:在未来的工作中,Docker这个平台是每个开发者都应该熟悉的。开源Java项目把Docker带给Java开发者,后面将会解释为什么Docker对Java开发者那么重要,引导大家在Docker中安装并部署Java应用,并让大家看到如何把Docker集成到构建流程中。Docker技术快速指南Docker有它自己的术语,这些术语会在本文中
2、反复用到,请先花一些时间去熟悉它们: Docker引擎(Docker engine):在服务器上的一个守护进程,它是你和Docker应用与所依赖的操作系统的桥梁。 Dockerfile: 一个文本文件,内容是用于构建Docker镜像的指令。 Docker 镜像: 构建一个Dockerfile的产物,构建过程中执行Dockerfile中的命令,会生成一个镜像。它首先会基于一个根系统(基础镜像)构建,然后安装应用,接着执行一系列命令来准备启动应用的环境。Docker镜像作为Docker容器的基础,相当于容器的一个静态模块。 Docker 容器: 一个Docker镜像的运行时实例,Docker镜像类
3、似于模块的概念(从Dockerfile构建,这个Dockerfile包含了根系统,应用以及一系列构建镜像的命令),容器是那个镜像的一个实际能运行的实例。 Docker 宿主 : 一个物理机或者虚拟机,在此系统上运行着Docker引擎,维持着容器所依赖的Dockerhub。 DockerHub : 官方的Docker镜像仓库,把DockerHub想象为GitHub仓库,对于Git来说是中央仓库,DockerHub是官方保存及提供Docker镜像的中央仓库。 cSphereHub: 希云官方的Docker微镜像仓库,DockerHub中有非常多的镜像,但cSphereHub中存放了精心挑选出来的,
4、并精心制作的镜像。Docker简介在二十多年前,软件应用曾经是非常庞大并且复杂的,会被部署在大型的计算机上。在Java的世界里边,我们开发的企业软件包(EAR)中,包含企业JavaBean(EJB)和web组件(WAR),然后会部署在大型应用服务器上。为了能尽量有效地利用这些大型计算机上的资源,我们会尽最大能力去设计这些应用。在21世纪早期,随着云计算的出现,开发者们开始使用虚拟机以及服务器集群,去扩展应用以满足需求。要以虚拟化的方式部署应用,应用必须被设计得与传统方式有所不同,轻量级,面向对象的应用成为新标准。我们学会了把软件做成各种能互联的服务集合,将各组件尽可能地设计成无状态。可扩展架构
5、的概念和实现都发生了变化,不再是依赖于单台大型计算机的垂直扩展,开发者和架构师开始思考以水平扩展方式实现:如何把单个应用部署到数个轻量级的计算机上。Docker的出现使虚拟化更向前迈进了一步,提供了一个轻量级的层,处于应用和所依赖的硬件中间,Docker把应用当作是宿主系统的一个进程来运行。图一对比了传统虚拟机和Docker。图 1. 虚拟机与Docker的比较传统的虚拟机会在宿主系统上运行着一个虚拟机监视器,并在虚拟机中运行着一个完整的客户系统(GuestOS),应用依赖的所有包都在客户系统中。相反地,Docker有个Docker引擎,也是一个运行在宿主系统的守护进程。Docker引擎把Do
6、cker容器中的系统调用,翻译成宿主系统的原生调用。一个Docker镜像,作为Docker容器的创建模板,只是包含了操作系统的最小层,以及仅仅是应用所需要的依赖库。大家看起来感觉这些差异似乎不大,但实际上却是天壤之别。Docker的优势,很大一部分都是在这点体现出来的!理解进程虚拟化我们仔细分析一下虚拟机中的操作系统,会留意到虚拟机中的资源,例如CPU和内存。但当我们运行一个Docker容器,我们会直接看到宿主机上的资源。我把Docker看成是进程级的虚拟化平台,而不是系统级的虚拟化平台。基本上,应用是作为一个独立的自包含进程运行在宿主机上,Docker通过借助着Linux上几个强大的组件,实
7、现了隔离性,确保每个进程都是操作系统上的独立进程。因为Docker化的应用与宿主机上的进程运行方式类似,所以设计上也和虚拟机中的应用不同。举个例子说,我们通常会在一个虚拟机上运行Tomcat和MySQL数据库,但Docker的实践中,我们会把app服务器与数据库分别部署,各自运行在不同的容器中。这样让Docker更好地管理宿主系统上的独立单元,这意味着要更有效率地使用Docker,我们需要以适当的粒度设计应用,例如微服务的方式。Docker中的微服务简单来说,微服务是一种可以促进系统模块化的架构方式。在微服务架构中,复杂的应用以更小的独立进程组成,各个进程有一个或多个特定的功能,应用与语言无关
8、的API和其他进程通信。微服务是通过粒度非常小,高度解耦的服务集合,来提供单一或多个相关联的功能。例如,如果你正在管理着一个用户中心和购物车,那你很可能是选择把它们设计成独立的服务,如用户中心服务和购物车服务;而不是把两个模块打成一个包作为一个服务运行。更具体来说,使用微服务意味着构建web services,而且是最常见的RESTful web service ,并把它们按功能分组。在Java中,我们会把这些服务打成WAR包,并部署到一个容器中,例如Tomcat,然后运行Tomcat和Docker容器中的服务。安装Docker在我们深入研究Docker之前,先让我们把本地环境搭建起来。如果你
9、正在使用Linux系统,那非常好,你可以直接安装并运行Docker。对于那些使用Windows或者Mac的用户来说,Docker可以通过一个叫Docker Toolbox的工具来使用,这个工具会安装一个虚拟机(使用Oracle的Virtual Box),这个虚拟机中会运行着包含Docker守护进程的Linux系统。我们可以使用Docker客户端把指令发送给守护进程处理,注意,你不需要管理这个虚拟机,只要安装这个工具并执行Docker命令行工具即可。开始从Mac,Windows,或Linux相应的文档里下载Docker。我的电脑是Mac,所以我下载并运行了Mac版的Docker Toolbox安
10、装包,之后我运行了Docker Quickstart终端,这样会启动一个Virtual Box镜像和一个命令行终端。这个安装过程与Windows下的基本相同,更多请参考Windows版的文档。DockerHub: Docker的镜像仓库我们开始使用Docker之前,先花几分钟去访问一下cSphereHub,这个镜像仓库。浏览一下cSphereHub,你会发现上边有数个镜像,精挑细选的微镜像。如果使用cSphere管理平台,添加微镜像仓库后,仓库里面包含了docker官方的一些镜像。镜像仓库中有基础系统,如Alpine, Ubuntu,或者Java相关的如Tomcat, jdk, jre等等。你
11、还可以发现几乎所有流行的应用上边都会有,包括MySQL, MongoDB, Neo4j, Redis, Memcached, Postgres, Nginx, Node.js, WordPress, PHP, Perl, Ruby等等。在你打算自行构建一个新镜像之前,请确认cSphereHub,或者DockerHub上有没有。作为一个练习,我们运行一个简单的CentOS镜像,在Docker Toolbox的命令行中输入:$ docker run -it centos这个docker命令是你与Docker守护进程的主要接口。run指令告诉Docker去下载并运行指定的镜像(假设在本地还没有这个镜
12、像)。又或者,你可以用pull命令直接下载一个镜像但不运行它。有两个参数:i 会让Docker用交互模式运行,t 会让它创建一个TTY终端。注意非官方的镜像使用既定的格式“用户名/镜像名”,而官方的镜像会省略用户名,所以我们只需要指定“centos ”来运行镜像即可。另外,也可以在镜像名后加“:版本号”指定版本号,例如,centos:7。每个镜像默认使用的都是最新版本,当前CentOS最新版本号是7.在运行$ docker run -it centos 之后,你会见到Docker开始下载这个镜像,完成后会见到类似以下的输出:$ docker run -it centosrootdcd69de8
13、9aad /#因为我们用了交互模式去运行,它显示了一个root用户的shell命令提示符。查看一下这个系统,然后使用exit退出。可以用docker images命令来查看系统中已下载好的镜像:$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEjava 8 5282faca75e8 4 weeks ago 817.6 MBtomcat latest 71093fb71661 8 weeks ago 347.7 MBcentos latest 7322fbe74aa5 11 weeks ago 172.2 MB你可以看到我已经有了最新版的CentOS、Tomcat和Java 8。未完待续.