Spring Boot工程发布到Docker

Posted 谷子弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot工程发布到Docker相关的知识,希望对你有一定的参考价值。

先聊聊闲话

搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系),

几十个application发布,代码修改,打包,发布,再上dev/staging/prod三个代码版本,时刻要保证他们三个的环境依赖一致,比如jdk,webserver,appserver,安全设置,数据库等,

不然就导致程序跑不起来。

另一个问题,企业通常会按照功能将webserver,appserver,dbserver,fileserver,batchserver,然后将每个应用分别部署至相应的server中去,

比如大家共享一台或几台app server,但经常会出现服务器报警,比如某个app把硬盘用光了,或者cpu使用率太高等等,造成整个server挂掉。

以下关于docker的介绍摘抄自这篇文章 -> http://www.mamicode.com/info-detail-1174856.html

所以虚拟机出现了,做了良好的资源隔离,不同用户之间不会相互影响。但是,虚拟机有缺点:创建速度慢,迁移起来麻烦,因为中间加了一层guest os,有了性能损耗,

很牛的物理机也就创建几十个虚拟机,太浪费了。

再聊聊Docker这个神器

Docker,比传统虚拟机更棒的实现轻量级的操作系统解决方案,

基础是 Linux 容器(LXC-Linux Container)等技术,在 LXC 的基础上 Docker 进行了进一步的封装,

让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,

而Docker 只需要启动 10 个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势。

  • 更快速的交付和部署

  对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

  • 更高效的虚拟化

  Docker 容器的运行不需要额外的 hypervisor(虚拟化管理程序)支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

  • 更轻松的迁移和扩展

  Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

Docker的局限

Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:

  • Docker是基于Linux 64bit的,无法在windows/unix或32bit的linux环境下使用
  • LXC是基于linux kernel的,因此container的guest系统只能是linux base的
  • 隔离性比KVM虚拟化方案还是有些欠缺,所有container公用一部分的运行库
  • 网络管理相对简单,主要是基于namespace隔离
  • cgroup的cpu功能相比KVM的等虚拟化方案相比难以度量
  • docker对disk的管理比较有限
  • container随着用户进程的停止而销毁,container中的log等用户数据不便收集

总之,选用container还是vm, 就是在隔离性和资源复用性上做权衡。

在Docker体系中,最关键的就是两个——Docker Registry(通过Docker Hub进行索引)以及Docker Engine,前者在远端(或称云端)负责收集与分发Docker的应用镜像(Images),后者则在客户端负责构建Docker应用容器,这明显就是一个云服务的AAS理念,当然用户也可以在自己的数据中心内部建立私有的Docker Registry,以方便在私有云内迅速生成自己的Docker集群,以应对灵活的、大规模的应用扩展需求。此时,也相当于在企业数据中心内部形成了一个云+端的Docker架构。

Docker在英语里的意思为“码头工人”,而其Logo就好似一艘酷似鲸鱼的大船运送一堆集装箱前往各地的码头。而从其理论上看,Docker就像是一个集装箱,利用LXC技术来整合不同规模、类型、层级的应用镜像,先通过集中汇总再有序的分发——每个码头就是一台服务器(或VM),大船就是Registry,码头的工人就是核心Engine,进行集装箱的装配,当然它还需要一系列的外围的支持(比如最重要的管理)。但从总体的 场景来说,Docker的名字还是非常贴切的。

Docker 关键字解析

Docker Image:

  Docker image是一个只读模板,用于创建Docker容器。Image中可以包含linux操作系统、Apache或者Web应用程序等等,用户可以下载已经创建好的Docker image,也可以创建Docker image给其他用户使用。每个image是由很多层组成,Docker通过Union File Systems将这些层绑定在一个image中。每个image都以一个初级image做为基础,然后通过操作指令在这些初级image上添加新层,操作指令可以是运行的命令、添加文件或目录或者创建可用操作环境等。这些操作指令都被保存在“Dockerfile”文件中。

Docker Container:

  Docker image的运行实例。Docker Containers可以运行、启动、停止或者被删除,每个container都是隔离的安全应用平台。

Docker registries:

  Docker registries用于保存Docker image,也分公用和私用二种。公用的Docker registry就是Docker Hub,用户也可以创建私有的Docker registry,为其他用户提供Docker images下载。

