本文是一篇关于技术整合的文章,以一个Web应用为例,使用Docker容器来部署我们的应用,并将Session交给Redis来存储和管理,涉 及到Docker/Redis/Tomcat/Nginx/Spring Web/Spirng Web MVC等技术。其中:
Docker——容器技术或虚拟化技术,可以将我们的application及相关依赖打包到一个容器内,方便移植、集群部署,容器完全使用沙箱机制,容 器之间互不影响完全独立。下文所有的server都是部署在Docker中,不了解Docker和相关操作的可以先看看这篇文章。
Redis——一种开源的,先进的 key-value 存储数据库,可用于构建高性能、可扩展的 Web 应用程序的解决方案。本文中用来存储和管理Session。
Nginx——高性能的HTTP和反向代理服务器。本文中用来做负载均衡。
部署结构如下图所示:
环境信息
系统版本:CentOS 7
JDK版本:jdk1.8.0_60
Apache Tomcat版本:6.0.44
Docker版本:1.7.1
Redis版本:3.2.1
Nginx版本:1.10.1
本文中宿主机IP:192.168.111.128
注:下文中相关技术的详细信息不重复说明了,需要的可以去官网查询。
Docker篇
1.安装与配置
这个过程不说了,省略1000字……(看前面发的文章)
http://my.oschina.net/buran/blog/657690
2.Docker设置代理——不需要设置代理的,可以跳过
vi /etc/sysconfig/docker
添加如下配置,替换上你自己的代理地址即可:
# proxy setup
http_proxy="YOUR_PROXY_ADDR"
https_proxy="YOUR_PROXY_ADDR"
3.启动Docker服务
service docker start
没有报错,说明启动成了。
Redis篇
如何在docker容器中部署一个Redis服务呢?
1.获得一个包含Redis的镜像
可以自己制作一个包含Redis的镜像。或者你可以查找docker hub上是否有我们需要的镜像。
查找镜像:
docker search redis
发现有一个,我们可以直接拿来用,然后拉取远程镜像到本地:
docker pull docker.io/redis
2.启动镜像并启动Redis Server
运行并绑定端口到宿主机端口(本文以8888为例),两种方法:
方法1:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis /bin/bash
再执行:
redis-server /usr/local/etc/redis/redis.conf &
我比较喜欢这种方式,因为比较方便,可以让redis启动后在后台运行,然后可以做其他的操作。方法2不能退出redis的shell,退出了redis就关闭了。
方法2:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis redis-server /usr/local/etc/redis/redis.conf
注意:
Centos7中由于selinux的问题,可能有权限问题,HOST目录挂载到Container后无法访问,解决方法:
添加selinux安全规则,在host上执行chcon -Rt svirt_sandbox_file_t /hostdir
本例中为:chcon -Rt svirt_sandbox_file_t /opt/conf
3.Redis容器启动完成
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cee5346b83a docker.io/redis "docker-entrypoint.s 2 minutes ago Up 2 minutes 0.0.0.0:8888->6379/tcp redis-server-01
可以用telnet来验证Redis是否启动成功,执行一下SET/GET操作:
telnet 192.168.111.128 8888
相关telnet操作命令见这里(http://blog.sina.com.cn/s/blog_62b832910100uvsu.html)。
Tomcat篇
要用Tomcat来存储Session,我们需要用到tomcat-redis-session-manager,Git主页(https://github.com/jcoleman/tomcat-redis-session-manager.git),详细的介绍自己去看吧,这里不多说了。
1.编译tomcat-redis-session-manager
下载Project到本地编译,生成jar文件:
git clone https://github.com/jcoleman/tomcat-redis-session-manager.git
此外需要依赖jedis和commons-pool2,我用的版本分别是2.5.0和2.0,视情况可以依赖你自己需要的版本,如果遇到问题编译不通过可以修改Project的相应代码,才5个Class,看了一下修改也不难。
2.配置Tomcat
要用Redis来存储和管理Session,我们需要修改content.xml,来改变Tomcat
的Session管理方式,如下:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /><Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="172.17.0.3"
port="6379"
database="0"
maxInactiveInterval="120" />
Redis服务器地址和端口、Session有效时间按自己需要配置。
3.在容器内部署Tomcat
主要以下几个步骤:
2.1. 复制上面提到的jar文件到{Tomcat}/lib目录
tomcat-redis-session-manager.jar
jedis-2.5.0.jar
commons-pool2-2.0.jar
2.2. 部署Tomcat到Docker容器内。
首先,把需要的文件准备好,并挂载倒容器里去(参考:dock run -v)。
然后,复制Tomcat到容器里面去。
最后,可以把配置好的容器commit为image,这样方便以后使用。
docker commit YOU_CONTAINER_ID IMAGE_NAME
例如:docker commit 5954aa3698b2 webdc.with.redismanager
4.启动容器和Tomcat
首先,以交互的方式启动容器:
docker run --name application-server-01 -i -t -p 9001:8080 -v /root/webapps/:/opt/apache-tomcat-6.0.44/webapps/ webdc.with.redismanager /bin/bash
然后启动Tomcat:
cd {Container Tomcat Path}/bin
./startup.sh.
OK了,看看Server是不是正常启动了:
http://192.168.111.128:9001/registerandlogin
其中,-p 9001:8080 端口映射只是为了方便操作而已,不是必须的。
5. 扩展
除了Redis外,你也可以用MongoDB或者Memcached来存储和管理Session:
MongoDB存储Tomcat Session:
https://github.com/simplicityitself/Mongo-Tomcat-Sessions
Memcached存储Tomcat Session
https://code.google.com/archive/p/memcached-session-manager/
Nginx篇
本文用Nginx来做负载均衡用,Nginx安装在宿主机上。
1.安装
下载对应当前系统版本的nginx包(package)
wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
建立nginx的yum仓库
rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
下载并安装nginx
yum install nginx
启动nginx服务
systemctl start nginx
或者
service nginx start
2.测试,看看Nginx是否安装正确
在浏览器地址栏中输入部署nginx环境的机器的IP:
http://192.168.111.128/
不出意外的话,应该能看到如下字样的内容:
Welcome to nginx!
如果不能的话看看有什么错误,服务是否启动,防火墙是否阻止了访问等等。
3.负载均衡配置
本文用Nginx做负载均衡之用,下面来看看怎么配置:
vi /etc/nginx/nginx.conf
在http段里面加上如下配置:
# 设置负载均衡列表
upstream registerandlogin {
server 172.17.0.6:8080;
server 172.17.0.7:8080;
server 172.17.0.8:8080;
}
server {
listen 80;
server_name 192.168.111.128; #我没有用域名,所以直接写IP了
# /表示匹配任何请求,当然本例中你可以写/registerandlogin
location / {
//将所有请求转发到registerandlogin 负责均衡列表 配置的server中去
proxy_pass http://registerandlogin;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /var/log/nginx/registerandlogin.access.log main;
}
4. 验证负载均衡配置是否正确
来,溜一个,看看是否配置正确,在浏览器访问:
http://192.168.111.128/registerandlogin/
没压力,正常跑起来了(registerandlogin是为了测试用,随便写的一个注册登录功能,会一起上传)。
192.168.111.128是Nginx server,请求最终会转发到上面配置的3个application server去。
至此,整合过程已经完成,下面看看目前为止我们的各个容器的基本信息:
[root@localhost ~]# docker inspect -f 'Container IP :{{.NetworkSettings.IPAddress}}, and name is :{{.Name}}' `docker ps -q`
Container IP :172.17.0.8, and name is :/application-server-03
Container IP :172.17.0.7, and name is :/application-server-02
Container IP :172.17.0.6, and name is :/application-server-01
Container IP :172.17.0.3, and name is :/redis-server-01
整合配置过程的关键步骤上文都有记录,各个模块的详细配置并没有深入,比如:
1、Redis的优化及集群配置。
2、Tomcat的优化。
3、Nginx优化、静态资源分离等等。
有时间再来详细的扒拉扒拉这些吧
来源:oschina
链接:https://my.oschina.net/u/728247/blog/726753