个人登录
数狐在线-做最好的在线学习社区java c# liferay jsp
Docker重新定义的JVM虚拟机 - 让应用基于云架构自由部署
北鼎K105养生壶 进口加厚玻璃水果茶花草茶煎药壶电水壶养身壶
    2018-3-3 11:8:30    作者: 数狐在线      进入评论页

Docker可以让我们快速开发并且可以让我们进行持续保持一致性的部署和整合,目前还没有类似的技术可以做到,可以说Docker平台使每个开发人员都应该熟悉的平台。

本文章我们将解释为什么Docker对开发者来说很重要,并且带领你安装Docker,并部署应用到Docker,而且还会掩饰如何把Docker整合到你的build过程中。

 Docker有关术语的快速浏览

Docker有其自身的一些专有术语,本文章都会用到,让我们花几分钟来熟悉这些术语吧:

  • Docker engine: 这是运行在你产品机器上的进程,该进程位于Docker应用和底层的操作系统与硬件之间。
  • Dockerfile: 这是用来创建一个Docker image的文本文件,包括了一些用到的命令或指令说明。
  • Docker image: 这是建立一个Dockerfile和执行其内部命令后的成果,它是从一个根操作系统开始创建,安装应用,并执行一些指令和命令,以确保可以运行你部署的应用。一个Docker image 可以被当作Docker容器的基础,也是一个Docker容器的静态模版。
  • Docker container: Docker image类似一个模板(使从包括一个正确操作系统,应用和用来建立image的命令集合开始创建的),而容器即是这个模版的实际的运行实例。
  • Docker host: 是运行Docker引擎的物理主机或虚拟机,它管理Docker容器的DockerHub.
  • DockerHub: 是Docker image的集合库,你可以想像成这类似Git与GitHub 之间的关系。

介绍Docker


十多年前软件应用一般都是庞大而且复杂的,并且被部署到大型机上,在java世界,我们开发了包含 EJB和WARs的EARs 包,然后我们把它们部署到复杂的应用服务器上,我们所做的就是设计我们的应用,让它可以在大型机上运行,并尽可能的确保机器上的所有资源对我们可用。


在2000年初的时候,伴随云概念的出现,开发人员开始使用虚拟机和服务器集群来放大应用的性能以达到我们用户新增的需求。部署应用实际上必须先经过好的设计过程,而应用的设计理念已经不同与过去了。轻量级,面向服务的应用成为了新的标准,我们把软件设计为相互可以连接互动的一组服务,每个组件都尽可能的保持无状态,不含有状态信息。这样的设计理念要优与仅仅从垂直方向不断放大一台单独服务器的处理能力,开发者与架构师开始思考水平扩展的方案:如何把一个独立的应用部署到一组轻量级的机器上。


Docker把这样的理念更加推进了,它在应用与底层的硬件之间提供了一个轻量级的服务层,Docker把应用当作主机系统上的进程来运行。下图比较了传统虚拟机与Docker之间的区别。


Comparing a VM to Docker.


传统的虚拟机在主机系统上运行一个管理系统(hypervisor),在它的帮助下可以在虚拟机上运行一个完整版本的虚拟操作系统,虚拟操作系统然后管理可以运行一个应用所需的库或二进制程序。

而Docker则是提供了一个Docker引擎,它类似在主机操作系统上运行的虚拟设备,Docker引擎可以把在Docker容器内对操作系统的调用转换为对主机系统的本地调用指令。一个Docker image则是基于容器生成的系统模版,包括了一个精简的操作系统层,和运行应用所需的二进制程序和库。

这个区别看上去不是太明显,但是在实际中,却体现出了截然不同的运行效果。


 理解进程虚拟化


让我们看下在虚拟机上的操作系统,我们看下虚拟机上的资源,比如CPU和内存吧,当我们运行Docker 容器的时候,我们可以直接看到主机上的资源,我们可以说Docker更类似一个进程虚拟平台,而不是一个机器虚拟平台,从根本上讲,你的应用是按照自包含和独立进程的方式运行的,Docker通过实现了一组Linux结构,达到了这样的自包含和独立运行的效果,例如通过cgroups和namespaces名字空间这样的概念,来确保每个进程都可以在操作系统上按照独立的方式运行,并成为一个相对独立不受影响的运行单元。

因为被转换的应用是类似进程的方式在主机上运行的,它们的设计则不同与运行在虚拟机上的应用,我们也许会在一个单独的虚拟机上运行Tomcat和MySQL数据库,但是Docker却是在它自己的容器内运行应用服务器和数据库服务,这允许Docker可以在主机操作系统上更好管理一个独立的进程,把进程当作自包含的独立运行单元。这也意味我们为了达到更好的使用Docker我们需要把我们的应用设计成一组通用颗粒状的服务,例如微服务集。

在Docker上的微服务(Microservices)

简单说,微服务是一个软件的框架风格,应用了模块化的方法来进行系统建设,在微服务的架构中,复杂的应用被分割成小的,独立的处理过程,每个处理过程可以被当作一个进程,来执行一个或多个明确的具体的任务,然后通过中立的开发语言APIs来进行进程之间的相互交流。

微服务是设计良好的,封装了执行一个独立功能的服务集,或是相关的功能集,例如如果你正在管理一个用户的配置或是购物筐,那么就分别设计用户配置服务和购物服务,而不是打包到一个所谓的用户服务力,因为用户服务太宽,粒度太大,建立微服务,就意味你需要建立web服务,通常是RESTful web 服务,在java上,你可以打包为 war 文件,并部署它们到容器,例如Tomcat,然后在我们的Docker上运行Tomcat和你部署成功的服务。


 安装Docker

 下载 Docker 查看合适的 MacWindows, or Linux 安装向导

