由于业务开始复杂,单一tomcat已经不足以满足业务需求,多tomcat部署起来不方便而且面临域名解析问题,因此开始增加反向代理,由于docker的易用性,便使用docker管理各个应用。

docker 教程(菜鸟学院地址):http://www.runoob.com/docker/docker-container-connection.html

一、安装docker(centos)

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过 uname -r 命令查看你当前的内核版本

uname -r

使用root权限登录 Centos。确保 yum 包更新到最新。

sudo yum update

安装一些必要的系统工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 缓存:

sudo yum makecache fast

安装 Docker-ce:

sudo yum -y install docker-ce

启动 Docker 后台服务

sudo systemctl start docker

测试运行 hello-world

docker run hello-world

二、用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 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 : --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…" seconds ago Up seconds 0.0.0.0:->/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的反向代理等功能。

三、用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 weeks ago 463MB
nginx latest 881bd08c0b08 weeks ago 109MB
hello-world latest fce289e99eb9 months ago .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./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 : -v /opt/webapps/hsz:/usr/local/tomcat/webapps/ROOT -d tomcat
ae36a1f321aedb5e86eb449fc034bab8a11982eed22261dae136eb49e1659d10
[root@VM_72_27_centos webapps]# docker run --name tomcat-tdl -p : -v /opt/webapps/tdl:/usr/local/tomcat/webapps/ROOT -d tomcat
a4e006d8b3931df3bbc50d7e19ccc732423413b813873bb2f7e7398dcf2df193
[root@VM_72_27_centos webapps]# docker run --name tomcat-cv -p : -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" seconds ago Up seconds 0.0.0.0:->/tcp tomcat-cv
a4e006d8b393 tomcat "catalina.sh run" seconds ago Up seconds 0.0.0.0:->/tcp tomcat-tdl
ae36a1f321ae tomcat "catalina.sh run" seconds ago Up seconds 0.0.0.0:->/tcp tomcat-hsz
1c653a1ce10f nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:->/tcp nginx-test

分别访问三个地址,测试成功!

-p参数说明:

创建docker容器时,如果不使用 -p : ,而是使用 -P (如: docker run --name tomcat-test2 -P -d tomcat ),则会随机指定一个端口来映射到容器默认端口(例如tomcat默认8080,nginx默认80),如使用 -p 127.0.0.1:: ,则只允许宿主机访问docker容器。更多-p参数的说明,可参考https://www.jianshu.com/p/2b424c3bf0f7

四、配置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 ; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections ;
} 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 ; #gzip on; include /etc/nginx/conf.d/*.conf;
}
root@1c653a1ce10f:/# exit

docker exec :在运行的容器中执行命令。

-it :-i -t写在一起了。

  • -i :即使没有附加也保持STDIN 打开

  • -t :分配一个伪终端

/bin/bash :在运行的容器中执行命令。

详细见:http://www.runoob.com/docker/docker-exec-command.html

最下面 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
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: 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:;
} server {
listen ;
server_name tdl.yanglei.xyz; location / {
proxy_pass http://tdl;
index index.html;
}
}

cv.conf:

upstream cv  {
server 172.17.0.3:;
} server {
listen ;
server_name cv.yanglei.xyz; location / {
proxy_pass http://cv;
index index.html;
}
}

hsz.conf:

