基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战

负载均衡原理:基于centOs-7的环境,安装nginx,运行docker里的两个以上的tomcat服务器,一般情况访问Java web项目的jsp页面,通过直接tomcat来访问的,但是我们现在不通过对tomcat进行访问页面,而是通过直接访问nginx进行访问,即你发出请求到nginx,nginx再request到tomcat,tomcat然后reponse到nginx,nginx 把接收到的服务转化为视图响应到客户端,这个过程,ngixn实行了拦截,或者说是代理,随机访问其中任何一个tomcat提供的服务,如果其中的一个tomcat无法提供服务,nginx就访问另一个tomcat.

基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第1张图片

 


前提:基于centos-7环境,安装docker和nginx,在docker里搭建两个或两个以上tomcat集群(多个tomcat容器)和mysql容器,并成功地把web应用程序部署到docker里的tomcat集群里,如果这些你还没有做到,请参考我的博客,https://blog.csdn.net/liqz666/article/details/82253486;注意一定要把Java web应用程序部署到两台及两台以上地tomcat容器里,这样实现负载均衡才有意义。

常用命令简介:

ps -ef | grep xxx:查看某个进程是否存在。

kill pid:杀死已经启动的某个进程

docker ps:查看正在运行的容器(status为Up....)

docker exec -it NAMES(自定义容器名称) bash:进入某个容器内部

docker cp /xxx.war NAMES(自定义容器名称):/usr/local/tomcat/webapps:将打包后的java web项目部署到tomcat容器的webapp目录下。

exit:退出某个容器

vi /etc/sysconfig/iptables


nginx常用命令

cd /usr/local/nginx/sbin ./nginx:启动nginx服务
nginx服务启动后默认的进程号会放在/usr/local/nginx/logs/nginx.pid文件
cat nginx.pid 查看进程号

查看Nginx的版本号:nginx -V

启动Nginx:start nginx

快速停止或关闭Nginx:nginx -s stop

正常停止或关闭Nginx:nginx -s quit

配置文件修改重装载命令:nginx -s reload


1、可以看到我在docker里创建了两个tomcat容器,tomcat1和tomcat2,端口分别为8081,8082,作为tomcat服务器集群,和一个mysql容器,数据库我已经导进mysql容器里了;然后由nginx作为代理服务,首先要在centos-7宿主机里安装nginx,此过程我们就不重复了,然后把你的Java web项目打包成war文件后分别导入docker里地两个tomcat容器里,下次我们直接访问nginx,nginx再随机访问tomcat1和tomcat2提供的服务,响应给客户端。

[root@localhost ~]# docker run --name tomcat1 -p 8082:8080 -d tomcat

[root@localhost ~]# docker run --name tomcat2 -p 8082:8080 -d tomcat

[root@localhost ~]# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWROD=123456 -d mysql
4b6d1f5af350526e8eb7baa5f2049a5858a9c869f22c671d985fa98e01510275
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
4b6d1f5af350        tomcat              "catalina.sh run"        3 seconds ago        Up 2 seconds        0.0.0.0:8082->8080/tcp              tomcat2
2cebf95eded9        tomcat              "catalina.sh run"        About a minute ago   Up About a minute   0.0.0.0:8081->8080/tcp              tomcat1
216c535c46c7        mysql:5.7           "docker-entrypoint..."   3 hours ago          Up 52 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第2张图片


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第3张图片

 


2、将宿主机里的根目录下的war文件(打包地Java web项目)分别导入到tomcat1和tomcat2容器里,war文件会自动解压,看到了么,我已经部署成功了。

[root@localhost ~]# ls /
bin   dev  first.war  lib    media  mytest1  nginx-1.6.2  proc  run   srv  tmp              two.war  var
boot  etc  home       lib64  mnt    mytest2  opt          root  sbin  sys  tracingfood.war  usr
[root@localhost ~]# docker cp /tracingfood.war tomcat1:/usr/local/tomcat/webapps
[root@localhost ~]# docker cp /tracingfood.war tomcat2:/usr/local/tomcat/webapps
[root@localhost ~]# docker exec -it tomcat1 bash
root@2cebf95eded9:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager  tracingfood  tracingfood.war
root@2cebf95eded9:/usr/local/tomcat# exit
exit
[root@localhost ~]# docker exec -it tomcat2 bash
root@4b6d1f5af350:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager  tracingfood  tracingfood.war
root@4b6d1f5af350:/usr/local/tomcat# exit


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第4张图片

 