在我们正式学习Docker之前,让我们先安装好本地的开发环境,如果你正在使用Linux那么就很好了:你可以直接安装Docker并且可以在之后直接运行,对与那些使用Windows或Mac的人来说,可以通过一个Docker Toolbox工具来让Docker可用,该工具可以使用Oracle的 Virtual Box技术来安装一个虚拟机,可以运行带Docker虚拟设备的Linux.然后我们就可以使用Docker客户端来发送命令到Docker 虚拟设备,并保证命令被执行。注意的是,你不需要管理虚拟机,你仅仅安装toolbox和在命令行下执行Docker命令。

我正在使用Mac,所以我下载了Mac 版本的Docker Toolbox并且运行了安装文件,一旦安装成功,我可以运行Docker的快速启动终端,该终端可以启动Virtual Box image并且提供一个命令行界面,对于Windows用户过程大致一样,可以看下Windows平台下的安装指导文件。

DockerHub: The Docker image 库

在我们开始使用Docker之前,花几分钟访问下DockerHub, 这是官方的Docker images库,你会发现这里管理了官方的images和第三方建立的独立的images集合,你会发现所基于的操作系统包括CentOS,Ubuntu和Fedora等等,也包括专门为Java 准备的配置images,及 tomcat,Jetty等等。你也可以发现很多开箱即用的流行应用,例如MySQL,MongoDB,Neo4j,Redis,Couchbase,Cassandra,Memcached,Postgres,

Nginx,Node.js,WordPress,Joomla,PHP,Perl,Ruby等等。在你建立一个image之前,请先查看,是否在 DockerHub 上是否已经包含!


作为一个练习,我们可以运行一个简单的CentOS image, 可以在你的 Docker Toolbox命令行下输入下列命令:

$ docker run -it centos


docker命令行,是你与Docker虚拟设备交互的用户界面,这里的run指令,就是告诉Docker下载并运行特定的image(如果该image还没安装到你机器上),另外你也可以只下载不运行,通过键入pull指令。这里有两个参数:i-告诉Docker  在交互的模式下运行image.  -t 告诉它生成一个TTY 脚本。注意非官方的image命名方式是用户名/image名 而官方则是省去了用户名,同时你也可以指定版本号,例如centos:7
默认情况下不含版本号的就是最新版的 image.


当你执行了$docker run -it centos,你应该看到Docker首先下载该image,然后,会出现如下的类似输出:

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

因为是在交互方式下运行该容器,因此我们可以使用一个根命令脚本,我们可以浏览该操作系统,然后我们可以通过键入exit 来退出。

你可以看到你应下载的所有image 通过执行docker images:

$ 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下运行Tomcat


在Docker 下运行一个Tomcat实例,要比刚刚启动CentOS复杂,需要发出下列命令:

$ docker run -d -p 8080:8080 tomcat



该例子,我们把tomcat当作一个守护进程来运行,使用了-d参数。我们使用了8080端口在我们的Docker容器,也可以说在我们的 Docker 主机(the Virtual Box 虚拟机),当你运行该命令后,你会看到如下输出:

 docker run -d -p 8080:8080 tomcat bdbedc47836028b9d1fee3d4a96eee4d89838d7b6b0b4298d9e5a7d117292003 

看上去比较长的16进制数字,包含了容器的id,我们后面会用到我们可以 通过使用docker ps来查看所有正在被docker运行的进程:

 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bdbedc478360 tomcat "catalina.sh run" 3 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp focused_morse 

我们注意到上面的容器id是12个字符的,该id非常长,不容易记忆,所以Docker 允许你指定唯一你的id给它,例如你可以指定bdb,这已经足够标记一个Docker实例了,为了查看Tomcat什么时候完成了装载,你可以查看catalina.out文件,也可以使用docker logs命令,并带-f参数,来查看:


$ docker logs -f bdb 09-Sep-2015 02:15:21.611 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.24 ... 09-Sep-2015 02:15:25.137 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3188 ms 
退出日志文件,可以按 Ctr-C组合键。

关于测试和检索


为了测试Tomcat,你需要查看 Virtual Box  主机的 ip地址,当你开始启动Docker Quickstart 终端的时候,你会看到如下的输出:
docker is configured to use the default machine with IP 192.168.99.100

另外你也可以查看DOCKER_HOST  环境变量,来发现机器的ip地址:

DOCKER_HOST=tcp://192.168.99.100:2376

在 Docker  主机上打开浏览器窗口:

http://192.168.99.100:8080

你应该可以看到tomcat的标准启动页面.

Before we stop our instance, use the docker command line tool to learn a little more about our processes:

在结束我们今天的学习之前,我们在介绍几个关于我们进程的命令行工具:

  • docker stats CONTAINER ID 显示CPU,内存,和网络传输,为每个image.
  • docker inspect CONTAINER ID  显示image的配置
  • docker info 显示Docker 主机的信息。


当你结束的时候,你可以通过执行 docker stop命令来结束tomcat

$docker stop bdb.


你可以通过执行 docker ps -a 来确认 tomcat是否还在运行

$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bdbedc478360 tomcat "catalina.sh run" 26 minutes ago Exited (143) 5 seconds ago focused_morse 

重点是,你需要理解如何在 DockerHub 上发现 images,及如何下载和安装,如何查看运行的实例,如何查看实例的运行统计信息,日志,及如何停止一个实例。我们后续会介绍如何定义你自己的 Docker images.





官方微信服务号
进入评论页
合作企业