SpringBoot项目部署初体验【Docker】
前言
一个微服务项目,小到几个模块,大到十几二十几个模块,每个模块都是单独的SpringBoot工程,这么多模块的部署,部署成本真的很高,而且每个服务的部署,都是手动部署,打成war或者jar ?,一个一个的部署也是相当的麻烦,介于此:
我前段时间倒腾了一个博客系统,昨天测试基本功能已经跑通了,可能再过段时间我就要买服务器架设自己的博客系统了,这个系统由SpringBoot支撑,我们就把它当作一个微服务项目的一个一个模块,进行学习微服务项目的部署
北京人原始部署:全程手动
基于前面的介绍,测试项目采用SpringBoot开发,我们将该服务打成一个jar,然后再Docker中运行该jar即可
整个流程我们豪爽的分为下面两步:
SpringBoot项目打包jar 【maven插件支持,否则找不到main方法入口】
创建Docker镜像、容器、并启动容器,访问测试
SpringBoot项目打包成jar
没有其他要说的,就是一个maven插件,这里说明一下,这个插件必须有,否则打成的jar不能运行
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
通过idea分别执行clean package打包命令,然后我们就可以在项目内的target目录下找我打成的jar包
【小提示】:可以在本地运行该jar,测试功能是否畅通,功能测试完好再做下一步深入入入入...
java -jar jar包全名称
通过Dockerfile文件构建镜像
在本地磁盘中找到该jar,并将其上传到我们的Linux服务器:
上传到我们的Linux服务器后,我们就在该jar的同等路径下,编写Dockerfil文件,注意在同一路径下!
下面对上面的命令做一个简单的解释:
jdk:8 :构建一个jdk8镜像的新镜像,如果本地不具有,docker回去中央仓库下载
ADD 这一栏将当前目录下的这个jar ,复制到镜像内的根目录下
最后一栏表示 完成上面操作后将进行的命令,类似于CMD 也就是启动该jar的脚本命令
然后就是镜像构建了: docker build -t 'ninjablog:1.0' .
下面仍然做一个简单的解释:
【docker build -t 'ninjablog:1.0' . 】 :表示构建一个镜像取名为ninjablo,版本号为1.0
这里我需要注意的是,镜像名字千万不要使用大写字母,会构建失败的,我也不知道为什么
构建完成之后,通过docker images 查看本地镜像,就会看到我们刚刚构建的那个镜像大摇大摆的出现在了列表中
镜像就算是已经构建成功,下面我们创建基于该镜像的容器
中途夭折心酸故事
然后我创建容器,并运行容器,这个时候通过 docker logs -f 容器名/id 查看到一堆有一堆的异常,我炸了
经过30分钟的排查后,我觉得可能是mysql的配置错了。我配置的localhost:3306,明显我的容器中没有这玩意儿,
经过一番折腾,我再次打包、上传。做镜像。开容器,...再打包....再打包......
一个小时后!啊,我的天啊,怎么回事啊?Linux上都能远程连接Windows上的mysql,为什么你个SpringBoot连接不上
我尝试使用ip:port的方式用navicat连接本地数据库,连接失败
开启本地数据库远程连接功能,开放所有数据库访问权限,Linux完美连接,项目报异常
突然想起我的docker上好像有mysql诶?马上折腾,启动容器,创建数据库,导数据,容器重启,OJBK
基于该镜像创建容器
好了,几经波折,终于到了我们最后的环节了,创镜像,起容器,访项目!
这里我用数据库容器,以及一个由项目构建的镜像启动的容器,两个容器排排站:
然后就是测试访问了!,然后就是404,我靠!,通过docker logs -f myblog 查看日志,又是一堆异常!
再次夭折心酸故事
这次没上次折腾的久,安装docker的机器的防火墙未关,在上一步中,我用了mysql容器,导致被墙了
首先全局关闭防火墙,启动容器,发现报错,不能启动,重启docker,刷新配置,再次重启。
守的云开见月明
再次查看我们容器的启动日志,没有异常,刷新两哈 docker ps ,发现我们的myblog容器一直在线,并没有宕掉
然后启动浏览器,进行项目访问测试:
使用到的命令集合
docker build -t 'ninjablog:1.0' . :构建一个名为ninjablog的镜像,版本为1.0,可以缺省版本设置
docker run -d -p 8888:8888 --name myblog ninjablog:创建并运行一个容器,参数很多,详见我给的资料
docker rm 容器Name/Id :根据名字或者id删除该容器
docker rmi 镜像名字/id :根据镜像名字或者id删除镜像
firewall-cmd --state :CentOS7查看当前系统的防火墙状态
firewall-cmd --permanent --zone=public --add-port=3306/tcp :在防火墙开启状态下,开放3306端口,自行修改
docker logs -f myblog :查看myblog容器的运行日志,有版本号配置的话需要补全
systemctl restart docker:重启docker
docker start 容器Name/id :根据名字或者id启动一个容器
docker ps :查看所有的容器,后跟 -a 查看当前正在运行的容器
好的这种山顶洞人的原始部署方式到此结束,我们翻开下一个篇章
山顶洞人半自动化:Maven插件自动构建镜像
编写Dockerfile
Dockerfile之前我们已经编写过了,这里就是 拿来即用即可,把Dockerfile从Linux上拷下来,放到资源文件Resource下即可
编写pom_docker.xml
复制本项目的pom.xml文件,命名为pom_docker.xml,其他数据不用更改,只是再原来的基础上再加一个插件:
这个插件添在maven打包插件的而后面即可,可酌情修改相关数据
<!--自动构建镜像相关: 依赖docker环境-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker‐maven‐plugin</artifactId>
<version>1.0.0</version>
<!--docker镜像相关的配置信息-->
<configuration>
<!--镜像名,这里用工程名-->
<imageName>${project.artifactId}‐${project.version}</imageName>
<!--Dockerfile文件所在目录-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--TAG,这里用工程版本号-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<imageName>${project.artifactId}:${project.version}</imageName>
<!--构建镜像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}‐${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
【提示】:此插件依赖docker环境,所以如果本地没有安装docker环境,建议这样操作一波
在装有docker的机器上,使用git clone 克隆项目
我们将项目推送到github或者码云上,然后再Linux上吧项目克隆一份即可
然后再通过一个命令,指定打包创建镜像
项目推送github或者gitlab或者码云
项目克隆到linux本地
git 我能用,如果不能用,执行安装环境
打包前的jdk、maven环境搭建
jdk环境我相信大家应该有的吧,这里不做过多说明。
这里也是需要maven的环境,我相信大家都没有,简单给一系列命令安装一下
随便找一个安装目录,依次执行下面的命令
yum -y install wget
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
tar -zxvf apache-maven-3.6.1-bin.tar.gz
修改setting文件,将依赖源改为国内的:然后将仓库等玩意儿也部署上【刚搬家,还没牵宽带,有宽带的不用管】
vi /etc/profile :加入环境变量,路径写自己的解压路径即可
export JAVA_HOME=/usr/local/jdk8/jdk1.8.0_171 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/usr/local/apache-maven-3.6.1
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile :刷新系统配置
最后测试一下 mvn -v:出现java版本、maven版本相关信息就可以了
打包构镜像一条龙服务
进入到Linux上我们的工程内部,就是有pom_docker.xml文件的那个文件夹,执行下面这个命令即可
mvn ‐f pom_docker.xml clean package ‐DskipTests docker:build
果不其然报错了,我费尽心思,暂时还没有找到解决的办法,目前家里没宽带,流量遭不住,过几天再继续
SpringBoot项目部署初体验【Docker】的更多相关文章
- springboot+支付宝完成秒杀项目的初体验
springboot+支付宝完成秒杀项目的初体验 思考的问题: 首先是秒杀的商品查询,考虑到是热点数据,所以写一个接口读取当日批次的秒杀商品到redis中(那么接下来对商品的操作都放入redis中). ...
- springboot项目部署云服务器
Springboot项目部署云服务器 springboot项目部署云服务器还是挺简单的 首先你要有java运行环境,就是jdk的安装,如果还没有装没有参考安装:阿里云ECS建网站(建站)超详细全套完整 ...
- 2019-03-26 SpringBoot项目部署遇到跨域问题,记录一下解决历程
近期SpringBoot项目部署遇到跨域问题,记录一下解决历程. 要严格限制,允许哪些域名访问,在application.properties文件里添加配置,配置名可以自己起: cors.allowe ...
- 多个springboot项目部署在同一tomcat上,出现jmx错误
多个springboot项目部署在同一tomcat上,出现jmx错误 原因:因为jmx某些东西重复,禁用jmx就可以了 endpoints.jmx.unique-names=true
- React+SpringBoot项目部署
静态资源访问配置 https://www.jianshu.com/p/b6e0a0df32ec https://segmentfault.com/q/1010000012240531/a-102000 ...
- springboot项目部署(war包)
将springboot项目打包成war,并且部署到tomcat.比较麻烦,自己踩的坑也比较多.算了一下,找bug的时间,有两天熬到凌晨2点. 修改pom.xml使得打包成war <groupId ...
- springboot项目部署docker服务器提供api
1.先将springboot项目打包,我这里用的是IDEA工具打包,打包完成后的jar包在 项目目录/target 中 2.打包完成后进入服务器器终端,将jar包上传到自己设置的目录中,这个目录需要跟 ...
- linux小白成长之路10————SpringBoot项目部署进阶
[内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...
- SpringBoot项目部署进阶
一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...
随机推荐
- elasticsearch 6.x 安装search guard
前言 es之前版本一直无用户验证功能,不过官方有提供一x-pack,但是问题是付费.在es的6.3.2版本中,已经集成了x-pack,虽然es团队已经对x-pack开源,但是在该版本中如果需要使用到安 ...
- spring框架的一些测试思路
一.Spring Boot Actuators Spring Boot Actuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息. ...
- 【Flutter学习】页面布局之基础布局组件
一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...
- paper 140:TLD视觉跟踪算法(超棒)
我是看了这样的一个视频:http://www.56.com/u83/v_NTk3Mzc1NTI.html 然后在准备针对TLD视觉跟踪算法来个小的总结. 以下博文转自:http://blog.csdn ...
- CDN技术详解(七)
动态内容加速服务的实现 随着Web2.0的兴起,产生了动态网页.个性化内容.电子交易数据等内容的加速,这些就涉及了动态内容加速技术. 静态内容的加速,都是对于表现层的加速,对于动态页面等内容的加速,则 ...
- BZOJ 1006: [HNOI2008]神奇的国度(弦图)
传送门 解题思路 弦图就是图中任意一个大小\(>=4\)的环至少存在一条两个节点不相邻的边,这样的图称为弦图,弦图有许多优美的性质.一个无向图是弦图当且仅当它有一个完美消除序列,完美消除序列就是 ...
- express设置允许跨域访问该服务.
const express = require('express');const app = express(); //设置允许跨域访问该服务.app.all('*', function (req, ...
- wrtnode板
Arduino技术交流:www.openjumper.com QQ群 ArduinoCN I : 180646674,ArduinoCN II : 203870250 商品详情 产品介绍 : WRT ...
- line-height继承
父元素设置ling-height;子元素继承父元素的line-height 1.ling-height:固定像素 body{ font-size:20px; line-height: 24px; } ...
- svn 版本管理,trunk(主干),branch(分支),merge(合并)
svn 版本管理,主要对trunk(主干).branch(分支).merge(合并)进行说明. svn作为一个常用的版本管理工具,一些基本操作必须要会,在这里整理一下自己使用svn的一些体会: svn ...










