tomcat作为web容器被广泛应用,但作者所在的公司restful接口特别多,每个接口都需要一个tomcat来启动,为了配置隔离,一般都会把tomcat安装文件复制多遍,分别把war包部署在对应的webapp目录下,但这样造成的问题就是tomcat安装文件占用了大量的磁盘空间,且不便于统一管理。比如要修改tomcat的某个配置,那么对应的所有的tomcat目录都要修改一遍。

基于上述情况,作者设计了一种基于docker的tomcat服务化方案。

docker不再介绍,tomcat不再介绍,下面仅仅介绍服务化方案。先上架构图

aaarticlea/jpeg;base64,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KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArzHxr/wAh9v8ArmK9OrzHxr/yH2/65iuvBfxTlxn8I5yiiivZPICiiigAooooAKKKKACiiigAooooAK7rwF/qLj/rp/QVwtd14C/1Fx/10/oK5cZ/COrCfxTt6KKK8U9cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArzHxr/wAh9v8ArmK9OrlfEvh5dSk89SUlAxuAz+ddGFmoVLs58TBzp2R5xRWlc6Ff2xP7reo7oaoPFJEcSRsh9GGK9mM4y2Z5EoSjuhlFFFWSFFFFABRRRQAUUUUAFFFSxW083+qhd/8AdUmk2luNJvYiruvAX+ouP+un9BXO2nhy9uGHmARL78mu88PaSmmQFUB5OST1JrhxdWDhypnbhaU1PmaN2iiivKPTCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQqGGCKWigCrJZRSdVqpJo8bdgfqK1aKpTaJcUzmpfDNs+c28Rz3281Sk8IWhJ/cY+jEV2VJgVoq81syHRg90cO/g63PRJF+jVH/wh0PrL+dd5gUbR6Vf1mp3I+rQ7HAjwbFn78x/Ef4U4eDofWX867zavpRtHpR9aqdw+rQ7HEL4Ptu8bn6sasReErRTn7OP+BEmuvwKMCpeIm+o1h4Loc9D4ct4zlYIlPqFFXo9JjXrWpRUOpJmipxRWjs4o+iirAAA4paKhtspJIKKKKQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9kA" alt="" />

通过上图可以发现,该方案有几个特点

1、Nginx做转发。接口对外IP、端口统一

2、tomcat配置统一。因为都是基于相同的image,当然也可以每个container不一样。

当然有几点需要注意:

1、tomcat的logs/webapp需要通过volume映射挂在到container中去

2、每个tomcat服务的数据库链接配置成域名形式。这样测试、生产不需要该jdbc链接

3、保持tomcat的logs和webapp对当前用户可读写

4、对dockerHub上面的tomcat的Dockerfile进行扩展

扩展的dockerfile如下:

 FROM tomcat:8.5.29

 MAINTAINER wushaojie

 COPY ./userconfig/* $CATALINA_HOME/conf/

 ENV USER=tomcat USER_ID=1000 USER_GID=1000

 RUN groupadd --gid "${USER_GID}" "${USER}" && \
useradd \
--uid ${USER_ID} \
--gid ${USER_GID} \
--create-home \
--shell /bin/bash \
${USER} # RUN chown -R $USER:$USER ${CATALINA_HOME} RUN set -ex; \
rm -rf $CATALINA_HOME/webapps/* \
rm -f $CATALINA_HOME/conf/tomcat-users.* \
if [ -f $CATALINA_HOME/conf/hosts ] then \
cat $CATALINA_HOME/conf/hosts >> /etc/hosts \
fi; \
mv $CATALINA_HOME/conf/*.sh $CATALINA_HOME/bin RUN chmod u+x $CATALINA_HOME/bin/user-mapping.sh #ENTRYPOINT ["user-mapping.sh"]
CMD ["user-mapping.sh"]

其中user-mapping.sh代码如下 :

#!/bin/bash

if [ -z "${USER}" ]; then
echo "We need USER to be set!"; exit
fi # if both not set we do not need to do anything
if [ -z "${HOST_USER_ID}" -a -z "${HOST_USER_GID}" ]; then
echo "Nothing to do here." ; exit
fi # reset user_?id to either new id or if empty old (still one of above
# might not be set)
USER_ID=${HOST_USER_ID:=$USER_ID}
USER_GID=${HOST_USER_GID:=$USER_GID} LINE=$(grep -F "${USER}" /etc/passwd)
# replace all ':' with a space and create array
array=( ${LINE//:/ } ) # home is 5th element
USER_HOME=${array[]} sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:[0-9]*/${USER}:\1:${USER_ID}:${USER_GID}/" /etc/passwd
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group chown -R ${USER_ID}:${USER_GID} ${USER_HOME}
chown -R ${USER_ID}:${USER_GID} $CATALINA_HOME
#exec su - "${USER}"
exec su "${USER}" -c "$CATALINA_HOME/bin/catalina.sh run"

