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

来源:互联网 发布:sqlite数据库加密 编辑:程序博客网 时间:2024/06/03 22:31

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=yEXPOSE 8080

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

FROM ubuntu-nginx#    容器不是真正虚拟机 不可执行service和systemctl 需要CMD启动ADD nginx.conf /etc/nginx/nginx.conf#之前写80:8888 有问题,外部访问不了 改成这样就好了EXPOSE 80CMD ["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里 并可以看到对应的返回~

原创粉丝点击