想用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. 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...

  2. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  3. Linux运维主流架构简单剖析

    随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS.RedHat.Ubuntu.Fedora等等,成千上亿个网站涌现在当今互联网,互联网 ...

  4. 15分钟理解HTTPS——通俗篇

    | 导语 它很深奥吗?你肯定常常见过它,使用它,甚至离不开它... 它很浅显吗?你可能觉得看透它,理解它,甚至懂它... 让我们用15分钟,不那么学术地将它的深挖到底~ 什么?如何证明我是我?本文要上 ...

  5. 源码实现 --> itoa函数实现

    itoa函数实现 itoa()函数的功能是将一个整数转换为一个字符串 例如12345,转换之后的字符串为"12345",-123转换之后为"-123",欢迎大家 ...

  6. Java多线程:乐观锁、悲观锁、自旋锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

  7. 每天学点mysql

    一.linux下查看mysql命令 查看mysql ps  -ef  | grep mysql mysql启动  service mysqlid start 查看服务是否安装到linux上面 chkc ...

  8. CSS速查列表-1-(background)背景

    CSS 背景 CSS 属性定义背景效果: background-color background-image background-repeat background-attachment backg ...

  9. windows+CMake+mingw 搭建c c++开发环境

    layout: post title: "windows+CMake+mingw 搭建c c++开发环境" date: 2018-03-30 22:23:06 tags: wind ...

  10. 面试常考---html篇

    1.html5新特性,语义化 HTML5为我们提供了一系列的语义标签. 1.<section></section> 定义文档中的主体部分的节.段. 2.<article& ...