写在前面,k8s集群均已经搭建好,具体步骤可以查看前面文章。


编写Dockerfile文件,目的创建一个可以公用的image,每次部署tomcat直接使用该镜像不用每次都进行build镜像。

# 开始本来想使用tomcat的官方镜像,但是无奈官方镜像的系统用的都是diban 8的系统,因为我要做日志切割,需要安装cronolog软件,
# 翻篇google、百度并没有找到如何使用apt-get 安装,无奈只能使用源码安装,但是安装过程需要gcc和make的支持
# 使用diban 8的如果不对apt-get update 操作,安装不上,但是由于系统落后原因,导致官方或163或清华的源都不支持了。最后无奈使用了ubuntu 14的镜像。
FROM ubuntu:14.04.5

# tomcat安装目录
ENV TOMCAT_HOME /usr/local/tomcat
# 这里是放server.xml的文件的目录,这个目录需要跟tomcat/conf文件夹下的server.xml做一个超链接,为什么呢? 
# 因为我要使用configmap的方式对配置文件挂载,如果直接挂载到conf目录下,那么目录下的其它文件就都没了。所以我们关在的时候挂载新创建的目录,然后做一个超链接映射。
ENV SERVER_XML /configfile
# 配置jdk环境
ENV JAVA_HOME /opt/jdk1.7.0_21
ENV JRE_HOME $JAVA_HOME/jre
ENV JAVA_BIN $JAVA_HOME/bin
ENV CLASSPATH $CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH $TOMCAT_HOME/bin:$JAVA_BIN:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

# 增加jdk压缩包到/opt目录下
ADD jdk-7u21-linux-x64.tar.gz /opt
ADD apache-tomcat-7.0.77.tar.gz  /usr/local

RUN 
ADD ./catalina.sh $TOMCAT_HOME/bin/
ADD ./cronolog-1.6.2.tar.gz /opt/
# 这个是自己手动编写的tomcat启动脚本,
# 内容很简单,就两行,第一行是启动tomcat使用 sh /usr/local/tomcat/bin/startup.sh;
# 容器要求必须要有前台执行的进程的容器才不会退出,所以第二行随便tail -f 了一个日志即可。
ADD ./start.sh $TOMCAT_HOME/bin/

WORKDIR /opt/cronolog-1.6.2
RUN mv /usr/local/apache-tomcat-7.0.77 /usr/local/tomcat && chmod a+x /usr/local/tomcat/bin/*.sh && \
    apt-get update -y && apt-get install gcc make -y && \
   ./configure && make && make install && chmod a+x $TOMCAT_HOME/bin/start.sh  $TOMCAT_HOME/bin/catalina.sh && \
   rm -rf $TOMCAT_HOME/webapps/* && rm -rf $TOMCAT_HOME/conf/server.xml && mkdir $SERVER_XML && \
   touch $SERVER_XML/server.xml  && ln -s $SERVER_XML/server.xml $TOMCAT_HOME/conf/server.xml
EXPOSE 8080
ENTRYPOINT ["/bin/sh", "/usr/local/tomcat/bin/start.sh"]


需要用到配置文件内容如下:

 start.sh 

#!/bin/sh
sh /usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/bin/catalina.sh

catalina.sh

################以上与原有tomcat默认配置文件一致################
421   #touch "$CATALINA_OUT"
422   if [ "$1" = "-security" ] ; then
423     if [ $have_tty -eq 1 ]; then
424       echo "Using Security Manager"
425     fi
426     shift
427     eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
428       -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
429       -classpath "\"$CLASSPATH\"" \
430       -Djava.security.manager \
431       -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
432       -Dcatalina.base="\"$CATALINA_BASE\"" \
433       -Dcatalina.home="\"$CATALINA_HOME\"" \
434       -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
435       org.apache.catalina.startup.Bootstrap "$@" start \
436       >> "$CATALINA_OUT" 2>&1 "&"
437 
438   else
439     eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
440       -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
441       -classpath "\"$CLASSPATH\"" \
442       -Dcatalina.base="\"$CATALINA_BASE\"" \
443       -Dcatalina.home="\"$CATALINA_HOME\"" \
444       -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
445       org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &
446 
447   fi
################以下与原有tomcat默认配置文件一致################

下面直接build镜像就可以了。


创建一个configmap用于存放tomcat的server.xml文件。

kubectl create configmap cm-server.xml --from-file=‘server.xml的绝对路径’

编写k8s的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dubbo-admin
  labels:
    app: dubbo-admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dubbo-admin
  template:
    metadata:
      labels:
        app: dubbo-admin
    spec:
      # 需要仔细说明的地方,这里我们创建了3个volume,分别存放tomcat的log、java项目代码和一个使用configmap形式存放的tomcat配置文件(server.xml)
      volumes:
      - name: "code-war"
        hostPath: 
         path: "/Disk/data/tomcat/dubbo-admin/code/"
      - name: "tomcat-log"
        hostPath:
         path: "/Disk/data/tomcat/dubbo-admin/log/"
      - name: "serverxml"
        configMap:
         name: tomcat-dubbo-admin-server.xml
         items:
         - key: server.xml
           path: server.xml
      containers:
      - name: dubbo-admin
        # 容器使用刚刚build过的镜像
        image: fushuitong/tomcat:jdk7u21-tomcat7.0.77-cronolog1.6.2
        ports:
        - containerPort: 8080
        #挂载3个volume,挂载目录如下
        volumeMounts:
        - name: code-war
          mountPath: /usr/local/tomcat/webapps
        - name: tomcat-log
          mountPath: /usr/local/tomcat/logs
        - name: serverxml
          mountPath: /configfile

直接创建这个Deployment即可。


创建一个service,把tomcat的端口应道node上,以供外面访问,如果tomcat前面还有nginx,可以直接映射到clusterIP.使用nginx进行转发即可。

变了service的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: dubbo-admin
spec:
  ports:
  - port: 8080
    nodePort: 32333
    targetPort: dubbo-admin
    protocol: TCP
  selector:
    app: dubbo-admin
  type: NodePort

最后通过访问任意node的ip的32333端口就能访问到对应的tomca项目了。


docker k8s 集群部署tomcat,使用一个镜像,增加镜像的复用性。_第1张图片