zoukankan      html  css  js  c++  java
  • 基于docker的tomcat服务化

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

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

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

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

    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如下:

     1 FROM tomcat:8.5.29
     2 
     3 MAINTAINER wushaojie
     4 
     5 COPY ./userconfig/* $CATALINA_HOME/conf/
     6 
     7 ENV USER=tomcat USER_ID=1000 USER_GID=1000
     8 
     9 RUN groupadd --gid "${USER_GID}" "${USER}" && 
    10     useradd 
    11       --uid ${USER_ID} 
    12       --gid ${USER_GID} 
    13       --create-home 
    14       --shell /bin/bash 
    15        ${USER}
    16 
    17 # RUN chown -R $USER:$USER ${CATALINA_HOME}
    18 
    19 RUN set -ex; 
    20     rm -rf $CATALINA_HOME/webapps/*  
    21     rm -f $CATALINA_HOME/conf/tomcat-users.* 
    22     if [ -f $CATALINA_HOME/conf/hosts ] then 
    23        cat $CATALINA_HOME/conf/hosts >> /etc/hosts 
    24     fi; 
    25     mv $CATALINA_HOME/conf/*.sh $CATALINA_HOME/bin
    26 
    27 RUN chmod u+x $CATALINA_HOME/bin/user-mapping.sh
    28 
    29 #ENTRYPOINT ["user-mapping.sh"]
    30 CMD ["user-mapping.sh"]

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

    #!/bin/bash
    
    if [ -z "${USER}" ]; then
      echo "We need USER to be set!"; exit 100
    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 0
    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[4]}
    
    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"

  • 相关阅读:
    java8新特性→方法和构造函数引用:替代Lambda表达式
    java8新特性→Stream流:用于解决已有集合类库既有的弊端
    java8新特性→函数式接口
    java8新特新→Lambda表达式
    子查询
    Vue之监听数据变化watch、computed、methods
    Vue路由-使用命名视图实现经典布局
    Vue路由-使用children属性实现路由
    Vue之路由传参
    Vue路由之touter-link、router-direct的使用
  • 原文地址:https://www.cnblogs.com/gabry/p/8573836.html
Copyright © 2011-2022 走看看