千家信息网

docker k8s 集群部署tomcat,使用一个镜像,增加镜像的复用性。

发表于:2025-01-30 作者:千家信息网编辑
千家信息网最后更新 2025年01月30日,写在前面,k8s集群均已经搭建好,具体步骤可以查看前面文章。编写Dockerfile文件,目的创建一个可以公用的image,每次部署tomcat直接使用该镜像不用每次都进行build镜像。# 开始本来
千家信息网最后更新 2025年01月30日docker k8s 集群部署tomcat,使用一个镜像,增加镜像的复用性。

写在前面,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_21ENV JRE_HOME $JAVA_HOME/jreENV JAVA_BIN $JAVA_HOME/binENV CLASSPATH $CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libENV PATH $TOMCAT_HOME/bin:$JAVA_BIN:$JAVA_HOME/jre/bin:$PATH:$HOME/bin# 增加jdk压缩包到/opt目录下ADD jdk-7u21-linux-x64.tar.gz /optADD apache-tomcat-7.0.77.tar.gz  /usr/localRUN 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.2RUN 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.xmlEXPOSE 8080ENTRYPOINT ["/bin/sh", "/usr/local/tomcat/bin/start.sh"]


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

start.sh

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

catalina.sh

################以上与原有tomcat默认配置文件一致################421   #touch "$CATALINA_OUT"422   if [ "$1" = "-security" ] ; then423     if [ $have_tty -eq 1 ]; then424       echo "Using Security Manager"425     fi426     shift427     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   else439     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/v1kind: Deploymentmetadata:  name: dubbo-admin  labels:    app: dubbo-adminspec:  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: v1kind: Servicemetadata:  name: dubbo-adminspec:  ports:  - port: 8080    nodePort: 32333    targetPort: dubbo-admin    protocol: TCP  selector:    app: dubbo-admin  type: NodePort

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


0