想用Docker模拟一下nginx+tomcat集群部署,今天折腾了一天,遇坑无数,终于在午夜即将到来之际将整个流程走通,借本文希望给同样遇到类似问题的小伙伴们留点线索。

主机环境是CentOS 7,nginx容器作为负载均衡,两个tomcat容器模拟Java应用服务器,这三个容器部署在同一个主机上。

一、创建tomcat Docker镜像(如果你有其他的镜像,该步可略过,下同)

Dockerfile:

FROM centos
LABEL author=Aldwin ENV JDKFile="server-jre-8u152-linux-x64.tar.gz" \
TomcatFile="apache-tomcat-9.0.2.tar.gz" \
TomcatConfigFile="server.xml" \
WebsitePath=/home/website \
JAVA_HOME=/usr/local/java \
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar \
CATALINA_HOME=/usr/local/tomcat \
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin COPY $JDKFile $TomcatFile $TomcatConfigFile ./ RUN mkdir -p $JAVA_HOME \
&& tar -xzf $JDKFile -C $JAVA_HOME --strip-components= \
&& rm -rf $JDKFile \
&& mkdir -p $CATALINA_HOME \
&& tar -xzf $TomcatFile -C $CATALINA_HOME --strip-components= \
&& rm -rf $TomcatFile \
&& mkdir -p $WebsitePath \
&& cp -f $TomcatConfigFile $CATALINA_HOME/conf \
&& rm -rf $TomcatConfigFile EXPOSE CMD ["/usr/local/tomcat/bin/catalina.sh", "run"] && tail -f /usr/local/tomcat/logs/catalina.out

1. 创建一个空目录,将Dockerfile文件、war包文件和tomcat的配置文件server.xml放入其中。

2. 将上面涉及的安装文件下载到Dockerfile同目录下。

3. cd到1所述的目录中,生成website镜像:

$ docker build -t website .

二、创建nginx Docker镜像

Dockerfile:

FROM nginx
LABEL author=Aldwin COPY nginx.conf ./ RUN mv -f nginx.conf /etc/nginx/

nginx.conf:

worker_processes  ;

