基于docker springboot 项目+ nginx 实现负载均衡

 

1.安装docker(参考官网)

2.拉取 nginx 最新镜像

3.Dockerfile 生成springboot 项目 自定义镜像

4.修改nginx配置,实现负载均衡

 

 

2.

2.1 从镜像仓库拉取nginx最新镜像

  docker pull nginx

 2.2 用镜像生成容器,给nginx 取名字(--name),指定nginx映射端口(-p),

docker run -d --name mynginx01  -p 80:80  nginx

  -d  表示后台运行

2.3 浏览器进行访问

准备springboot项目

 controller

编写 Dockerfile 文件

内容如下:

FROM openjdk:8
MAINTAINER Guoyiguang2@126.com

#将Springboot的jar放到当前目录,命名为springboot.jar

ADD springbootstart.jar  /mnt/project/springboot/springbootstart/springbootstart.jar

#容器内 项目的存放路径
RUN bash -c 'touch /mnt/project/springboot/springbootstart.jar'

# 开放8181端口
#EXPOSE 8181

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/mnt/project/springboot/springbootstart.jar"]

 

 

构建镜像

#springbootstarterimage 表示生成镜像的名称,(注意后面有个点.  表示Dock而file文件的位置 是当前目录)
docker build -t springbootstarterimage .

  

 

 

1.

分别开启三个springbootstart 容器

 

docker run -d -p 8081:8080 --name springbootstarter1 springbootstarterimage

docker run -d -p 8082:8080 --name springbootstarter2 springbootstarterimage

docker run -d -p 8083:8080 --name springbootstarter3 springbootstarterimage

 

先执行:

docker run -d -p 8081:8080 --name springbootstarter01 springbootstarterimage

 

idea 默认大 jar包的方式有错误(主要是生成 META-INF 的路径错误):(参考博文)

https://blog.csdn.net/qq_31914787/article/details/88064557

删除无用容器和镜像

docker rmi 容器id

docker rm  镜像

重新打包上传生成镜像:

docker build -t springbootstarterimage  .
 

docker run -d -p 8081:8080 --name springbootstarter1  springbootstarterimage

 

 

 

 

 

 

进入容器内

docker exec -it acc03784aa67  bash
 

 

然后启动剩下的两个容器

docker run -d -p 8082:8080 --name springbootstarter2 springbootstarterimage

docker run -d -p 8083:8080 --name springbootstarter3 springbootstarterimage

 

分别从浏览器访问:

 

nginx主要配置:

http {

  upstream springboot_start{
        server 172.17.0.3:8080;
        server 172.17.0.4:8080;
        server 172.17.0.5:8080;
    } 

 server {
        listen       8080;

       # nginx 在docker内,前端页面和nginx容器ip不在同一网段,所以不能访问,只能通过端口映射到宿主机上,在浏览器数据宿主机ip,nginx 拦截宿主机ip ,前端输入 192.168.229.5  这个地址就都会被拦截(server_name 可以理解为被拦截的域名和ip)
        server_name  192.168.229.5;

        location / {
            proxy_pass http://springboot_start;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }


}

说明:

172.17.0.n  这个是docker内部的ip,一个docker 的容器 都在一个网段内,所以三个springbootstart容器和nginx容器是可以相互通信的

思考:如果是多个物理机上部署docker,只能通过宿主机 ip:映射端口  的这种形式来访问,同时nginx不能放到docker里,只能放到 物理机上,这样nginx 才可以和物理机A和B通信,如果nginx也作为容器放到docker里(宿主机A),nginx可以和宿主机A通信,但是能不能访问到宿主机B呢?

upstream springboot_start{
        server 宿主机A:8081;
        server 宿主机A:8082;
        server 宿主机A:8083;

        server 宿主机B:8081;
        server 宿主机B:8082;
        server 宿主机B:8083;
    } 

 

 

 

 

 

 

参考链接:

https://www.cnblogs.com/wang-meng/p/5861174.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值