Docker部署springboot+vue

docker部署springboot

首先编写dockerfile文件:

FROM java:8                 //依赖的基础镜像是java8

 COPY *.jar  /app.jar       //将当前目录下的所有jar包拷贝到app.jar中,   就类似于修改名字
CMD ["--server.port=8080"]           //在打包镜像的时候,设置端口, 这里的参数是在docker  run的时候运行

EXPOSE 8080                     //暴露所设置的端口, 要和jar包的端口保持一致

ENTRYPOINT ["java","-jar","/app.jar"]           //自动运行app.jar  , 这里面的参数是在启动容器的时候追加的命令,这样在启动容器的时候就能自动运行jar包了

-

-

-

-

然后将dockerfile文件和springboot的jar包放到服务器的同一个目录下

-

-

-

然后在该目录下打开控制台输入: docker   build    -f   dockerfile   -t   springboot   .               // -t是设置镜像的名字springboot,  结尾一定要打一个点,表示运行当前目录

//此时你就可以查看创建的镜像了: docker  images

-

-

-

然后根据生成的镜像创建容器

docker  run  -d  -p  8081:8080   --name   springboot-web    sprinboot             //此时springboot项目就已经运行在了容器中了

-

-

-

此时springboot项目就启动起来了,通过http://101.34.26.210:8081就可以进行访问

在docker中通过nginx部署vue项目

首先创建nginx容器

docker  pull nginx:latest

docker  run  -p  90:80  --name nginx   -d   nginx         //这里就创建好了容器

-

-

-

-

然后复制nginx容器中的指定内容到本地(直接挂载内容是无法成功的)

 docker   cp   nginx:/etc/nginx  /zhan/nginx        //这里是将nginx目录复制到了/zhan/nginx中 

nginx内容为: 

docker   cp  nginx:/usr/share/nginx/html  /zhan/nginx            //这个就是将nginx容器中的html复制到了本地, 此时/zhan/nginx目录下就有了html和nginx两个文件夹

-

--

-

-

-

然后删除原本的nginx镜像,并将复制到本地的内容和新建容器进行挂载

docker  rm  -f   nginx             //删除镜像

docker run  --name  nginx   -v   /zhan/nginx/html:/usr/share/nginx/html    

-v  /zhan/nginx/nginx:/etc/nginx    -p  90:80   -d    nginx         //这里就是将之前复制的目录和容器内的目录进行挂载

-

-

-

-

然后将vue打包后的dist目录放到本地的/zha/nginx/html目录中,这样就相当于放到了nginx容器内部中

-

-

-

-

-

然后修改/zhan/nginx/nginx/conf.d中的default.conf文件:

  输入: cd  /zhan/nginx/nginx/conf.d

  再输入: vim  default.conf进行编辑

  server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;             //这三行代码主要就是监听当前容器内的80端口

     location  /  {         //这就是拦截指定路径"/"
                root  /usr/share/nginx/html/dist;             //指定vue所在的文件夹, dist就是vue打包之后的文件夹,  一定要写分号。 其实就是指定根路径, 这里的路径一定要是nginx容器内部的路径,拦截后会在这个dist中找文件

               index   index.html  index.htm;          //指定根目录文件,当访问localhost:80的时候,它会到容器内的 /usr/share/nginx/html/dist中去找index中指定的index.html文件, 没有的话,就会返回index.htm

                }

     location ^~ /x {        //拦截所有/x开头的请求
            proxy_pass http://101.34.26.210:8081;           //这个其实就相当于是一个请求转发   

                           //比如 在网址栏输入localhost:90/x/aa,  nginx内部就进行了一个请求转发,

虽然网址栏地址不会发生变化,但是实际请求的是http://101.34.26.210:8081/aa


        }       //这个就是反向代理, 注意这里面的请求转发和重定向

}

-

-

-

-

最后通过http://101.34.26.210:90就能访问vue项目了,在vue项目中的所有的/x请求都会被拦截, 然后代理到后端的具体地址

你访问nginx中的90端口的时候,其实就是默认访问容器内的80端口,所以上面其实真正要监听的是80端口

proxy_redirect中的default详解及代理接口响应的是重定向时遇到的问题:

nginx容器端口映射: 8080:80

location ^~ /x {        //拦截所有/x开头的请求
            proxy_pass http://101.34.26.210:8081/aa;         

            proxy_redirect   default;          //这是一个默认值

}

相当于:

   location ^~ /x {        //拦截所有/x开头的请求
            proxy_pass http://101.34.26.210:8081/aa;         

            proxy_redirect   http://101.34.26.210:8081/aa    /x;    //这就是一个默认值

   //这里的/x默认的域名为nginx的ip地址,默认的端口为listen监听的端口

// 其实就是等效于 proxy_redirect   http://101.34.26.210:8081/aa    http://localhost:80/x; 

//实际上默认会自动将http://localhost:8081/aa替换成http://localhost:80/x

    

}

当反向代理中发生重定向时,默认的流程:

     首先访问localhost:8080/x/aa/b, 反向代理后,实际地址为http://101.34.26.210:8081/aa/b,

代理访问的该后端接口最终响应的是一个重定向接口为/aa/c

     然后最终重定向的地址为http://101.34.26.210:8081/aa/cc, 

     然后受proxy_redirect的默认值影响,http://101.34.26.210:8081/aa会自动替换成http://localhost:80/x,localhost为nginx地址,80为nginx的监听端口,/x为大括号外的拦截接口

     然后所以最终访问到了地址为localhost:80/x/c

            

-

-

-

-

-

