CentOS 使用Docker 部署多台Springboot程序,并用Nginx做负载均衡

 本文将讲解在CentOS中使用Docker 去部署两个Springboot程序,并用Ngix去做负载均衡

 1. Docker的安装

   安装Docker

yum install -y docker

  设置开机启动

systemctl enable docker

 启动Docker

systemctl start docker

 

 2. 制作springboot程序的Docker镜像

 

   2.1 springboot程序打包

      将需要发布的程序通过mvn package打包成一个可执行的jar,并上传到CentOS上

      alipay_demo-0.0.1-SNAPSHOT.jar

   2.2 Dockerfile文件

     在jar包所在目录,新建Dockerfile文件,内容如下

    

1 # 基础镜像使用java
2 FROM java:8
3 # VOLUME 指定了临时文件目录为/tmp
4 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
5 VOLUME /tmp
6 # 将jar包添加到容器中并更名为app.jar
7 ADD alipay_demo-0.0.1-SNAPSHOT.jar /app.jar
8 # 运行jar包
9 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

    文件结构如下:

 

  

 

   2.3 生成镜像

    进入到Dockerfile所在目录,运行如下命令

    

docker build -t myapp/springboot .

   其中  myapp/springboot 为镜像的名称

   ps: 注意命令后面有个点,表示当前目录,也可以写当前的完整路径

     

   运行后通过如下命令就可以看到我们生成的镜像

   

docker images

 

 

   

3. 启动springboot的docker容器

  我们的springboot程序启动后的端口为10086,
  下面的命令表示启动2个docker容器,并分别将容器内的10086端口映射到服务器的8080和8088端口

  

docker run -d -h myapphost -p 8080:10086 --name myapp myapp/springboot
docker run -d -h myapphost2 -p 8088:10086 --name myapp2 myapp/springboot

-d 表示后台运行
-h 容器的主机名
-p  port1:port2  port1服务器的端口 port2 容器内端口
-name 容器名称
最后一个参数为镜像名称

  

 启动后可以通过如下命令查看到正在运行的容器

  

docker ps

 

 此时可以通过服务器IP+映射出来的端口访问我们的程序,说明springboot程序已经启动成功

 

  http://192.168.0.187:8080/order/goPay

  http://192.168.0.187:8080/order/goPay

 

  

 

 

 

 4. Nginx配置

   4.1 拉取Nginx镜像

   

docker pull nginx:latest

 拉取后可以通过 docker images 查看下载的镜像

 

  

 

  4.2 在本地配置nginx配置

 

   因为docker容器里面的文件会随着容器的删除而丢失,所以我们做下配置文件的映射,让nginx从容器外的服务器上读取配置文件

    

   在服务器上新建目录 /home/docker_nginx

   在目录中新建 conf html log 目录,结构如下:

   

 

  在config目录中新建 nginx.conf 文件

  nginx.conf 中定义了负载均衡,分别向后台两个springboot程序转发,其中myapp和myapp2为应用程序的docker名称

  具体内容如下:

  

 1 user  nginx;
 2 worker_processes  1;
 3 
 4 error_log  /var/log/nginx/error.log warn;
 5 pid        /var/run/nginx.pid;
 6 
 7 
 8 events {
 9     worker_connections  1024;
10 }
11 
12 
13 http {
14     include       /etc/nginx/mime.types;
15     default_type  application/octet-stream;
16 
17     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
18                       '$status $body_bytes_sent "$http_referer" '
19                       '"$http_user_agent" "$http_x_forwarded_for"';
20 
21     access_log  /var/log/nginx/access.log  main;
22 
23     sendfile        on;
24     #tcp_nopush     on;
25 
26     keepalive_timeout  65;
27 
28     add_header Access-Control-Allow-Origin *;
29     add_header Access-Control-Allow-Headers X-Requested-With;
30     add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
31 
32     upstream myapp.com {  
33             server myapp:10086;  
34             server myapp2:10086; 
35     }  
36     server {
37         listen       80 default_server;
38         listen       [::]:80 default_server;
39         server_name  localhost;
40         
41         # Load configuration files for the default server block.
42         include /etc/nginx/default.d/*.conf;
43 
44         location / {
45         proxy_pass   http://myapp.com;        
46     index        order/goPay; 
47     client_max_body_size    10m;          }
48     }
49     gzip  on;
50     include /etc/nginx/conf.d/*.conf;
51 }

 

 另外两个目录中,内容为空即可,后续nginx运行起来后,日志会自动到logs目录中

 

  4.3 启动Nginx

   

docker run --name mynginx --privileged=true --link myapp:myapp --link myapp2:myapp2 -d -p 80:80 -v /home/docker_nginx/html:/usr/share/nginx/html -v /home/docker_nginx/logs:/var/log/nginx -v /home/docker_nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx 

--name nginx的名称
--priviledged 当使用外部配置文件时,必须设置为true,否则会报没有权限读取配置文件
--link 连接2个容器,使两个容器可以通信
-v 目录映射,将服务器上的目录映射到docker容器内的目录
-d 端口映射

 

启动后访问  http://192.168.0.187/order/goPay 可以看到,nginx已经正常启动,并已经对后台两个应用实例做了负载均衡

 

 

 

 至此,基于docker做springboot程序的负载均衡部署到此结束。

 

 ps:一些常用的docker命令:

 

查看镜像  docker images
查看容器 docker ps
停止容器 docker stop myapp
删除容器 docker rm myapp
重启容器 docker restart myapp
进入容器 docker exec -it myapp bash
查看日志 docker logs myapp
拉取镜像 docker pull nginx:latest

 

  

 

 

 

 

posted @ 2020-05-25 15:57  devin_w_zhang  阅读(1410)  评论(0编辑  收藏  举报