用Docker重新定义Java虚拟化部署

摘要:Docker 是一个用于构建、分发、运行分布式应用的开源平台。Docker化的应用可以在开发者的电脑上运行,并能够被部署到生产的云环境中,Docker正以前所 未有的方式在持续集成和持续部署中发挥着巨大作用。希云认为:在未来的工作中,Docker这个平台是每个开发者都应该熟悉的。

 

Docker 是一个用于构建、分发、运行分布式应用的开源平台。Docker化的应用可以在开发者的电脑上运行,并能够被部署到生产的云环境中,Docker正以前所 未有的方式在持续集成和持续部署中发挥着巨大作用。希云认为:在未来的工作中,Docker这个平台是每个开发者都应该熟悉的。

开源Java项目把Docker带给Java开发者,后面会解释为什么Docker对Java开发者那么重要,引导大家在Docker中安装并部署Java应用,并让大家看到如何把Docker集成到构建流程中。

用Docker重新定义Java虚拟化部署

Docker技术快速指南

Docker有它自己的术语,这些术语会在本文中反复用到,请先花一些时间去熟悉它们:

* Docker引擎(Docker engine) :在服务器上的一个守护进程,它是你和Docker应用与所依赖的操作系统的桥梁。

* Dockerfile : 一个文本文件,内容是用于构建Docker镜像的指令。

* Docker 镜像 : 构建一个Dockerfile的产物,构建过程中执行Dockerfile中的命令,会生成一个镜像。它首先会基于一个根系统(基础镜像)构建,然后安装 应用,接着执行一系列命令来准备启动应用的环境。Docker镜像作为Docker容器的基础,相当于容器的一个静态模块。

* Docker 容器 : 一个Docker镜像的运行时实例,Docker镜像类似于模块的概念(从Dockerfile构建,这个Dockerfile包含了根系统,应用以及一系列构建镜像的命令),容器是那个镜像的一个实际能运行的实例。

* Docker 宿主 : 一个物理机或者虚拟机,在此系统上运行着Docker引擎,维持着容器所依赖的Dockerhub。

* DockerHub : 官方的Docker镜像仓库,把DockerHub想象为GitHub仓库,对于Git来说是中央仓库,DockerHub是官方保存及提供Docker镜像的中央仓库。

* cSphereHub : 希云官方的Docker微镜像仓库,DockerHub中有非常多的镜像,但cSphereHub中存放了精心挑选出来的,并精心制作的镜像。

Docker简介

在二十多年前,软件应用曾经是非常庞大并且复杂的,会被部署在大型的计算机上。在Java的世界里边,我们开发的企业软件包(EAR)中,包含企 业JavaBean(EJB)和web组件(WAR),然后会部署在大型应用服务器上。为了能尽量有效地利用这些大型计算机上的资源,我们会尽最大能力去 设计这些应用。

在21世纪早期,随着云计算的出现,开发者们开始使用虚拟机以及服务器集群,去扩展应用以满足需求。要以虚拟化的方式部署应用,应用必须被设计得 与传统方式有所不同,轻量级,面向对象的应用成为新标准。我们学会了把软件做成各种能互联的服务集合,将各组件尽可能地设计成无状态。可扩展架构的概念和 实现都发生了变化,不再是依赖于单台大型计算机的垂直扩展,开发者和架构师开始思考以水平扩展方式实现:如何把单个应用部署到数个轻量级的计算机上。

Docker的出现使虚拟化更向前迈进了一步,提供了一个轻量级的层,处于应用和所依赖的硬件中间,Docker把应用当作是宿主系统的一个进程来运行。图一对比了传统虚拟机和Docker。

用Docker重新定义Java虚拟化部署

图 1. 虚拟机与Docker的比较

传统的虚拟机会在宿主系统运行着一个虚拟机监视器,并在虚拟机中运行着一个完整的客户系统(GuestOS),应用依赖的所有包都在客户系统中。

相反地,Docker有个Docker引擎,也是一个运行在宿主系统的守护进程。Docker引擎把Docker容器中的系统调用,翻译成宿主系 统的原生调用。一个Docker镜像,作为Docker容器的创建模板,只是包含了操作系统的最小层,以及仅仅是应用所需要的依赖库。

大家看起来感觉这些差异似乎不大,但实际上却是天壤之别。Docker的优势很大一部分都是在这点体现出来的!

理解进程虚拟化

我们仔细分析一下虚拟机中的操作系统,我们会留意到虚拟机中的资源,例如CPU和内存。但当我们运行一个Docker容器,我们会直接看到宿主机 上的资源。我把Docker看成是进程级的虚拟化平台,而不是系统级的虚拟化平台。基本上,应用是作为一个独立的自包含进程运行在宿主机上,Docker 通过借助着Linux上几个强大的组件,实现了隔离性,确保了每个进程都是操作系统上的独立进程。

因为Docker化的应用与宿主机上的进程运行方式类似,所以设计上也和虚拟机中的应用不同。举个例子说,我们通常会在一个虚拟机上运行 Tomcat和MySQL数据库,但Docker的实践中,我们会把app服务器与数据库分别部署,各自运行在不同的容器中。这样让Docker更好地管 理宿主系统上的独立单元,这意味着要更有效率地使用Docker,我们需要以适当的粒度设计应用,例如微服务的方式。

