使用maven集成docker构建和部署Spring Boot 应用
2016-11-25 00:00
1151 查看
摘要: 使用maven集成docker构建和部署Spring Boot 应用
但是docker总归不是一个资源优化技术,所谓“轻”也只是相对于传统虚拟机而已。
相对于传统的虚拟技术,docker提供的容器化方案优势在于:
虚拟化额外的资源占用更少了
部署、启动和销毁的时间更短了
部署、启动和销毁的工作量更少了
但相对于不使用容器化方案来说:
占用的资源更多了(可以忽略)
启动、销毁的时间增加了(可以忽略)
部署的时间和工作量变少了
也就是说,相对于不使用容器化的方案,docker在效率方面主要的贡献是可以在不增加性能消耗的情况下,降低部署服务的工作量,提高部署效率。
隔离了什么?用到最多的有四类:
cpu:不同虚拟机的计算资源不混用
内存:不同虚拟机的内存不共享
网络:每个虚拟机有自己的网络栈
文件系统:每个虚拟机独享自己的文件系统
传统的虚拟化消耗了一些系统资源,换来了对cpu、内存、网络和文件系统的隔离。换句话说,一个服务不会影响另一个服务的资源。
于是自然的会想到,一个服务的依赖可以做成一套随着服务一起发布的文件系统,用时加载、停时弃置;也可以把需要不同资源的服务可以部署在一起以节约成本,等等,隔离给了虚拟化真正的价值。
又是显而易见的,要提高资源利用率,就得降低资源的浪费,而浪费来源于两方面:服务自身和依赖环境对资源的浪费、服务没有利用到的空闲资源。
一般来说,一个服务内聚越高,对资源的浪费就越少(全人类脑后插管连到母体大概是最省资源的吧……),但现实情况下资源被拆分成一台台计算机,服务也要跟着拆分。当服务的拆分不能保证和资源拆分相同的粒度时,空闲资源就产
3ff0
生了。
服务拆分的粒度越粗,与资源不匹配的矛盾会越激烈;拆分粒度越细,带来的资源浪费也就越多。另一方面,服务内聚提高会带来更高的更高的耦合度和风险,反之会带来更高的部署和维护成本,等等。
所以服务拆到多细这件事本身没有定论,docker能做到的只是降低其中一两个砝码的权重而已。
于是需要有一种机制,让可用的服务变成被使用的服务,有很多方法可以实现,比如通过配置文件指定访问的ip和端口,大部分场景下,手工配置的方式已经足够了。
但是伴随着系统越来越复杂,配置也越来越负责,渐渐的手工配置已经有些吃力了。
而伴随着虚拟化和容器化,配置的修改也越来越频繁和复杂,甚至已经超过了启动服务本身的难度。单纯启动一个服务没有意义,需要通过一个足够可靠和高效的机制把“可用”的服务变成“被用”的服务,服务发现担当了这个任务。
更高效的服务部署、启动方式。
对cpu、内存、网络和文件系统的简单隔离。
由于docker本身带来了这两点好处,通过docker和相关的生态系统,可以更简单的实现:
系统监控和管理对象由“机器”改为抽象的“资源”
基于对资源的抽象,提供更灵活的服务部署、调度机制
好了 前奏结束!废话不多说 直接上实战
Spring-boot的构建和docker的下载就不用多说了 ~~
1.开启远程服务
vim /lib/systemd/system/docker.service修改DOCKER_OPTS 2.绑定host、指定私有registry(可选)、指定mtu
2.重启docker服务
3.将docker服务注入到构建服务器 导入环境变量~
4.配置私有镜像仓库B的授权信息
在maven的本地配置文件settings.xml中根节点下增加如下配置: 这个文件一般会放在~/.m2或者$MAVEN_HOME/conf目录下。 没有设置私有镜像库可略过这一步
5.在pom.xml中增加docker-plugin 用于docker镜像构建~ 并指定构建的Dockerfile
6.编写Dockerfile 鉴于只是一个简单的案例 构建过程就简单写点 基于JDK8环境
7.基本设施完毕啦 开始构建镜像 走起~
当你看到以下信息打印时 你已经成功一大半了 因为已经正在下载所需要的依赖了
8.构建完毕 不要慌张 查看镜像是否构建成功!
9.我相信你已经成功了 如果没成功 从头再来 哈哈哈 开启容器 启动你的spring boot应用把~~
Docker 简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。1.容器化与轻量
一谈起docker总是会在各种地方看到轻量这个词,甚至会有一种通过docker启动一个服务会节省很多资源的错觉。但是docker总归不是一个资源优化技术,所谓“轻”也只是相对于传统虚拟机而已。
相对于传统的虚拟技术,docker提供的容器化方案优势在于:
虚拟化额外的资源占用更少了
部署、启动和销毁的时间更短了
部署、启动和销毁的工作量更少了
但相对于不使用容器化方案来说:
占用的资源更多了(可以忽略)
启动、销毁的时间增加了(可以忽略)
部署的时间和工作量变少了
也就是说,相对于不使用容器化的方案,docker在效率方面主要的贡献是可以在不增加性能消耗的情况下,降低部署服务的工作量,提高部署效率。
2. 虚拟化与隔离
这里先抛掉神乎其神的docker,考虑一下传统的虚拟化技术。传统的虚拟化技术在牺牲了性能之后换来了什么?最大收益大概是更好的隔离性。隔离了什么?用到最多的有四类:
cpu:不同虚拟机的计算资源不混用
内存:不同虚拟机的内存不共享
网络:每个虚拟机有自己的网络栈
文件系统:每个虚拟机独享自己的文件系统
传统的虚拟化消耗了一些系统资源,换来了对cpu、内存、网络和文件系统的隔离。换句话说,一个服务不会影响另一个服务的资源。
于是自然的会想到,一个服务的依赖可以做成一套随着服务一起发布的文件系统,用时加载、停时弃置;也可以把需要不同资源的服务可以部署在一起以节约成本,等等,隔离给了虚拟化真正的价值。
3. 微服务与弹性调度
接下来的问题是,怎么更大限度的提高资源的利用率。又是显而易见的,要提高资源利用率,就得降低资源的浪费,而浪费来源于两方面:服务自身和依赖环境对资源的浪费、服务没有利用到的空闲资源。
一般来说,一个服务内聚越高,对资源的浪费就越少(全人类脑后插管连到母体大概是最省资源的吧……),但现实情况下资源被拆分成一台台计算机,服务也要跟着拆分。当服务的拆分不能保证和资源拆分相同的粒度时,空闲资源就产
3ff0
生了。
服务拆分的粒度越粗,与资源不匹配的矛盾会越激烈;拆分粒度越细,带来的资源浪费也就越多。另一方面,服务内聚提高会带来更高的更高的耦合度和风险,反之会带来更高的部署和维护成本,等等。
所以服务拆到多细这件事本身没有定论,docker能做到的只是降低其中一两个砝码的权重而已。
4. 集群管理与服务发现
在一个资源上启动了服务之后,接下来的问题是:启动了这个服务有什么用?因为在启动服务之后,服务只是“可用”的,并没有提高资源的利用率。于是需要有一种机制,让可用的服务变成被使用的服务,有很多方法可以实现,比如通过配置文件指定访问的ip和端口,大部分场景下,手工配置的方式已经足够了。
但是伴随着系统越来越复杂,配置也越来越负责,渐渐的手工配置已经有些吃力了。
而伴随着虚拟化和容器化,配置的修改也越来越频繁和复杂,甚至已经超过了启动服务本身的难度。单纯启动一个服务没有意义,需要通过一个足够可靠和高效的机制把“可用”的服务变成“被用”的服务,服务发现担当了这个任务。
5. docker与生态系统
那么,总结一下docker本身带来了什么:更高效的服务部署、启动方式。
对cpu、内存、网络和文件系统的简单隔离。
由于docker本身带来了这两点好处,通过docker和相关的生态系统,可以更简单的实现:
系统监控和管理对象由“机器”改为抽象的“资源”
基于对资源的抽象,提供更灵活的服务部署、调度机制
好了 前奏结束!废话不多说 直接上实战
Spring-boot的构建和docker的下载就不用多说了 ~~
1.开启远程服务
vim /lib/systemd/system/docker.service修改DOCKER_OPTS 2.绑定host、指定私有registry(可选)、指定mtu
ExecStart=/usr/bin/docker daemon -H unix:///var/run/docker.sock -H 0.0.0.0:2376 --insecure-registry=10.20.0.215 --mtu 1400
2.重启docker服务
service docker restart
3.将docker服务注入到构建服务器 导入环境变量~
export DOCKER_HOST=tcp://A:2376
4.配置私有镜像仓库B的授权信息
在maven的本地配置文件settings.xml中根节点下增加如下配置: 这个文件一般会放在~/.m2或者$MAVEN_HOME/conf目录下。 没有设置私有镜像库可略过这一步
<servers> <server> <id>docker-hub</id> <username>yiming33</username> <password>xxxxxxx</password> <configuration> <email>yiming33@163.com</email> </configuration> </server> </servers>
5.在pom.xml中增加docker-plugin 用于docker镜像构建~ 并指定构建的Dockerfile
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.3</version> <configuration> <maintainer>YiMing</maintainer> <dockerHost>http://192.168.122.1:2376</dockerHost> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> //没有选定镜像仓库可不写 <serverId>docker-hub</serverId> <registryUrl>http://B:5000/v1/</registryUrl> </configuration> </plugin>
6.编写Dockerfile 鉴于只是一个简单的案例 构建过程就简单写点 基于JDK8环境
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD myProject*.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] EXPOSE 8005
7.基本设施完毕啦 开始构建镜像 走起~
mvn install docker:build
当你看到以下信息打印时 你已经成功一大半了 因为已经正在下载所需要的依赖了
8.构建完毕 不要慌张 查看镜像是否构建成功!
docker images
9.我相信你已经成功了 如果没成功 从头再来 哈哈哈 开启容器 启动你的spring boot应用把~~
docker run -p 8005:8005 -it ...myProject
相关文章推荐
- 第一个SpringBoot web 应用使用maven构建Docker镜像并容器化运行
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用Docker部署Spring Boot的应用示例
- 使用 Docker 部署 Springboot 应用
- 使用Docker部署Spring Boot 应用 Dockerfile方式
- 用 Docker 构建、运行、发布来一个 Spring Boot 应用
- 使用Overcast搭建spring boot应用集成测试环境
- eclipse 使用maven 构建springboot+dubbo+zookeeper 构建soa服务(面向服务架构)
- 用_Docker、Gradle_来构建、运行、发布一个_Spring_Boot_应用
- 使用Docker部署 spring-boot maven应用的方法
- Git+Spring-boot+Docker+ Maven +Registry私有仓库 +jenkins 持续集成测试
- Docker实践-使用maven插件自动部署web应用至Docker容器的tomcat
- 用 Docker、Gradle 来构建、运行、发布一个 Spring Boot 应用
- [Docker]构建、运行、发布一个 Spring Boot 应用
- 用 Docker 构建、运行、发布一个 Spring Boot 应用
- 二. Spring Boot使用DockerFile maven插件自动化部署
- 创建maven spring boot的RESTful Web Service工程(使用IntelliJ IDEA以及无集成开发环境)
- spring boot 实际应用(八) 使用war包部署 JSP使用