• centos7上部署spring boot并保存日志


    不难,记录备忘:

    一、有centos7的机器

      可用Virtualbox安装centos虚拟机:https://www.centos.org/download/

    二、机器上安装有docker

      参考文章:https://www.cnblogs.com/yufeng218/p/8370670.html

    三、在自己机器上把spring boot项目打包成一个可执行jar包

      我本地用的maven构建,官方支持的一套东西,运行mvn package直接就打包好了,打包步骤略过

    四、建Dockerfile  

    # 指定一个基础镜像centos
    FROM docker.io/centos:latest
    
    WORKDIR /app
    
    #安装应用执行的环境java
    RUN yum -y install java
     
    #将目录下的文件复制到容器中
    COPY . /app
      
    #执行jar文件
    ENTRYPOINT ["java" ,"-jar","xxx.jar"]

    五、准备好的文件有这些:

    • Dockerfile
    • application.properties
    • logback-spring.xml
    • xxx.jar

    统一弄到前面准备好的centos上去,可以直接在根目录下建一个app文件夹,把东西放进去

    六、构建自己的镜像,xxx是为项目的docker镜像命名,"."表示当前目录(应该是表示Dockerfile在当前目录下?本人还没弄清):

    docker build -t xxx .

    七、镜像做好后,可以查看一下:

    docker images

    八、运行镜像,-d表示后台运行,-p表示端口映射(如下是表示外部访问 centos机器IP:80,即可访问到spring boot在docker里运行所监听的8080端口),xxx即第六步定义的docker镜像名:

    docker run -d -p 80:8080 xxx

    存在的一些问题:

    spring boot项目,一般都用logback记录日志。而且开发的时候一般会有一个 logback-spring.xml 文件在 resources 下,表示要记录什么日志,以及记录在硬盘哪个位置。但是开发时候日志的路径,肯定和centos服务器上的docker里的路径不一样啊,所以肯定不能用开发时的 logback-spring.xml 。不过刚刚mvn打包时,把logback-spring.xml 也打包进去了,如果在服务器上不给个专门的logback-spring.xml ,那就用的开发时的了。所以要指定。

    在.jar文件所在的位置,可以放置application.properties ,里面就包括 logging.config=./logback-spring.xml ,这样就使用.jar的同级目录下的logback-spring.xml作为logback的配置文件,在里面可以记录

    <property name="LOG_PATH" value="./prologs" />
    即会在当前目录下记录日志了。这一段罗里吧嗦的其实和docker没啥关系,主要spring boot在生产环境上自定义日志配置文件位置的问题。
     
    好了,现在执行以下命令可以进入到运行中的docker 容器里去:
    docker exec -it <容器ID> bash

    bash是固定写法,据说也可以是/bin/bash和/bin/sh,本人没试了。进去后,就可以看到生成了一个日志文件夹了。

    日志持久化

    还有个问题,这些日志记录了也只存在于容器里,容器没了的时候日志也就没了。可以解决,我了解两种方式,也就是docker官方推荐的两种数据管理方式:
    1、运行的时候使用如下命令:
    docker run -d -p 80:8080 -v logVolume:/app/prologs xxx

    -v表示使用volume,docker官方指定的三种数据管理方式之一,也是推荐的方式。

    这条命令是告诉docker,在这个容器运行时,将会创建一个路径,叫/app/prologs,而且这个路径,在docker外面,实体的centos上也可以访问,并且不会随着容器停止和删除而且消失。这样一来,docker里面程序操作过的文件,比如写过的日志,就保留下来了。不过官方文档倒是没有提到过这种 use case。

    这个在docker里面看是 /app/prologs 路径,而在外面也可以访问的东西就叫做volume,这条命令新建了一个名叫 logVolume 的 volume,也可以用这条命令查看一共有哪些volume:

    docker volume ls

    那在docker外面查看这些个东西呢?

    先运行:

    docker inspect <容器ID>

    找到 Mounts 节点,下面有个Source,即为可以在docker外部访问的目录,如:/var/lib/docker/volumes/logVolume/_data,cd到这里面就可以看到对应的内容了。

    2、运行如下命令:

    docker run -d -p 800:8080 -v "$(pwd)"/prologs:/app/prologs xxx

    和上一条命令有点类似,唯一不同的,就是-v后面到冒号前面这一段文本,这里的这段文本表示的是当前目录下的 prologs 路径,这种情况,日志文件就会出现在当前目录下的 prologs 路径里了。

    虽然使用方式类似,但是概念上不一样,官方称第一种方式为 Volumes ,第二种方式称为 Bind mounts

    至此,问题基本解决。

    脚本:

    # 关闭所有正在运行容器
    docker ps | awk  '{print $1}' | xargs docker stop
    
    # 删除所有容器应用
    docker ps -a | awk  '{print $1}' | xargs docker rm
    # 或者
    docker rm $(docker ps -a -q)
  • 相关阅读:
    BestCoder Round #65
    Codeforces Round #334 (Div. 2)
    二叉搜索树(排序二叉树)
    二叉搜索树 POJ 2418 Hardwood Species
    差分约束系统 POJ 3169 Layout
    思维题(转换) HDU 4370 0 or 1
    SPFA+Dinic HDOJ 3416 Marriage Match IV
    图论 SRM 674 Div1 VampireTree 250
    SPFA(建图) HDOJ 4725 The Shortest Path in Nya Graph
    SPFA(负环) LightOJ 1074 Extended Traffic
  • 原文地址:https://www.cnblogs.com/lihan829/p/10204884.html
Copyright © 2020-2023  润新知