springboot+vue项⽬部署全流程(⼀)最近有个课程项⽬,需要部署到服务器上,免费领取了阿⾥云两个⽉的云服务器,记录⼀下部署过程
1.基本环境
Xshell连接到阿⾥云主机,下载docker
yum install docker-ce
有可能会报错:
Problem: package docker-ce-3:20.10.1-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
这是由于需要1.4.1版本以上的containerd.io,默认是安装1.2.0-3.el7版本,需要⾃⼰改
yum install download.docker/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm
安装好了之后重新安装docker,启动docker
systemctl start docker #启动docker
systemctl enable docker #设置开机⾃启
可以通过vi /etc/docker/daemon.json并添加其他源:
{
"registry-mirrors":[
"registry.docker-cn",
"docker.mirrors.ustc.edu",
"cr.console.aliyun/"
]
}
重启docker服务systemctl restart docker.service,加快docker拉取速度
拉取mysql镜像:docker pull mysql
⾸先创建数据挂载点:
docker volume create mysql_data
启动数据库容器:
这⾥我把数据库数据放在了数据卷mysql_data下,不指定绝对路径的话,默认挂载在/var/lib/docker/volumes/⽬录下
/var/lib/mysql是mysql容器内部存放mysql数据的地⽅
逻辑就是:将mysql容器内部/var/lib/mysql⽬录下的容器放在宿主机的/var/lib/docker/volumes/mysql_data⽬录下docker run -d --name mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
docker exec -it mysql bash进⼊容器
mysql -uroot -p123456 进⼊mysql
执⾏GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
刷新FLUSH PRIVILEGES;
navicat 服务器ip + 3306端⼝远程连接测试,测试成功即可,有可能这时候会失败,是因为服务器没有开放3306端⼝我⽤的是阿⾥云,点击安全组,然后配置安全组添加即可
其他容器例如redis:(采⽤appendonly.aof持久化)
docker run --name redis -v redis_data:/data -d -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes 其他容器过程类似,此处省略
2.springboot和vue的简单合并
在vue的⽬录下cmd运⾏npm run build,打包成dist⽂件,并将其中的⽂件复制进springboot的resources中的static⽂件夹
若仍⽆法访问,需要设置资源访问规则
@Configuration
免费下载mysqlpublic class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
@Bean
public FilterRegistrationBean filterRegistration(){
FilterRegistrationBean<RewriteFilter> registration =new FilterRegistrationBean<>();
//注册rewrite过滤器
registration.setFilter(new RewriteFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter(RewriteFilter.REWRITE_TO,"/index.html");
registration.addInitParameter(RewriteFilter.REWRITE_PATTERNS,"/vis/*");
registration.setName("rewriteFilter");
registration.setOrder(1);
return registration;
}
}
/**
* 过滤后端请求,不属于后端的请求,交由前端路由处理
*/
public class RewriteFilter implements Filter {
/**
* 需要rewrite到的⽬的地址
*/
public static final String REWRITE_TO ="rewriteUrl";
/**
* 拦截的url,url通配符之前⽤英⽂分号隔开
*/
public static final String REWRITE_PATTERNS ="urlPatterns";
/** 配置url通配符 */
private Set<String> urlPatterns = null;
private String rewriteTo = null;
@Override
public void init(FilterConfig cfg)throws ServletException {
public void init(FilterConfig cfg)throws ServletException {
/
/初始化拦截配置
rewriteTo = InitParameter(REWRITE_TO);
String exceptUrlString = InitParameter(REWRITE_PATTERNS);
if(!StringUtils.isEmpty(exceptUrlString)){
urlPatterns = Collections.unmodifiableSet(
new HashSet<>(Arrays.asList(exceptUrlString.split(";",0))));
}else{
urlPatterns = ptySet();
}
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException { HttpServletRequest request =(HttpServletRequest) req;
String servletPath = ServletPath();
//匹配到后端路径标识,放⾏,否则,交给前端路由
if(isMatches(urlPatterns, servletPath)){
}else{
chain.doFilter(req, resp);
}
}
@Override
public void destroy(){
}
/**
* 匹配返回true,不匹配返回false
* @param patterns 正则表达式或通配符
* @param url 请求的url
* @return
*/
private boolean isMatches(Set<String> patterns, String url){
if(null == patterns){
return false;
}
for(String str : patterns){
dsWith("/*")){
String name = str.substring(0, str.length()-2);
ains(name)){
return true;
}
}else{
Pattern pattern = Patternpile(str);
if(pattern.matcher(url).matches()){
return true;
}
}
}
return false;
}
}
本机测试,ip + /index.html,成功访问
这种⽅法不推荐,推荐使⽤nginx,前后端分离部署,后续(⼆)中会提到
3.部署
先clean,再package打包,把⽣成的jar包和Dockerfile通过xftp发到服务器
Dockerfile:
FROM openjdk:13-alpine3.9
VOLUME /tmp
ADD *.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -d=file:/dev/./urandom -jar /app.jar"]
docker build -t myImage .
VOLUME指向了⼀个/tmp的⽬录,由于SpringBoot使⽤内置的Tomcat容器,Tomcat默认使⽤/tmp作为⼯作⽬录。效果就是在主机
的/var/lib/docker⽬录下创建了⼀个临时⽂件,并连接到容器的/tmp
add将项⽬的jar⽂件作为app.jar添加到容器
RUN表⽰在新创建的镜像中执⾏⼀些命令,然后把执⾏的结果提交到当前镜像。这⾥使⽤touch命令来改变⽂件的修改时间,Docker创建的所有容器⽂件默认状态都是“未修改”。这对于简单应⽤来说不需要,不过对于⼀些静态内容(⽐如:index.html)的⽂件就需要⼀个“修改时间”
ENTRYPOINT 应⽤启动命令 参数设定
接着运⾏容器:
docker run -itd --net=host --name 随意容器名-p 8088:8088刚刚创建镜像名
–net=host 告诉 Docker 不要将容器⽹络放到隔离的名字空间中,即不要容器化容器内的⽹络。此时容器使⽤本地主机的⽹络,它拥有完全的本地主机接⼝访问权限。容器进程可以跟主机其
它 root 进程⼀样可以打开低范围的端⼝,可以访问本地⽹络服务⽐如
D-bus,还可以让容器做⼀些影响整个主机系统的事情,⽐如重启主机。因此使⽤这个选项的时候要⾮常⼩⼼。如果进⼀步的使⽤–privileged=true,容器会被允许直接配置主机的⽹络堆栈
后续将更新结合nginx的前后端分离部署
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论