本文将讲解在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