热门IT资讯网

Docker+k8s+微服务部署方案

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,写在前面1.关于docker+k8s的的搭建方法及过程,请参考前一篇博客2.我们使用的架构是duboo的架构模式。所有的应用除tomcat和jar以外都启动到虚拟机上。使用容器启动tomcat因为使用

写在前面

1.关于docker+k8s的的搭建方法及过程,请参考前一篇博客

2.我们使用的架构是duboo的架构模式。所有的应用除tomcat和jar以外都启动到虚拟机上。

使用容器启动tomcat

因为使用容器启动项目,必须要有进程跑在前台,不然容器run起来后会自动退出。所以我们对tomcat的官方镜像进行了二次的build并做了自己的一些配置。

tomcat的官方镜像启动容器后,tomcat的日志是放到了前台打印出来了,并且无法做日志切割。容器退出后日志随之丢失。我们来解决这两个问题。

问题一: 日志切割

首先在容器中编译安装cronolog工具。但是安装cronolog之前需要系统安装gcc软件,tomcat官方提供的镜像很干净,并没有gcc需要我们首先先安装一下gcc 同时还要安装一下make。

问题二:解决日志输出在前台的问题。

tomcat官方镜像启动容器的方式是catalina.sh run的方式来启动的。这样启动log直接输出在前台,可以保证容器不退出。但是我们目的是把日志放到本地。

我们给tomcat的换一种启动方式,自己写一个start.sh的脚本,内容如下:

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

因为如果直接使用startup.sh 方式启动tomcat,会导致前台没有进程在运行,会导致容器退出,所以我们后面加一条tail -f的命令。tail那个文件随便写一个就行了。

这样能确保了tomcat的日志即做了日志切割同时又保存在了后台。

Dockerfile的文件内容如下:

FROM tomcat:7.0-slimLABEL maintainer="ZhiYu Xin<[email protected]>"ADD ./catalina.sh /usr/local/tomcat/bin/ADD ./cronolog-1.6.2.tar.gz /opt/ADD ./start.sh /usr/local/tomcat/bin/WORKDIR /opt/cronolog-1.6.2RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" >> \    /etc/apt/sources.list && echo "deb-src http://ftp.us.debian.org/debian/ jessie main contrib non-free" \        >> /etc/apt/sources.list && apt-get update -y && apt-get install -y gcc-4.8 g++-4.8 g++-4.8-multilib make && \        ./configure && make && make install && chmod a+x /usr/local/tomcat/bin/start.shEXPOSE 8080ENTRYPOINT ["/bin/sh", "/usr/local/tomcat/bin/start.sh" ]

问题三:如何把容器输出的日志直接存放到docker的宿主机上。

我们需要在启动容器的时候,给容器挂载一个volume到/usr/local/tomcat/logs目录下就可以了。

启动容器之前最好在本地创建出对应的目录来。

启动容器的yml内容如下:

apiVersion: apps/v1kind: Deploymentmetadata:  name: tomcat  labels:    app: tomcatspec:  replicas: 1  selector:    matchLabels:      app: tomcat  template:    metadata:      labels:        app: tomcat    spec:      #声明一个volume以供后面使用      volumes:      - name: "tomcat-log"        hostPath:          path: "/data"      containers:      - name: tomcat1        image: xinsir8/tomcat:v1        ports:        - containerPort: 8080        # 挂载一个volume        volumeMounts:        # 挂载到哪个目录         - mountPath: /usr/local/tomcat/logs           name: tomcat-log        # 资源限制        resources:         requests:          memory: "64Mi"          cpu: "250m"         limits:          memory: "128Mi"          cpu: "500m"

问题四:如何解决网络问题,nginx调度和tomcat的通讯,tomcat和jar的通讯等。

其实很简单解决这个问题,我们创建一个service就能解决这个问题了。创建service的yml文件内容如下

apiVersion: v1kind: Servicemetadata: # service的名字 name: tomcat-servicespec: # service的类型,类型包括但不限于【NodePort、ClusterIP、NodePort、LoadBalancer】 type: NodePort ports: # 容器的端口 - port: 8080 # 映射后的端口   nodePort: 31003 selector: # 这个服务会被应用到标签为app等于tomcat的所有容器上  app: tomcat


0