-

-

解决proxy_redirect的默认值对重定向的影响:

location ^~ /x {        //拦截所有/x开头的请求
            proxy_pass http://101.34.26.210:8081/aa;         

            proxy_redirect   aa    bb;          //反正这样就是将默认值给重写了,从而避免影响

}

这样访问localhost:80/x/bb,就相当于访问http://101.34.26.210:8081/aa/bb,如果该接口响应的是重定向接口/aa/ss, 那么最终的地址就是http://101.34.26.210:8081/aa/ss,由于无法和proxy_redirect中的aa匹配上,从而就不会受到proxy_redirect的影响

通过nginx负载均衡同一个springboot项目的多个容器

首先加载镜像生成多个springboot项目容器,分别为springboot1, springboot2,springboot3,

它们的端口分贝为8081,8082,8083

-

-

然后在nginx.conf文件中定义分配规则,这个分配规则upstream是在http下的,和server是同一级的,分配规则分别有:

a) 一般轮询(默认的,就是依次轮询)

b) 权重轮询(就是定义权重,权重越大,分配的请求就越多)

c) 最少连接(会将请求分配给连接最少的服务器)

-

-

-

使用方法:

http {

    # 定义转发分配规则为"zhan"

    upstream zhan {         //这个默认使用的就是一般轮询

        server  192.168.3.16:8081; # 要转发到的服务器,如ip、ip:端口号、域名、域名:端口号

        server 192.168.3.16:8081;

        server 192.168.3.16:8081;

    }

    server {

        listen 80; # nginx监听的端口

        location / {

            proxy_pass http://zhan;      //这里使用定义的规则,这样就会将请求分配给规则下的几个服务器中

        }

    }

}

-

-

-

-

权重轮询:

upstream zhan {         //这个就是权重轮询

        server  192.168.3.16:8081 weight=1 ;   //该台服务器接受1/6的请求量

        server 192.168.3.16:8081  weight=2;    //该台服务器接受2/6的请求量

        server 192.168.3.16:8081  weight=3;    //该台服务器接受3/6的请求量

    }

-

-

-

-

最小连接:

upstream zhan {         //这个就是最小连接

       least_conn; # 把请求分派给连接数最少的服务器

        server  192.168.3.16:8081 ;

        server 192.168.3.16:8081 ;

        server 192.168.3.16:8081 ;

    }

通过nginx部署多个vue+springboot项目

server {
    listen       80;            //监听nginx容器内的80端口
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

-

-

-

-----------------------------

第一个项目前后端:

    location / {                                          //这是第一个vue项目
        root   /usr/share/nginx/html;        
        index  index.html index.htm;
    
}

 location /x {                     //这是给第一个vue项目代理的后端接口

                             //当vue项目请求地址为: 101.34.26.210:80/x/aa的时候

                            //就会被监听并代理成   101.34.26.210:8081/aa 
        proxy_pass  http://101.34.26.210:8081/;          //结尾一定要打"/"和";"
      }

--------------------------------------------------

第二个项目前后端:


   location  /music {               //这里第二个vue项目代理的后端接口
       proxy_pass http://101.34.26.210:8085/;
 
          }


 location /client {          //这个第二个vue项目的客户端项目
        alias  /usr/share/nginx/html/music-client;         //注意: 由于通过root只能用一次

                                        //所以这里需要使用alias, 这样才会生效
        index  index.html  index.htm;
       
   

  }


 location /manage {       //这是第二个vue项目的后台管理
        alias  /usr/share/nginx/html/music-manage/;
        index  index.html  index.htm;
       
   }
 

总结:这里就是在nginx中部署了两个vue项目,和两个springboot项目,

          在部署多个vue项目的时候,第一个vue可以使用root, 后面几个vue就只能使用alias了,否则后面的vue项目将无法进行访问

修改nginx容器中的default.conf文件的原因

default.conf文件图片:

  Docker部署springboot+vue_第1张图片

 nginx的主文件nginx.conf的图片

 Docker部署springboot+vue_第2张图片

在nginx.conf中有一行代码: include  /etc/nginx/conf.d/*.conf

从这里可以看出它是直接引用default.conf文件的, 所以只需要直接改变default.conf文件就可以了 

default.conf文件的相关语法

1,可以有多个server模块 sever模块里包含location location包含if if里面包含rewrite

Docker部署springboot+vue_第3张图片

2,location大致可以分为三类

 比如:

   精准匹配: location  = / {...}, 访问 / 和 /data,则 / 匹配,/data 不匹配, 匹配成功后,还会接着运行下面其他的location

   一般匹配: location  /abc/  {...} , 匹配所有以/abc开头的请求,匹配成功后,还会接着运行下面其他的location

                                    即使是/abcd也能被匹配到,只要开头那一部分相同就可以了

                    

  正则匹配: location ~  /aa{....}        匹配以/aa开头的请求,成功后,停止运行下面的location

在idea中连接服务器的docker

首先在宝塔中安装docker

-

-

然后编辑指定的docker中的某个文件

输入: vim /usr/lib/systemd/system/docker.service

Docker部署springboot+vue_第4张图片

就是找到该文件内的找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375, 这个就表示为当前的docker软件开放了2375端口

-

-

-

然后重启docker

systemctl daemon-reload            //这个是关闭docker

systemctl restart docker            //这个是启动docker

-

-

-

-

然后在idea中安装docker插件,并点击编辑配置

然后填写连接地址和指定端口:1.1.34.26.210:2375就能远程连接docker成功了

你可能感兴趣的:(docker,spring,boot,java)