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"