SpringBoot | 第十四章:基于Docker的简单部署
前言
讲解了单元测试,本章节讲讲应用的部署吧。总体而言,在进行自动化部署时,基本都会用上
Jenkins
+Maven
+Docker
进行部署。本章节主要讲解使用Maven
+Docker
进行SpringBoot
应用的部署知识。
题外话:对于Docker
,本人也是去年才第一次听说的,当时也没有进行过相关了解。然后年初的时候,本着学习的心态,购置了一台阿里云的ECS服务器,之后的相关实践,都是在这台服务器上进行的。这周末要是不需要加班,可能会先出个Docker入门教程,因为还闲置了一台服务器,刚好可以把自己当作初学者,再重新来一遍,加深下印象,做下笔记。
Docker
关于Docker,百度百科是这么说的:Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
题外话:本人觉得,每个开发者都应该了解下Docker
,毕竟我们不是专业的运维,如果一直在倒腾一些环境的安装,也是蛮枯燥乏味的。使用了Docker
可以减少很多的不必要,可以直接上手部署各式各样的环境了。真的很Nice呀!
安装jdk8镜像
安装命令为:
docker pull openjdk:8-jdk-alpine
安装成功后,查看镜像,表明已经安装成功了,当然也可先不安装,因为后续是基于此镜像进行编写Dockerfile的,所以这里先下载了。
大家可在:https://hub.docker.com/搜索,并选择自己想要的对应镜像文件。
maven插件推送方式
基于此方式时,是本地利用maven的docker插件进行编译,同时推送到远程的docker服务器中。所以事先需要远程的Docker
服务开启远程访问权限。本例演示的Docker版本为(docker -v 命令):
Docker version 1.13.1, build 774336d/1.13.1
这里说明下开启的方式(基于阿里云的Linux系统):
- 修改
/etc/docker/daemon.json
文件,加入hosts
配置即可。
如:
{
"hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
- 重新加载配置文件,并重启docker
systemctl daemon-reload
systemctl restart docker
3.验证,直接访问:
curl 127.0.0.1:2375/info
返回记录即可说明已经生效。
也可以直接浏览器访问:http://服务器IP:2375/info, 效果是一样的(这里隐去了阿里云服务器的地址)。
接下来正式开始编写示例。
0.创建一个web演示应用(这里大家可自行创建,或者直接下载本章节示例)
工程结构:
1.加入打包插件docker maven
的pom依赖。
<build>
<plugins>
<!-- springboot打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.9</version>
<configuration>
<!-- 镜像名称 -->
<imageName>lqdev.cn/demo</imageName>
<!-- docker远程服务器地址 -->
<dockerHost>http://服务器IP:2375</dockerHost>
<!-- Dockerfile文件存放目录 -->
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
2.编写Dockerfile
,注意大小写,后面的file
是不大写开头的。
# Dockerfile
# 基于的镜像
FROM openjdk:8-jdk-alpine
VOLUME /opt/tmp
ADD chapter-14-0.0.1-SNAPSHOT.jar app.jar
# -Djava.security.egd=file:/dev/./urandom 可解决tomcat可能启动慢的问题
# 具体可查看:https://www.cnblogs.com/mightyvincent/p/7685310.html
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# 对外端口
EXPOSE 8080
3.编码运行。
mvn clean package docker:build -Dmaven.test.skip=true
注意:这里若出现了编译异常,常见的就是500: HTTP 500 Internal Server Error
了。造成这种的情况一般是镜像名称不符合命名规范:限制为字母数字 [a-zA-Z0-9]
,和标点符号 [.-_]
,及/
和:
(":"一般上用来区分版本的,如lqdev.cn/demo:v1),或者Dockerfile
文件未找到之类的,若出错了大家可重点看下这两个地方。
网友反馈:有些环境会出现如下错误
Caused by: com.spotify.docker.client.exceptions.DockerException: manifest for openjdk:8-jdk-alphine not found
出现此错误时,可考虑换一个镜像,如jboss/base-jdk:8
(此镜像比较大,原来选择openjdk:8-jdk-alphine
也是出于大小考虑。),或者使用自制镜像。
4.查看远程镜像
docker images
5.运行镜像,查看应用是否正常启动。
docker run -d -p 8080:8080 lqdev.cn/my-springboot-images
查看日志或者直接浏览器访问:http:服务器地址:8080/,即可。
有返回预期的数据,部署成功!
基于已有镜像,运行jar
基于有时候没有开启远程服务,也可把jar上传至服务器,然后编写脚本进行运行,这里简单示例下,正常部署时,正常是通过
jenkins
打包,然后编写打包后事件,运行脚本即可。
编写运行镜像脚本:
docker run -d -p 1234:8080 -v /opt/docker/chapter-14-0.0.1-SNAPSHOT.jar:/usr/chapter-14-0.0.1-SNAPSHOT.jar --name SpringbootByJar openjdk:8-jdk-alpine java -jar /usr/chapter-14-0.0.1-SNAPSHOT.jar
其实就是把jar拷贝从宿主中拷贝到容器中,然后运行java命令进行启动。和原来的运行jar方式是一样的。
运行后访问:http://服务器地址:1234 即可查看效果,验证是否部署成功了。
总结
本章节主要是讲解了利用
Maven
的Docker
打包工具进行应用构建同时推送到远程仓库及已有jar
的情况下,直接在容器中运行jar。其实原理都是一样的,都是把jar放入到容器中,然后利用java
命令进行运行应用。本章节,若是对docker不熟悉可能会有点懵,因为好多命令都没有具体说明,(┬_┬),大家可查阅相关资料,对Docker
有了解后在进行尝试。周末看看,有时间会写几章关乎Docker
入门及基本使用的教程的,当然这些教程都是个人见解了,但至少应该能让新手有个了解~
最后
目前互联网上很多大佬都有
SpringBoot
系列教程,如有雷同,请多多包涵了。本文是作者在电脑前一字一句敲的,每一步都是实践的。若文中有所错误之处,还望提出,谢谢。
老生常谈
- 个人QQ:
499452441
- 微信公众号:
lqdevOps
个人博客:http://blog.lqdev.cn
原文地址:http://blog.lqdev.cn/2018/07/27/springboot/chapter-fourteen/
完整示例:chapter-14
SpringBoot | 第十四章:基于Docker的简单部署的更多相关文章
- SpringBoot | 第二十四章:日志管理之AOP统一日志
前言 上一章节,介绍了目前开发中常见的log4j2及logback日志框架的整合知识.在很多时候,我们在开发一个系统时,不管出于何种考虑,比如是审计要求,或者防抵赖,还是保留操作痕迹的角度,一般都会有 ...
- 【WPF学习】第二十四章 基于范围的控件
WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件——ScrollBar.ProgressBar以及Slider——都继承自RangeBase类(该类又继承自Co ...
- 第十四章 Odoo 12开发之部署和维护生产实例
本文中将学习将 Odoo 服务器作为生产环境的基本准备.安装和维护服务器是一个复杂的话题,应该由专业人员完成.本文中所学习的不足以保证普通用户创建应对包含敏感数据和服务的健壮.安全环境. 本文旨在介绍 ...
- 第四章 使用Docker镜像和仓库(二)
第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...
- perl 第十四章 Perl5的包和模块
第十四章 Perl5的包和模块 by flamephoenix 一.require函数 1.require函数和子程序库 2.用require指定Perl版本二.包 1.包的定义 2.在包间切 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- Gradle 1.12用户指南翻译——第二十四章. Groovy 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
随机推荐
- 开源一个windows消息队列查看器
windows消息简单易用,在异步消息发送场景的使用还是比较适合.为了方便查看队列中的消息和删除一些异常消息,开发了一个简单的小工具拿出来分享下. 源码地址:https://gitee.com/eab ...
- 4.JasperReports学习笔记4-查询数据库生成动态的报表(WEB)
转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html 第一种方式: sql语句中定义查询条件,报表中定义接收参数 第二种方式: ...
- 使用union来遍历结构体中的成员
前几天和实验室的同学讨论问题的时候发现他使用的一段数据校验的代码自己以前没有接触过,今天有空就把它整理了一下. #include <stdio.h> #include <stdlib ...
- centos6.5安装tomcat7.0教程(二)
阅读之前对基本命不熟悉的话, 可以先安装另一文章: http://www.cnblogs.com/duenboa/articles/6665159.html把基本的命令记一下.后面的文章就不重复演示了 ...
- Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax)
Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax) 摘自 金马的Blog 原文 http://www.lijinma.com/blo ...
- windows下primer3-py安装
primer3是由怀特黑德生物医学研究所Steve Rozen等人发起的一个自动寡核苷酸分析和设计的开源项目,被广泛应用在分子生物领域.primer3-py是用python语言封装的primer3的A ...
- 查询字符串中防止SQL注入
写SQL语句时,为了防止SQL注入, 通常做如下处理 strSearch.ToLower.Replace("--", " ").Replace(" - ...
- Umbraco Examine Search (Lucene.net) french accent
在项目中使用Umbraco examine search 来search 法语网站时,客户有一个需求,就是 当search expérience 和 experience 时,需要返回一样的结果. ...
- 3.Windows应急响应:蠕虫病毒
0x00 前言 蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含的程序(或是一套程序),通常通过网络途径传播, 每入侵到一台新的计算机,它就在这台计算机上复制自己,并自动执行它自身的程序.常见的蠕虫 ...
- OpenStack虚机状态变化图解
对官网上内容的一个翻译,方便自己以后查找资料用 The following diagrams and tables show the required virtual machine (VM) sta ...