events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ; upstream tomcats {
server website1 weight= max_fails= fail_timeout=20s;
server website2 weight= max_fails= fail_timeout=20s;
} server {
listen ;
server_name localhost; location / {
proxy_pass http://tomcats;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}

红色部分是需要特别注意的。

1. 创建一个空目录,将Dockerfile文件、war包文件和tomcat的配置文件server.xml放入其中。

2. 将上面涉及的安装文件下载到Dockerfile同目录下。

3. cd到1所述的目录中,生成mynginx镜像:

$ docker build -t mynginx .

三、创建网络(User-Defined Networks)

同主机下的容器互联需要建立网络。

1. 首先,我们可以先查看现有的网络:

$ docker network ls

2. 创建名为mynet的网络

$ docker network create mynet

四、启动容器

1. 用website镜像启动容器website1:

$ docker run -d --name website1 -p : --net mynet website

注意--net mynet,该参数将website1容器加入到了mynet网络中。

2. 用website镜像启动容器website2:

$ docker run -d --name website2 -p 9202:80 --net mynet website

3. 用mynginx镜像启动容器nginx:

$ docker run -d --name nginx -p : --net mynet mynginx

这时访问localhost,应该就可以访问到tomcat下你war包内的默认主页了。

注意,nginx.conf里的upstream server一定是容器的别名,而不能是docker分配给容器的ip地址,否则会报错。

同主机下Docker+nginx+tomcat负载均衡集群搭建的更多相关文章

  1. Redhat/CentOS7-环境虚拟机简单搭建Nginx+Tomcat负载均衡集群

    Tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,是开发和调试JSP程序的首选.由于Tomcat处理静态HTML的能力运不及Apache或者Nginx,所以Tomcat ...

  2. Nginx+Tomcat 负载均衡集群

    案例分析 通常情况下,一台Tomcat站点由于可能出现单点故障及无法应对多客户复杂多样性的请求等问题,不能单独应用于生产环境下,所以我们需要一套更可靠的解决方案来完善Web站点架构. Nginx是一款 ...

  3. 使用Redis存储Nginx+Tomcat负载均衡集群的Session

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务期的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  4. CentOS6.5+nginx+tomcat负载均衡集群

    思路: 1.安装jdk 2.安装tomcat 3.安装nginx依赖库 4.安装nginx 5.nginx+2个tomcat集群 一:网络拓扑

  5. Apache+Tomcat负载均衡集群搭建

    1.所需软件 apache_2.2.4-win32-x86-no_ssl.apacheserver mod_jk-apache-2.2.4连接器,连接apache和tomcat apache-tomc ...

  6. windows配置nginx实现负载均衡集群

    windows配置nginx实现负载均衡集群2014-08-20 09:44:40   来源:www.abcde.cn   评论:0 点击:617 网上大部分关于nginx负载均衡集群的教程都是lin ...

  7. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  8. windows配置nginx实现负载均衡集群 -请求分流

    windows配置nginx实现负载均衡集群 一.windows上安装nginx 1.下载nginx的windows版本http://nginx.org/en/download.html 2.把压缩文 ...

  9. nginx集群:nginx配置负载均衡集群(nginx1.18.0)

    一,nginx的负载均衡集群的特点: 1,nginx集群和lvs的不同? lvs集群:工作在第4层(传输层) nginx集群:工作在第7层(应用层) lvs集群:性能更强 nginx集群:功能更强:可 ...

随机推荐

  1. Shell 读取用户输入

    14.2  读取用户输入 14.2.1  变量 上一章我们谈到如何定义或取消变量,变量可被设置为当前shell的局部变量,或是环境变量.如果您的shell脚本不需要调用其他脚本,其中的变量通常设置为脚 ...

  2. 【Python】 sys和os模块

    sys sys模块能使程序访问于python解释器联系紧密的变量和函数 ● sys中的一些函数和变量 argv 命令行参数构成的列表 path 查找所有可用模块所在的目录名的列表 platform 查 ...

  3. jQuery学习笔记 .addClass()/.removeClass()简单学习

    使用jQuery或javaScript来动态改变页面中某个或部分元素的样式,为了实现这样的功能,我们往往都是使用jQuery或javaScript来控制HTML中DOM的类名(class)从而实现增加 ...

  4. IDEA2017注册码

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  5. 在CentOS7.1上安装Gitlab碰到的问题及解决方法

    一 前言 关于在CentOS7上安装Gitlab, 官方文档已经很详细了,步骤大家按照官方的安装文档一步一步安装即可, 这里就不在累述.官方安装文档地址:  https://about.gitlab. ...

  6. alpha冲刺第九天

    一.合照 二.项目燃尽图 三.项目进展 提问界面完成 财富值界面完成 四.明日规划 继续完善各个内容的界面呈现 继续查找关于如何自动更新爬取内容 五.问题困难 在呈现的时候还是一直会停止运行 爬取先暂 ...

  7. 关于如何学习C语言

    2016级计算机专业的C语言分为两个学期,第一学期是C语言(基础),第二学期是C语言(高级),在第一学期主要学习的内容是基本的数据类型,分支结构和循环结构,一维和二维数组,字符数组,函数.通过这学期独 ...

  8. 【iOS】Swift类的继承、构造方法、析构器等复习

    一.继承与重写, 防止重写 1.1 基类, 不继承任何类. Swift不想OC或者Java中继承自Object类.定义一个类,不继承任何类,该类就是基类. [java] view plaincopy ...

  9. Flask 扩展 Flask-PyMongo

    安装 pip install Flask-PyMongo 初始化Pymongo实例 from flask import Flask from flask.ext.pymongo import PyMo ...

  10. js的 == 和 ===的区别

    1.对于string,number等基础类型,==和===是有区别的 不同类型间比较,==之比较转化成同一类型后的值看值是否相等,===如果类型不同,其结果就是不等,同类型比较,直接进行"值 ...