spring boot 与 iview 前后端分离架构之开发环境基于docker的后端的部署的实现(三十六)
- 公众号
- 基于docker的后端的部署
- 安装mysql数据库
- 创建数据库
- 安装redis
- 安装docker
- 创建基础镜像
- 编写后台管理系统的DockerFile文件
- pom.xml的配置
- 新增application-prod.yml的配置
- 部署程序
- 开放端口
- docker端口映射到主机无法访问
- 运行前端验证效果
公众号
大家可以直接微信扫描上面的二维码关注我的公众号,然后回复【bg36】 里面就会给到源代码的下载地址同时会附上相应的视频教程,并定期在我的公众号上给大家推送相应的技术文章,欢迎大家关注我的公众号。
基于docker的后端的部署
现在慢慢的都从传统的部署方式,迁移到了基于docker的容器的部署,如果没有工具进行部署docker,那么我们需要自己打包jar包,上传到服务器,停止启动的容器,删除旧的镜像,创建新的镜像,启动新的容器,如果是对着一个过程不熟悉的人,这可能会花去大家大半个小时的时间,这时候我们则需要一些自动化的部署工具,比如一键帮助我们快速部署,这里为大家编写了一个基于docker的自动化部署工具,具体的部署步骤大家可以直接移到以下的博客地址,本章直接就拿来使用了:https://blog.csdn.net/linzhefeng89/article/details/90632897
安装mysql数据库
mysql的安装大家可以直接看我的这篇博客,在此处就不再累述了:
https://blog.csdn.net/linzhefeng89/article/details/95256244
创建数据库
使用navicate工具创建一个vcm数据库:
接着执行bg-admin-doc底下的vcm.sql的脚本文件,执行完成以后效果如下:
安装redis
redis的安装大家可以直接看我的这篇博客,在此处就不再累述了:https://blog.csdn.net/linzhefeng89/article/details/95256186
安装docker
docker的安装大家可以直接看我的这篇博客,在此处就不再累述了:https://blog.csdn.net/linzhefeng89/article/details/78411199
创建基础镜像
我们在部署我们的后端工程的时候,我们首先要编写我们的基础镜像包,我们的基础镜像是依赖于centos的,因此我们需要先下载基础镜像包,在安装好了docker的环境中执行以下命令:
docker pull centos
大家会看到如下的下载镜像的界面:
接着我们执行以下命令我们会看到我们已经将centos的镜像下载完成了:
docker images
执行完成以后会看到我们已经正常下载好我们的镜像了。
接着编写我们的DockerFile文件,编写完成以后的代码如下:
FROM docker.io/centosMAINTAINER linzf <282245889@qq.com>ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 ENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezoneRUN mkdir -p /usr/java/jdk1.8ADD jdk1.8.0_191 /usr/java/jdk1.8ENV JAVA_HOME /usr/java/jdk1.8ENV PATH $PATH:$JAVA_HOME/bin
接着我们在我们的服务器上创建/home/docker/base这个路径,将我们的DockerFile文件和我们的jdk的包上传到服务器的/home/docker/base这个路径底下,大家可以直接访问以下的百度网盘的地址直接下载:[https://pan.baidu.com/s/1MB9peTmmb5iBLIix343TxA 提取码: njtp (https://pan.baidu.com/s/1MB9peTmmb5iBLIix343TxA)
接着我们使用SSH登录我们的系统,然后进入到我们的/home/docker/base这个路径,然后执行以下命令解压我们的jdk的包。
tar -xvf jdk.tar
最后我们执行我们的镜像打包文件,创建我们的基础依赖镜像base-jdk8,打包的命令如下:
docker build -f "/home/docker/base/DockerfileJdk" -t "base-jdk8" .
最后我们执行查看镜像的命令,我们会看到如下的镜像,则说明我们的镜像已经打包成功了。
编写后台管理系统的DockerFile文件
首先在我们的bg-admin-web-core工程的src目录的同级目录底下创建一个dockerFile文件夹,接着在该文件夹底下创建一个Dockerfile文件,Dockerfile文件的内容如下:
FROM base-jdk8MAINTAINER linzf <282245889@qq.com>RUN mkdir -p /app/www/logs/bg-admin-web-core/log/RUN mkdir -p /home/app/ADD bg-admin-web-core.jar /home/app/app.jarCMD java -jar -Xms128m -Xmx1536m /home/app/app.jar
pom.xml的配置
最后我们修改我们的pom.xml,修改完成以后的信息如下,在此处我们没有进行打包部署的时候我们整个系统都是正常运行的,若没有替换以下的代码,当我们进行打包部署的时候就会出现问题,我们打包出来的文件是没办法运行的,因为我们之前是用maven-compiler-plugin进行打包的,这样打出来的包是无法运行spring boot的程序的,因此我们需要替换为spring-boot-maven-plugin方式进行打包:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.github.bg.admin</groupId><artifactId>bg-admin-web-core</artifactId><version>0.0.1-SNAPSHOT</version><name>bg-admin-web-core</name><description>这是一个后端的springboot权限架构工程</description><properties><java.version>1.8</java.version><org.mapstruct.version>1.1.0.Final</org.mapstruct.version></properties><dependencies><dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--通用 Mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.4</version></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.4</version></dependency><!-- swagger插件 --><dependency><groupId>com.didispace</groupId><artifactId>spring-boot-starter-swagger</artifactId><version>1.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--mapStruct依赖--><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-jdk8</artifactId><version>${org.mapstruct.version}</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version><scope>provided</scope></dependency></dependencies><build><finalName>bg-admin-web-core</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><configuration><configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>4.0.0</version></dependency></dependencies></plugin><plugin><groupId>com.github.lazyBoyl</groupId><artifactId>docker-maven-plugin</artifactId><version>1.1-release</version><configuration><!-- 本地package以后生成的jar包的完整路径 --><jarTargetPath>${basedir}/target/bg-admin-web-core.jar</jarTargetPath><!-- centos服务器存放我们的dockerFile文件和相应的jar包的文件夹的路径 --><dockerImagesPath>/home/app/docker/bg-admin-web-core/</dockerImagesPath><!-- 创建镜像的dockerFile的文件的路径 --><dockerFilePath>${basedir}/dockerFile/Dockerfile</dockerFilePath><!-- 该工程启动的时候的文件挂载 --><containerRunShare>/app/www/logs/bg-admin-web-core/log/:/app/www/logs/bg-admin-web-core/log/</containerRunShare><!-- 该工程启动的时候的端口映射,多个端口那就对应着启动多少个容器 --><containerRunPorts><containerRunPort>8288:8288,9099:9099</containerRunPort></containerRunPorts><!-- 采用与宿主机一样的IP的形式 --><netType>host</netType><options><!-- 服务器的ip,账号,密码 --><option>10.10.10.113:22,root,123456</option></options></configuration><executions><execution><!-- 设置该插件的执行的生命周期为package完成以后执行,若不想绑定就将executions这块的代码注释了,后面就不会在打包好以后再去执行docker插件的操作 --><phase>package</phase><goals><!--phase与goal是绑定的关系,当g到达了phase阶段的时候就会去执行goal,此处的值固定为dockerMavenPlugin,因为插件给予他的名字就是dockerMavenPlugin --><goal>dockerMavenPlugin</goal></goals></execution></executions></plugin></plugins></build></project>
新增application-prod.yml的配置
配置生产环境的配置信息,最后要记得修改application.yml中的访问为prod
server:port: 8288# 配置日志信息
logging:level:root: INFOcom.github.bg.admin.core: DEBUGspring:redis:host: 10.10.10.113password: 123456port: 6379database: 0jedis:pool:max-active: 8max-idle: 20min-idle: 0timeout: 2000datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://10.10.10.113:3306/vcm?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedruid:filters: statmaxActive: 20initialSize: 1maxWait: 60000minIdle: 1timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxOpenPreparedStatements: 20swagger:title: 用户权限架构的接口测试中心description: 用户权限架构的接口测试专用API文档base-package: com.github.bg.admin.core.controllercontact:name: 林泽锋email: 282245889@qq.comauth:# authToken的过期时间authTokenExpire: 3600# refreshToken过期时间refreshTokenExpire: 7200# 放行的权限列表,采用小写的冒号分隔releaseUrl: /user/refreshToken# false表示用户单点登陆,true表示用户多点登录singleLanding: false# 私钥的keyprivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAPIqZ8mGAAcQrRijqo60UHyxJ9ghkElTLJeLVfsSCRmjeSYw67r+5PtLAL0SepuIzJIl8CW8HbTRkwiTp7U1Cs8tmlzlVK7NJDc2p1c51s2eFcBR4wTwhyxuxwr1c/wHGV0yFSEgr7fOi8jVUJjaQs7pMzARW9N0f4XWNb9YWSmXAgMBAAECgYB3ZlMf+LLgyOcfw+qfS+Z3ZH2pwfq7PIg6/BdboGveOUzNeMdxvqW2BSgLESZks5Fx6cS7RkI7Wi2tx+ejn9CAmnqwu+cpPzxpcWQ6524XX1chKs0fOuSnD6UDeIYdnkw1iV85uiit59TfQCUTHaOtwWJiSbe9o/Y4Zzz3Im7KaQJBAP64qBRHm43px36qj4C+P1qZIDLvR2HGGpD3KIfx+0gvQ9pz2V/kYQWFgHnr+4ao31tZOO75kUd7GdsTO3raLQUCQQDzYZ0Pavq/WIlbhLxpkd/o2W8ChBSUDiXymaFXEQ76rudAaThHA6LGHmXqbmupoioDiABvPWZwhKULDl+Fgl7rAkAoop61tYK8Tfo0W9NOz4rd0iXP2lpB38+nJrbBkTnsFxY1CFw6Lv3HWrfXO21B2zjeosoxXYDurVW/nD7V525dAkEAyPqXv06hZ/eN3iRbjnYmx9seH57Ae46/aXnSUNrGWt6qGneJQKNQ/HfHw3KRt5AxT580dKfoewweWmXxHYgOJwJAUQkBcwN/XxUv2bENOuKso9M66OYvipX8E14hAbXfmKxTPw3qDNegtjuepTIuCaU8jeVjGXFythq+YHAUIKGSDw==# 文件上传的地址
file:upload:path: D:/static/merJoinResource/#============================================================================
# netty socket io setting
#============================================================================
# host在本地测试可以设置为localhost或者本机IP,在Linux服务器跑可换成服务器IP
socketio:host: localhostport: 9099# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器maxFramePayloadLength: 1048576# 设置http交互最大内容长度maxHttpContentLength: 1048576# socket连接数大小(如只监听一个端口boss线程组为1即可)bossCount: 1workCount: 100allowCustomRequests: true# 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间upgradeTimeout: 1000000# Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件pingTimeout: 6000000# Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔pingInterval: 25000
部署程序
接着我们在IDEA中更新我们的maven依赖,然后我们直接运行我们的package,直接自动帮助我们部署到我们的测试环境,这时候我们执行以下代码我们会看到我们的程序已经在上面正常运行了。
docker ps
但是我们这时候在我们的本机上访问我们工程的任意一个方法我们会发现无法访问,这是因为我们还缺少以下的两步。
开放端口
1、防火墙永久放开某一个端口
firewall-cmd --zone=public --add-port=8288/tcp --permanent
2、重新加载生效该端口
firewall-cmd --reload
3、验证该端口是否开放成功【yes:端口已开放;no:端口未开放】
firewall-cmd --zone=public --query-port=8288/tcp
docker端口映射到主机无法访问
解决办法:
# vi /etc/sysctl.conf
或者
# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network查看是否修改成功
# sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了
最后我们访问以下的地址:http://10.10.10.113:8288/,我们会看到我们已经可以正常访问了,因为我们是使用浏览器直接访问,没有携带token因此是会被权限拦截的。
运行前端验证效果
那么我们这时候可以改造下我们前端的工程,让前端工程的访问指向我们的测试环境,那么我们修改我们的src/config目录底下的prod.js,修改以后代码如下:
export const runProdConfig = {baseUrl: 'http://10.10.10.113:8288',imgUrl: 'http://127.0.0.1:80/merJoinResource',refreshTokenUrl: 'http://10.10.10.113:8288/user/refreshToken',socketUrl: 'http://10.10.10.113:9099'
};
接着修改env.js代码如下:
export default "prod";
最后我们运行我们前端工程我们会看到我们已经可以正常访问我们的项目了。
那么到此为止我们就完成了我们本章的基于docker的部署
上一篇文章地址:spring boot+iview 前后端分离架构之权限注解的实现(三十五)
下一篇文章地址:spring boot 与 iview 前后端分离架构之前后端代码自动生成(番外篇)