upstream hsz  {
server 172.17.0.4:;
} server {
listen ;
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 : --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" hours ago Up hours 0.0.0.0:->/tcp tomcat-tdl
e360ea0f9d91 nginx "nginx -g 'daemon of…" hours ago Up hours 0.0.0.0:->/tcp nginx-proxy
9da57d8ce7d6 tomcat "catalina.sh run" days ago Up days 0.0.0.0:->/tcp tomcat-cv
ae36a1f321ae tomcat "catalina.sh run" days ago Up days 0.0.0.0:->/tcp tomcat-hsz
1c653a1ce10f nginx "nginx -g 'daemon of…" days ago Up hours 0.0.0.0:->/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" hours ago Up hours 0.0.0.0:->/tcp tomcat-tdl
e360ea0f9d91 nginx "nginx -g 'daemon of…" hours ago Up hours 0.0.0.0:->/tcp nginx-proxy
9da57d8ce7d6 tomcat "catalina.sh run" days ago Up days 0.0.0.0:->/tcp tomcat-cv
ae36a1f321ae tomcat "catalina.sh run" days ago Up days 0.0.0.0:->/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

docker配置nginx做反向代理管理tomcat应用的更多相关文章

  1. 在ubuntu上面配置nginx实现反向代理和负载均衡

    上一篇文章(http://www.cnblogs.com/chenxizhang/p/4684260.html),我做了一个实验,就是利用Visual Studio,基于Nancy框架,开发了一个自托 ...

  2. nginx做反向代理并防盗链

    nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...

  3. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

  4. Nginx做反向代理总是被系统kill

    公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux ...

  5. 使用nginx做反向代理

    很多同学喜欢用nginx做反向代理访问某些网站,原因大家都懂的,今天老高记录一下如何使用nginx做反向代理以及如何配置和优化nginx的反向代理. 准备工作 首先,你需要一个稳定的国外的便宜的VPS ...

  6. CentOS 7 安装Nginx做反向代理

    题记 须要使用nginx的反向代理功能,測试环境为centos+NGINX 1.8.0. 跳过一些繁琐的问题,直接记录核心 步骤 (1)centos 安装在VM中.因此须要注意网络连接问题 (2)安装 ...

  7. wsl 2 unbuntu 部署 asp.net core 使用 nginx 做反向代理,调试文件上传失败

    继上一篇 asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权 的公司内部项目上线后发现文件上传功能有问题. 上传的文件超过50M以后前端就报错了,没有状态返回,也没有响 ...

  8. 用nginx做反向代理来访问防外链图片

    用nginx做反向代理来访问防外链图片 女儿的博客从新浪搬到wordpress后,发现原来博客上链接的新浪相册的图片都不能访问了,一年的博客内容,一个个去重新上传图片,修正链接也是个大工程.还是得先想 ...

  9. 利用nginx做反向代理解决前端跨域问题

    最近朋友再群里提了一个问题,他们公司给他提供了一个获取数据的接口,在浏览器访问这个接口能获取到json数据,但是放在项目里使用ajax就产生了跨域问题,一般这个需要提供接口的后台方面需要做跨域处理,但 ...

随机推荐

  1. (模拟) codeVs1160 蛇形矩阵

    题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该 ...

  2. (二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal

    Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...

  3. 实现select联动效果,数据从后台获取

    效果如下: 当type值选择完后,amount值会自动相应填入. 1. 从后台获取数据,为一个数组,里面包含多个对象. <select id="scholarshipTypeSelec ...

  4. VMware 安装 Mac OS 注意事项

    Ø  简介 本文主要介绍使用 VMware 安装 Mac OS 的注意事项,主要包括一下内容: 1.   安装参考 2.   使用 VMware 运行 Mac OS 虚拟机注意事项 3.   解决 M ...

  5. 蓝桥杯入门训练-Fibonacci数列

    刚刚开始刷题的时候就栽了个大跟头,稍微记一下...... 一开始不是很理解:“我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数 ...

  6. Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  7. Servlet处理Json请求数据包

    request.setCharacterEncoding('UTF-8'); response.setContentType('text/html;charset=UTF-8'); String ac ...

  8. UE4代码片断备份

    在Actor内创建一个StaticMesh #include "Components/StaticMeshComponent.h" #include "Engine/St ...

  9. JAVA进阶14

    间歇性混吃等死,持续性踌躇满志系列-------------第14天 1.线程的加入 package code0328; import javax.swing.*; import java.awt.* ...

  10. 【Android手机测试】OOM

    当大多数应用程序都消耗完自己的内存的时候,因为这些应用程序的内存需求加起来超出了物理内存(包括swap)的容量,内核(OOM killer)必须杀掉一些进程才能腾出空间保障系统正常运行 Linux内核 ...