因爲業務開始複雜,單一tomcat已經不足以知足業務需求,多tomcat部署起來不方便並且面臨域名解析問題,所以開始增長反向代理,因爲docker的易用性,便使用docker管理各個應用。html
docker 教程(菜鳥學院地址):http://www.runoob.com/docker/docker-container-connection.htmlnode
1、安裝docker(centos)linux
Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。nginx
經過 uname -r 命令查看你當前的內核版本web
uname -r
使用root權限登陸 Centos。確保 yum 包更新到最新。redis
sudo yum update
安裝一些必要的系統工具:docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加軟件源信息:apache
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 緩存:centos
sudo yum makecache fast
安裝 Docker-ce:瀏覽器
sudo yum -y install docker-ce
啓動 Docker 後臺服務
sudo systemctl start docker
測試運行 hello-world
docker run hello-world
2、用docker安裝nginx
拉取nginx鏡像
docker pull nginx
等待下載完成後,咱們就能夠在本地鏡像列表裏查到 REPOSITORY 爲 nginx 的鏡像。
[root@VM_72_27_centos nginx]# docker images nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 881bd08c0b08 3 weeks ago 109MB
在/opt下新建nginx文件夾,用來存放配置文件及日誌文件等
[root@VM_72_27_centos opt]# cd /opt [root@VM_72_27_centos opt]# mkdir nginx [root@VM_72_27_centos opt]# cd nginx/ [root@VM_72_27_centos nginx]# mkdir www [root@VM_72_27_centos nginx]# mkdir conf [root@VM_72_27_centos nginx]# mkdir logs [root@VM_72_27_centos nginx]# pwd /opt/nginx [root@VM_72_27_centos nginx]# ls conf logs www
首先建立一個nginx容器,來測試一下(由於是測試,這裏先不映射文件夾)
[root@VM_72_27_centos nginx]# docker run -p 8081:80 --name nginx-test -d nginx 1c653a1ce10fa2946738ada1f4d0eee25c80aa4024a17b264fd5be70b0a5bb0c [root@VM_72_27_centos nginx]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c653a1ce10f nginx "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:8081->80/tcp nginx-test
命令說明:
-p 8081:80:將容器的80端口映射到主機的8081端口
--name nginx-test:將容器命名爲nginx-test
瀏覽器訪問測試一下 http://你的IP:8081/index.html
成功!好了,先關閉這個測試用的容器吧。
[root@VM_72_27_centos nginx]# docker stop nginx-test
後面部署完tomcat後咱們再來完成配置nginx的反向代理等功能。
3、用docker安裝tomcat
拉取tocmat鏡像
[root@VM_72_27_centos nginx]# docker pull tomcat
查看鏡像
[root@VM_72_27_centos nginx]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest dd6ff929584a 2 weeks ago 463MB nginx latest 881bd08c0b08 3 weeks ago 109MB hello-world latest fce289e99eb9 2 months ago 1.84kB
個人tomcat以前有3個應用,分別爲hsz、tdl、cv,我把他們移動到 /opt/webapps 下
[root@VM_72_27_centos webapps]# pwd /opt/webapps [root@VM_72_27_centos webapps]# cp -rf /opt/apache-tomcat-9.0.12/hostapps/* /opt/webapps/ [root@VM_72_27_centos webapps]# ls cv hsz tdl
將hsz映射到tomcat-hsz下,端口映射爲8100;將tdl映射到tomcat-tdl下,端口映射爲8101;將cv映射到tomcat-cv下,端口映射爲8102
[root@VM_72_27_centos webapps]# docker run --name tomcat-hsz -p 8100:8080 -v /opt/webapps/hsz:/usr/local/tomcat/webapps/ROOT -d tomcat ae36a1f321aedb5e86eb449fc034bab8a11982eed22261dae136eb49e1659d10 [root@VM_72_27_centos webapps]# docker run --name tomcat-tdl -p 8101:8080 -v /opt/webapps/tdl:/usr/local/tomcat/webapps/ROOT -d tomcat a4e006d8b3931df3bbc50d7e19ccc732423413b813873bb2f7e7398dcf2df193 [root@VM_72_27_centos webapps]# docker run --name tomcat-cv -p 8102:8080 -v /opt/webapps/cv:/usr/local/tomcat/webapps/ROOT -d tomcat 9da57d8ce7d65b95c22bf578b86017e3f4eecc601eeddb5e63e0ae3b42e648ee [root@VM_72_27_centos webapps]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9da57d8ce7d6 tomcat "catalina.sh run" 6 seconds ago Up 4 seconds 0.0.0.0:8102->8080/tcp tomcat-cv a4e006d8b393 tomcat "catalina.sh run" 21 seconds ago Up 20 seconds 0.0.0.0:8101->8080/tcp tomcat-tdl ae36a1f321ae tomcat "catalina.sh run" 39 seconds ago Up 38 seconds 0.0.0.0:8100->8080/tcp tomcat-hsz 1c653a1ce10f nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8081->80/tcp nginx-test
分別訪問三個地址,測試成功!
-p參數說明:
建立docker容器時,若是不使用 -p 8100:8080 ,而是使用 -P (如: docker run --name tomcat-test2 -P -d tomcat ),則會隨機指定一個端口來映射到容器默認端口(例如tomcat默認8080,nginx默認80),如使用 -p 127.0.0.1:8100:8080 ,則只容許宿主機訪問docker容器。更多-p參數的說明,可參考https://www.jianshu.com/p/2b424c3bf0f7
4、配置nginx反向代理,轉發到Tomcat服務器
上面咱們建立了 nginx-test 的測試容器。咱們進入容器內部查看一下nginx的默認配置。
[root@VM_72_27_centos ~]# docker exec -it nginx-test /bin/bash root@1c653a1ce10f:/# cat /etc/nginx/ conf.d/ fastcgi_params koi-utf koi-win mime.types modules/ nginx.conf scgi_params uwsgi_params win-utf root@1c653a1ce10f:/# cat /etc/nginx/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
root@1c653a1ce10f:/# exit
docker exec :在運行的容器中執行命令。
-it :-i -t寫在一塊兒了。
-i :即便沒有附加也保持STDIN 打開
-t :分配一個僞終端
/bin/bash :在運行的容器中執行命令。
最下面 include /etc/nginx/conf.d/*.conf; ,咱們看見它把conf.d下面的全部conf文件都引入了,所以咱們把宿主機的conf.d映射到容器中。
建立conf.d文件夾
[root@VM_72_27_centos ~]# cd /opt/nginx/conf/ [root@VM_72_27_centos conf]# mkdir conf.d [root@VM_72_27_centos conf]# ls conf.d
[root@VM_72_27_centos conf]# cd conf.d
建立配置文件以前,咱們須要知道每一個Tomcat容器的IP地址(以 tomcat-tdl 爲例)。
[root@VM_72_27_centos conf.d]# docker exec -it tomcat-tdl /bin/bash root@336e633dbf8d:/usr/local/tomcat# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 336e633dbf8d root@336e633dbf8d:/usr/local/tomcat# exit exit
咱們看到最後一行,docker爲容器建立的IP爲172.17.0.2。
建立反向代理配置文件cv.conf、hsz.conf、tdl.conf。
tdl.conf:
upstream tdl { server 172.17.0.2:8080; } server { listen 80; server_name tdl.yanglei.xyz; location / { proxy_pass http://tdl; index index.html; } }
cv.conf:
upstream cv { server 172.17.0.3:8080; } server { listen 80; server_name cv.yanglei.xyz; location / { proxy_pass http://cv; index index.html; } }
hsz.conf:
upstream hsz { server 172.17.0.4:8080; } server { listen 80; server_name hsz.yanglei.xyz; location / { proxy_pass http://hsz; index index.html; } }
建立nginx反向代理容器
[root@VM_72_27_centos conf.d]# cd /opt/nginx/ [root@VM_72_27_centos nginx]# docker run -p 80:80 --name nginx-proxy -v $PWD/www:/www -v $PWD/conf/conf.d:/etc/nginx/conf.d -v $PWD/logs:/wwwlogs -d nginx
查看全部容器,瀏覽器訪問測試,成功。
[root@VM_72_27_centos nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 336e633dbf8d tomcat "catalina.sh run" 25 hours ago Up 25 hours 0.0.0.0:8101->8080/tcp tomcat-tdl e360ea0f9d91 nginx "nginx -g 'daemon of…" 27 hours ago Up 25 hours 0.0.0.0:80->80/tcp nginx-proxy 9da57d8ce7d6 tomcat "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:8102->8080/tcp tomcat-cv ae36a1f321ae tomcat "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:8100->8080/tcp tomcat-hsz 1c653a1ce10f nginx "nginx -g 'daemon of…" 2 days ago Up 46 hours 0.0.0.0:8081->80/tcp nginx-test
中止並刪除測試nginx的容器 nginx-test
[root@VM_72_27_centos nginx]# docker stop nginx-test nginx-test [root@VM_72_27_centos nginx]# docker rm nginx-test nginx-test [root@VM_72_27_centos nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 336e633dbf8d tomcat "catalina.sh run" 25 hours ago Up 25 hours 0.0.0.0:8101->8080/tcp tomcat-tdl e360ea0f9d91 nginx "nginx -g 'daemon of…" 27 hours ago Up 25 hours 0.0.0.0:80->80/tcp nginx-proxy 9da57d8ce7d6 tomcat "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:8102->8080/tcp tomcat-cv ae36a1f321ae tomcat "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:8100->8080/tcp tomcat-hsz
後記:這裏的Tomcat和nginx都沒有作性能優化,也沒有作https反向代理。咱們知道了docker的常規使用方法,本身寫一個server.xml,每一個Tomcat都映射這個配置文件就行了,https只須要增長一個443端口的反向代理就行了。若是多tomcat作集羣,能夠在nginx的配置文件中使用 ip_hash 來使每一個IP固定到特定tomcat(固然,考慮到之後作分佈式,以及單服務器掛掉等特殊狀況,最好使用redis來管理session)。
Tomcat性能優化推薦:https://blog.csdn.net/lifetragedy/article/details/7708724
使用Spring-Session整合Redis共享Session:https://blog.csdn.net/qq_35830949/article/details/79995318