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;
}
参考链接: