本文是一篇關於技術整合的文章,以一個Web應用爲例,使用Docker容器來部署咱們的應用,並將Session交給Redis來存儲和管理,涉 及到Docker/Redis/Tomcat/Nginx/Spring Web/Spirng Web MVC等技術。其中:
Docker——容器技術或虛擬化技術,能夠將咱們的application及相關依賴打包到一個容器內,方便移植、集羣部署,容器徹底使用沙箱機制,容 器之間互不影響徹底獨立。下文全部的server都是部署在Docker中,不瞭解Docker和相關操做的能夠先看看這篇文章。html
Redis——一種開源的,先進的 key-value 存儲數據庫,可用於構建高性能、可擴展的 Web 應用程序的解決方案。本文中用來存儲和管理Session。linux
Nginx——高性能的HTTP和反向代理服務器。本文中用來作負載均衡。nginx
系統版本: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.128git
注:下文中相關技術的詳細信息不重複說明了,須要的能夠去官網查詢。
github
1.安裝與配置web
這個過程不說了,省略1000字……(看前面發的文章)
http://my.oschina.net/buran/blog/657690redis
2.Docker設置代理——不須要設置代理的,能夠跳過docker
vi /etc/sysconfig/docker
添加以下配置,替換上你本身的代理地址便可:
# proxy setup
http_proxy="YOUR_PROXY_ADDR"
https_proxy="YOUR_PROXY_ADDR"shell
3.啓動Docker服務數據庫
service docker start
沒有報錯,說明啓動成了。
如何在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來存儲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安裝在宿主機上。
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
整合配置過程的關鍵步驟上文都有記錄,各個模塊的詳細配置並無深刻,好比:
一、Redis的優化及集羣配置。
二、Tomcat的優化。
三、Nginx優化、靜態資源分離等等。
有時間再來詳細的扒拉扒拉這些吧