写在前面
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/sh
sh /usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/bin/catalina.sh
因为如果直接使用startup.sh 方式启动tomcat,会导致前台没有进程在运行,会导致容器退出,所以我们后面加一条tail -f的命令。tail那个文件随便写一个就行了。
这样能确保了tomcat的日志即做了日志切割同时又保存在了后台。
Dockerfile的文件内容如下:
FROM tomcat:7.0-slim
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.2
RUN 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.sh
EXPOSE 8080
ENTRYPOINT ["/bin/sh", "/usr/local/tomcat/bin/start.sh" ]
问题三:如何把容器输出的日志直接存放到docker的宿主机上。
我们需要在启动容器的时候,给容器挂载一个volume到/usr/local/tomcat/logs目录下就可以了。
启动容器之前最好在本地创建出对应的目录来。
启动容器的yml内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
app: tomcat
spec:
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: v1
kind: Service
metadata:
# service的名字
name: tomcat-service
spec:
# service的类型,类型包括但不限于【NodePort、ClusterIP、NodePort、LoadBalancer】
type: NodePort
ports:
# 容器的端口
- port: 8080
# 映射后的端口
nodePort: 31003
selector:
# 这个服务会被应用到标签为app等于tomcat的所有容器上
app: tomcat
转载于:https://blog.51cto.com/xinsir/2407888