Docker中的微服务

简单来说,微服务是一种可以促进系统模块化的架构方式。在微服务架构中,复杂的应用以更小的独立进程组成,各个进程有一个或多个特定的功能,应用与语言无关的API和其他进程通信。

微服务是通过粒度非常小,高度解耦的服务集合,来提供单一或多个相关联的功能。例如,如果你正在管理着一个用户中心和购物车,那你很可能是选择把它们设计 成独立的服务,如用户中心服务和购物车服务;而不是把两个模块打成一个包作为一个服务运行。更具体来说,使用微服务意味着构建web services,而且是最常见的 RESTful web service ,并把它们按功能分组。在Java中,我们会把这些服务打成WAR包,并部署到一个容器中,例如Tomcat,然后运行Tomcat和Docker容器中的服务。

安装Docker

在我们深入研究Docker之前,先让我们把本地环境搭建起来。如果你正在使用Linux系统,那非常好,你可以直接安装并运行Docker。对 于那些使用Windows或者Mac的用户来说,Docker可以通过一个叫Docker Toolbox的工具来使用,这个工具会安装一个虚拟机(使用Oracle的Virtual Box),这个虚拟机中会运行着包含Docker守护进程的Linux系统。我们可以使用Docker客户端把指令发送给守护进程处理,注意,你不需要管 理这个虚拟机,只要安装这个工具并执行Docker命令行工具即可。

开始从 MacWindows ,或 Linux 相应的文档里 下载Docker

我的电脑是Mac,所以我下载并运行了Mac版的Docker Toolbox安装包,之后我运行了Docker Quickstart终端,这样会启动一个Virtual Box镜像和一个命令行终端。这个安装过程与Windows下的基本相同,更多请参考Windows版的文档。

DockerHub: Docker的镜像仓库

我们开始使用Docker之前,先花几分钟去访问一下 cSphereHub ,这个镜像仓库。浏览一下cSphereHub,你会发现上边有数个镜像,精挑细选的微镜像。如果使用cSphere管理平台,添加 微镜像仓库 后,仓库里面包含了docker官方的一些镜像。镜像仓库中有基础系统,如Alpine, Ubuntu,或者Java相关的如Tomcat, jdk, jre等等。你还可以发现几乎所有流行的应用上边都会有,包括MySQL, MongoDB, Neo4j, Redis, Memcached, Postgres, Nginx, Node.js, WordPress, PHP, Perl, Ruby等等。在你打算自行构建一个新镜像之前,请确认cSphereHub,或者DockerHub上有没有。

作为一个练习,我们运行一个简单的CentOS镜像,在Docker Toolbox的命令行中输入:

sh
$ docker run -it centos

这个docker命令是你与Docker守护进程的主要接口。run指令告诉Docker去下载并运行指定的镜像(假设在本地还没有这个镜像)。 又或者,你可以用pull命令直接下载一个镜像但不运行它。有两个参数:<code>i</code> 会让Docker用交互模式运行,<code>t</code> 会让它创建一个TTY终端。注意非官方的镜像使用既定的格式"用户名/镜像名",而官方的镜像会省略用户名,所以我们只需要指 定"<code>centos</code>"来运行镜像即可。另外,也可以在镜像名后加“:版本号”指定版本号,例 如,<code>centos:7</code>。每个镜像默认使用的都是最新版本,当前CentOS最新版本号是7.

在运行<code>$ docker run -it centos </code>之后,你会见到Docker开始下载这个镜像,完成后会见到类似以下的输出:

sh
$ docker run -it centos
[root@dcd69de89aad /]#

因为我们用了交互模式去运行,它显示了一个root用户的shell命令提示符。查看一下这个系统,然后使用<code>exit</code>退出。

可以用<code>docker images</code>命令来查看系统中已下载好的镜像:

sh
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
java 8 5282faca75e8 4 weeks ago 817.6 MB
tomcat latest 71093fb71661 8 weeks ago 347.7 MB
centos latest 7322fbe74aa5 11 weeks ago 172.2 MB

你可以看到我已经有了最新版的CentOS、Tomcat和Java 8。

未完待续...

感谢您阅读此文!下周我们将分享《用Docker重新定义Java虚拟化》的实战篇和回顾篇,请保持关注!

如了解更多docker相关知识,请观看培训视频: https://csphere.cn/training!

如需要docker相关产品,请访问希云官网首页: https://csphere.cn!

扩展阅读

Docker 架构私有云的机遇和挑战
微博 Docker 化混合云平台大剖析
【深入浅出容器云】关于容器云你不得不知的十大特性
年度最佳硬件、软件、开发工具和云服务
.NET开发者启程Docker之路

为您推荐

我的碎碎念:Docker入门指南
为 Java 程序员准备的 Go 入门 PPT
分享海量 iOS 及 Mac 开源项目和学习资料
如何使用 Docker 组件开发 Django 项目?
为 Java EE 应用提供的 9 种 Docker 方法

更多

Docker
操作系统