docker-compose搭建Nginx+Tomcat负载均衡环境

docker-compose是用来将多个容器连接起来,并一次性执行一些命令,如端口转发,数据卷等的构建工具,可以代替docker run时加上的参数 主要配置文件
docker-compose.yml如下:

tomcat1:
    build: ./tomcat1
    expose:
        - 8080
    ports:
        - "4444:8080"
tomcat2:
    build: ./tomcat2
    expose:
        - 8080
    ports:
        - "5555:8080"
nginx:
    build: ./nginx    
#    volumes:
#        - ./confignginx:/etc/nginx
    links:
        - tomcat1:tomcat1
        - tomcat2:tomcat2
    ports:
        - "8000:80"
    expose:
        - 80

tomcat1:tomcat1表示连接tomcat1容器并启别名为tomcat1 别名在后面负载均衡时会用到


tomcat容器的dockerfile放在tomcat1和tomcat2目录下 为了区分方便 我部署了两个不同的war包 但镜像构建是一样的
Dockerfile如下:
ubuntu-tomcat这个是我自己构建的镜像 已完成了jdk tomcat的安装 丢war部署即可 所以下面对应的方法被我注释掉了 自己add自己的jdk 才能保证编译和部署版本完全一致

FROM ubuntu-tomcat
#&& tar -zxvf jdk-8u91-linux-x64.tar.gz
#ADD jdk-8u91-linux-x64.tar.gz /usr/
ADD test.war /usr/apache-tomcat-7.0.77/webapps/

#ENV JAVA_HOME /usr/jdk1.8.0_91
#
#RUN apt-get install -y wget \
#    && cd /usr \
#    && wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.77/bin/apache-tomcat-7.0.77.tar.gz \
#    && tar -zxvf apache-tomcat-7.0.77.tar.gz
#CMD ["/usr/apache-tomcat-7.0.77/bin/catalina.sh","run"]
#用catalina.sh不用startup.sh 刚才entrypoint不知怎么失败了 改成CMD还得把run拆开

#下面这句是开启调试端口 这样就可以在idea里断点调试docker里的java了 我设置的调试端口是9999
#ENV JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=9999,suspend=n,server=y
EXPOSE 8080

Nginx的Dockerfile:
ubuntu-nginx也是我用apt-get安装构建的镜像

FROM ubuntu-nginx

#    容器不是真正虚拟机 不可执行service和systemctl 需要CMD启动

ADD nginx.conf /etc/nginx/nginx.conf

#之前写80:8888 有问题,外部访问不了 改成这样就好了
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

添加了一个Nginx的配置文件到容器里 这样我们就可以在外部管理Nginx配置
nginx.conf如下:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        #worker_connections 768;
        worker_connections 3000;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        #test
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        #test

        #隐藏版本信息
        server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;

        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";       

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        #下面这句会加载一个默认的server进来 需要去掉 不然负载均衡会失败
        #include /etc/nginx/sites-enabled/*;

        upstream tomcats {
                server tomcat1:8080 weight=1;
                server tomcat2:8080 weight=1;
        }

        server {
               listen 80;
               location / {
                   proxy_pass http://tomcats;
                   proxy_redirect default;
                   proxy_set_header Host $host;
                   proxy_set_header X-Real-IP $remote_addr;
               }
        }

}

一开始我总是转发失败 后来发现是include /etc/nginx/sites-enabled/*;引起的 这句会加载一个默认的server进来 需要去掉 不然负载均衡会失败

upstream配置了一个负载均衡 使用刚才我们link时指定的别名
转发到本地的tomcat8080端口里

upstream tomcats {
                server tomcat1:8080 weight=1;
                server tomcat2:8080 weight=1;
        }

/ 表示将所有流量都转发给tomcats

server {
               listen 80;
               location / {
                   proxy_pass http://tomcats;
                   proxy_redirect default;
                   proxy_set_header Host $host;
                   proxy_set_header X-Real-IP $remote_addr;
               }
        }

最后在docker-compose.yml目录下输入命令
sudo docker-compose up --build
即可构建并启动这三个容器的组合

访问本地localhost:8000 刚才转发出来的端口 这是如果是tomcat的页面 而不是nginx的页面说明转发成功了~

然后再访问部署到tomcat里的war包的目录 不断F5刷新 可以看到负载均衡的情况
第一个tomcat里部署的包

第二个tomcat里部署的包

到这里就基本完成了~
在docker里使用nginx负载均衡到两个tomcat里 并可以看到对应的返回~

你可能感兴趣的:(docker,架构)