这个是tomcat2:8082提供的服务。 


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第5张图片

这个tomcat1:8081端口提供的服务


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第6张图片

 输入用户密码后,成功登入了由tomcat1:8081提供的服务,如果你没有连接mysql容器的数据库登陆的话,肯定404错误。


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第7张图片

 输入用户密码后,成功登入了由tomcat2:8082提供的服务,如果你没有连接docker里的mysql容器的数据库登陆的话,到不了这里的。


 3、更改nginx的配置文件实现负载均衡

[root@localhost ~]# ps -ef | grep ngixn
root       8910   6389  0 14:46 pts/0    00:00:00 grep --color=auto ngixn//说明服务还未启动
[root@localhost ~]# ^C
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
 

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream myweb{//名称要一致,我部署两台容器,两个tomcat服务器集群来服务,任何客户端向nginx发出的请求,这两台tomcat会随机响应,weight值越大,让它去访问的机率就大。
     
  server 192.168.159.130:8082 weight=2;
        server 192.168.159.130:8081 weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
          proxy_pass http://myweb;//实现nginx代理,随机访问tomcat1和tomcat2
          proxy_redirect default;//设置默认的nginx代理,而不是访问下面的默认的nginx的index.html页面
         #root   /usr/local/nginx/html;
          #index  index.html index.htm;
        }


4、启动nginx的代理服务,每配置一次,就要重启一次,重启之后,需要编辑编辑防火墙的设置,这里一定要注意,你要配置80的端口,你只能问nginx了,nginx代理去随机访问任意docker里的tomcat容器,你再通过http://192.168.159.130:8082/tracingfood/userlogin.jsp或者http://192.168.159.130:8081/tracingfood/userlogin.jsp 就不能访问到tomcat响应的页面了,你要先去访问nginx,nginx再去访问tomcat,然后把相应的页面响应给客户端。

[root@localhost sbin]# cd /
[root@localhost /]# cd /usr/local/nginx/sbin ./nginx//启动nginx的服务
[root@localhost sbin]# ps -ef |grep nginx
root       9018   6389  0 15:31 pts/0    00:00:00 grep --color=auto nginx
[root@localhost sbin]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ps -ef |grep nginx
root       9020      1  0 15:31 ?        00:00:00 nginx: master process ./nginx//服务已启动
nobody     9021   9020  0 15:31 ?        00:00:00 nginx: worker process
root       9023   6389  0 15:31 pts/0    00:00:00 grep --color=auto nginx


[root@localhost ~]# vi /etc/sysconfig/iptables
[root@localhost ~]# service iptables restart
Redirecting to /bin/systemctl restart iptables.service 

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
~
~
~
看到没,防火墙里有nginx的80端口,mysql的3306端口,你都可以通过ip地址对其进行远程访问,如果你还想直接访问tomcat提供的服务,好办,在3306下面添加一个8080的端口就ok了


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第8张图片

你只能通过nginx访问tomcat的服务了,它实现了代理,你不能直接访问tomcat的服务,如果想访问可以在iptables里面添加一个8080的端口(-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT )


基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第9张图片

 你只能通过nginx访问tomcat的服务了,它实现了代理,你不能直接访问tomcat的服务,如果想访问可以在iptables里面添加一个8080的端口(-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT )


5、下面是客户端向nignx发出请求,nginx向tomcat1或tomcat2发出请求,weight值越大,分配到哪个服务器的概率就大,下面的页面可能是tomcat1也可能是tomcat2相应的的,而不是直接对tomcat服务器进行访问,负载均衡说的就是,假设有多台tomcat服务器,如果其中的有一台坏掉了,这台无法提供服务,其他的服务器依然可以提供服务,这个时候nginx负载均衡的作用就体现了。

 

基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战_第10张图片

 


结束语:另外大家注意,我没有在docker里搭建nginx容器,我直接用的centos里nginx,大家可以尝试自己在docker里创建nginx容器,tomcat集群,mysql容器实现负载均衡。

博主寄语:由于我水平有限,理解、编写能力等限制,有些疏漏在所难免,希望大家喜欢,如有错误,欢迎指出——》

                                                                                                                                                    公元2018年8月31日下午17:56写


 

你可能感兴趣的:(docker)