使用docker-compose部署Nginx 反向代理 tomcat集群
Nginx和tomcat都是通过dockfile制作的容器,需要的软件包自行下载,放到指定目录即可.
目录结构如下:
[root@localhost docker]# tree ./ ./ ├── docker-compose.yml ├── etc │ └── localtime #用来描述本机时间,和容器保持一致 ├── mysql │ ├── conf │ │ └── my.cnf #MySQL配置文件 │ └── mysqldb ├── nginx │ ├── conf.d │ │ └── test.conf │ ├── Dockerfile │ ├── logs │ ├── nginx-1.9.7.tar.gz │ └── nginx.conf ├── tomcat │ ├── apache-tomcat-8.5.51.tar.gz │ ├── Dockerfile │ └── jdk-8u65-linux-x64.tar.gz └── webapps #存放tomcat的项目 └── ROOT └── index.jsp 10 directories, 11 files [root@localhost docker]#
按照目录结构,将配置文件放入指定目录:
1.localtime文件:
[root@localhost ~]# cp /etc/localtime /root/docker/etc/
2.my.cnf文件如下:
[client] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set = utf8 [mysql] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set = utf8 [mysqld] port = 3306 basedir = /var/lib/mysql datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock character-set-server = utf8 skip-external-locking slow-query-log = on long_query_time = 1 slow_query_log_file = /var/lib/mysql/slow.log log-error=/var/lib/mysql/mysql.log pid-file=/var/lib/mysql/mysql.pid
3.nginx.conf文件如下:
user nginx; worker_processes 2; pid /var/run/nginx.pid; events { worker_connections 1024; } 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 /usr/local//nginx/logs/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; include /usr/local/nginx/conf.d/*.conf; }
4.test.conf文件如下:
upstream example { server tomcat01:8080; server tomcat02:8080; server tomcat03:8080; } server { listen 80; server_name localhost; access_log logs/test_access.log main; error_log logs/test_error.log ; location / { proxy_pass http://example; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~ \.(html|css|js|jpg|png|gif)$ { root /var/www/html; } }
使用Dockerfile构建nginx镜像.
FROM centos:7 MAINTAINER saneri 838118461@qq.com RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel #RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz ADD nginx-1.9.7.tar.gz . WORKDIR nginx-1.9.7 RUN ./configure --prefix=/usr/local/nginx && make && make install RUN groupadd -g 1001 nginx \ && useradd -g 1001 -u 1001 -s /sbin/nologin -M nginx EXPOSE 80 ENV PATH /usr/local/nginx/sbin:$PATH CMD /bin/sh -c 'nginx -g "daemon off;"'
使用Dockerfile构建tomcat镜像
FROM centos:7 MAINTAINER saneri ADD jdk-8u65-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.51.tar.gz /usr/local/ #设置环境变量 ENV JAVA_HOME=/usr/local/jdk1.8.0_65 ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.51 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #公开端口 EXPOSE 8080 #设置启动命令 CMD ["/usr/local/apache-tomcat-8.5.51/bin/catalina.sh","run"]
docker-compose.yml文件
version: '3' services: nginx: build: context: ./nginx dockerfile: Dockerfile ports: - "80:80" links: - tomcat01:tomcat01 - tomcat02:tomcat02 - tomcat03:tomcat03 volumes: - ./webapps:/usr/local/apache-tomcat-8.5.51/webapps/- ./nginx/logs:/usr/local/nginx/logs - ./etc/localtime:/etc/localtime - ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf:ro - ./nginx/conf.d/:/usr/local/nginx/conf.d/:ro depends_on: - mysql - tomcat01 - tomcat02 - tomcat03 tomcat01: hostname: tomcat01 build: ./tomcat links: - mysql:mysql volumes: - ./webapps:/usr/local/apache-tomcat-8.5.51/webapps - ./etc/localtime:/etc/localtime tomcat02: hostname: tomcat02 build: ./tomcat links: - mysql:mysql volumes: - ./webapps:/usr/local/apache-tomcat-8.5.51/webapps - ./etc/localtime:/etc/localtime tomcat03: hostname: tomcat03 build: ./tomcat links: - mysql:mysql volumes: - ./webapps:/usr/local/apache-tomcat-8.5.51/webapps - ./etc/localtime:/etc/localtime mysql: hostname: mysql image: mysql:latest ports: - "3306:3306" volumes: - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf - ./mysql/mysqldb:/var/lib/mysql - ./etc/localtime:/etc/localtime:ro environment: - MYSQL_ROOT_PASSWORD=root
项目测试页面
在webapps/ROOT目录下创建index.jsp文件,内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.net.InetAddress" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Nginx+Tomcat负载均衡</title> </head> <body> <% InetAddress addr = InetAddress.getLocalHost(); out.println("主机地址:"+addr.getHostAddress()); out.println("主机名:"+addr.getHostName()); %> </body> </html>
在docker目录下使用docker-compose启动服务
[root@localhost docker]# docker-compose up -d
Creating docker_mysql_1 ...
Creating docker_mysql_1 ... done
Creating docker_tomcat03_1 ...
Creating docker_tomcat01_1 ...
Creating docker_tomcat02_1 ...
Creating docker_tomcat03_1
Creating docker_tomcat02_1 ... done
Creating docker_tomcat01_1 ... done
Creating docker_nginx_1 ...
Creating docker_nginx_1 ... done
如果出现以上提示说明启动成功,查看启动状态
然后访问http://192.168.10.10,在浏览器和服务器端都可以.
[root@localhost docker]# curl http://192.168.10.10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Nginx+Tomcat负载均衡</title> </head> <body> 主机地址:172.18.0.4 主机名:tomcat02 </body> </html> [root@localhost docker]# curl http://192.168.10.10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Nginx+Tomcat负载均衡</title> </head> <body> 主机地址:172.18.0.3 主机名:tomcat03 </body> </html> [root@localhost docker]# curl http://192.168.10.10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Nginx+Tomcat负载均衡</title> </head> <body> 主机地址:172.18.0.5 主机名:tomcat01 </body> </html> [root@localhost docker]#
我们看到,三次访问都被代理到不同的主机,nginx代理负载均衡配置成功.