Dockerfiles:

  Dockerfile是对Docker Container创建过程的描述脚本。每个Dockerfile详细说明了开始的基础镜像,以及随后一系列在容器中运行的命令和添加到容器中的文件。Dockerfile也可以说明容器对外的端口,启动时的工作目录和缺省执行的命令。

LXC:(Linux Container)

  Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

VM:(Virtual Machines)

  指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

Host OS:

  指物理存在的计算机上运行的操作系统。宿主机操作系统。

Guest OS:

  指运行在VM上的操作系统。例如在一台安装了Windows NT的计算机上安装了Vmware,那么,HOST指的是安装Windows NT的这台计算机,其Host′s OS为Windows NT。VM上运行的是Linux,那么Linux即为Guest OS。

Hypervisor:

  Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。

  目前市场主要厂商及产品:VMware vSphere、微软Hyper-V、Citrix XenServer 、IBM PowerVM、Red Hat Enterprise Virtulization、Huawei FusionSphere、开源的KVM、Xen、VirtualBSD等。

Bootfs:(Boot File System)

  主要包含 bootloader 和 kernel, bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被卸载了. 

Rootfx:(Root File System)

  rootfs包含的就是典型 Linux 系统中的 /dev(外设访问接口信息),/proc(系统设备信息),/bin(系统工具集), /etc(APP配置信息) 等标准目录和文件。对于不同的linux发行版, bootfs基本是一致的, 但rootfs会有差别, 因此不同的发行版可以公用bootfs。

基于Docker的微服务架构

Docker的细粒度松耦合能够让我们用一个Docker容器装载一个场景功能,也就是按照功能角色分类,每个Docker里面装一个服务或应用,一个服务器上可以运行多个Docker,或者多个Docker分散到多个服务器上运行。整个项目架构可以按照业务逻辑的规划以细粒度的方式分散在各个Docker容器中,并根据HTTP REST API的方式进行整合联动。

此框架实现重点为,在项目前期通过详细的功能需求分析并按业务逻辑的耦合度划分成多个服务节点,依靠Docker的独立且低耦合特性在物理层面上实现项目的细粒度分解。

其优点是:

  • 1.可以根据用户的访问并发量在每个层次进行水平动态扩充,实现访问压力负载均衡。
  • 2.对业务逻辑的多层次划分可很大程度上提高项目的复用性。
  • 3.一旦将业务抽象成产品后,即可实现“用户按功能选购”的能力。
  • 4.由于Docker的开发环境封装特性,可以简化项目部署成本,减少运维人员工作负担。
  • 5.由于服务节点采用HTTP REST API的通讯方式,节点的实现可以采用不同运行时环境不同语言不同架构,比如可采用Spring,Play等多种架构方式。

  缺点为,在项目设计前期,需要花费较多的时间进行详细的业务逻辑划分及系统分析。

综上,将来微服务架构在企业必定会大面积应用,下面是简要的将spring boot 工程发布至Docker。

也有一份详细的英文的官方文档,https://spring.io/guides/gs/spring-boot-docker/

步骤:

1.下载Eclipse的Maven插件。

2.在Eclipse中选择SpringBoot-Docker模板。

3.创建SpringBoot-Docker项目

基于该模板创建SpringBoot项目后,编译后会生成Dockerfile文件及<项目名>.jar文件。

4.在Docker环境下生成Docker Image镜像文件

  由于已经有了Dockerfile文件及本项目的.jar文件,可以将其拷贝到虚拟机Docker环境中,并运行例如:docker build -t <example-service> . 指令,将Dockerfile描述编译成镜像文件,并进入本地Docker registries仓库中。

5.运行Docker Image文件,形成Container实例,与宿主机建立端口映射。

  运行例如:docker run -p 48080:8080 -d <example-service> 指令,启动该项目的Container实例。

6.在浏览器上访问宿主机的48080端口,通过REST API访问业务接口。

 

以上是关于Spring Boot工程发布到Docker的主要内容,如果未能解决你的问题,请参考以下文章

spring boot工程打成JAR包到服务器上运行

Spring Boot 2 - 初识与新工程的创建

新手快速生成Spring boot maven工程

Springboot:使用Intellij中的Spring Initializr来快速构建Spring Boot工程

一步步搭建 Spring Boot maven 框架的工程

Spring Boot自动配置原理(转)