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文件图片:
nginx的主文件nginx.conf的图片
在nginx.conf中有一行代码: include /etc/nginx/conf.d/*.conf
从这里可以看出它是直接引用default.conf文件的, 所以只需要直接改变default.conf文件就可以了
default.conf文件的相关语法
1,可以有多个server模块 sever模块里包含location location包含if if里面包含rewrite
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
就是找到该文件内的找到 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成功了