基于docker的tomcat服务化的更多相关文章

  1. docker初识-docker安装、基于docker安装mysql及tomcat、基本命令

    一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...

  2. docker安装tomcat&部署javaweb程序

    一.docker定制简单的java-web应用镜像 网址: 1.jdk下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk ...

  3. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  4. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  5. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  6. 基于Docker的服务器搭建

    -----------基于Docker的多种服务器搭建----------- 开发环境 本机上的虚拟机 Centos7.4 Docker1.13.1 Openssl1.1.1 1 Nginx 1.1 ...

  7. 分布式任务调度系统xxl-job搭建(基于docker)

    一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 更多介绍,请访问官网: http://w ...

  8. 基于Docker持续交付平台建设的实践

    导读:中国五矿和阿里巴巴联手打造的钢铁服务专业平台五阿哥,通过集结阿里巴巴在大数据.电商平台和互联网产品技术上的优势,为终端用户带来一站式采购体验.本文是五阿哥运维技术团队针对Docker容器技术在如 ...

  9. QCon技术干货:个推基于Docker和Kubernetes的微服务实践

    2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...

随机推荐

  1. Python学习-字符串函数操作1

    字符串的函数操作 capitalize():可以将字符串首字母变为大写 返回值:首字符大写后的新字符串 str = "liu" print(str.capitalize()); / ...

  2. 首次开通blog,以后会慢慢把oneNote和印象笔记的笔记转过来

    之前一直都是把笔记和经验写到OneNote上面,终于,OneNote无法同步了,转战blog吧,在这上面写一些笔记和一些技术,有空可以慢慢回顾一下.笔记这种东西,过一段时间再看就会有不同的感悟.

  3. PAT 1142 Maximal Clique

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...

  4. [spoj1182][Sorted Bit Sequence] (数位dp)

    Description Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ ...

  5. dstat系统分析工具的使用

    1.安装 方法一:yum #yum install -y dstat 方法二:rpm 官网下载地址: http://dag.wieers.com/rpm/packages/dstat #wget ht ...

  6. Ajax_数据格式_XML

    [XML] 优点: --XML是一种通用的数据格式. --不必把数据强加到已经定义好的格式中,而是要为数据自定义合适的标记. --利用DOM可以完全掌控文档. 缺点: --如果文档来自于服务器,就必须 ...

  7. 【驱动开发】file_operations ---linux 2.6.30

    路径: linux-2.6.30/include/linux/fs.h struct file_operations { struct module   *owner; loff_t         ...

  8. kendo grid dropdownlist 联动 cascading

    之前是无法联动的 后来将html页面中的 //$('<input required data-text-field="CompanyName" data-value-fiel ...

  9. Mutual Training for Wannafly Union #6

    A =w= B QvQ C 题意:有长度为n的序列(n<=5e5),求满足条件的a,b,c,d的组数,要求满足条件:min([a,b])<=min([c,d]),a<=b<c& ...

  10. gh-ost: triggerless online schema migrations:Blog by Shlomi Noach:

    http://code.openark.org/blog/category/mysql https://rj03hou.github.io/mysql/gh-ost/