成都网站建设设计

将想法与焦点和您一起共享

Docker+k8s+微服务部署方案

写在前面

公司主营业务:成都网站制作、成都网站建设、外贸营销网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出水富免费做网站回馈大家。

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
LABEL maintainer="ZhiYu Xin<894747821@qq.com>"

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

当前文章:Docker+k8s+微服务部署方案
地址分享:http://chengdu.cdxwcx.cn/article/gpgjji.html