基于docker的tomcat服务化

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

基于上述情况,作者设计了一种基于docker的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"

基于docker的tomcat服务化

 

上一篇:StreamingListener技术点


下一篇:《Akka应用模式:分布式应用程序设计实践指南》读书笔记6