docker部署spring boot并保存日志与docker文件保存

不难,记录备忘:

一、有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)

 

posted @ 2019-01-01 15:15  透明飞起来了  阅读(2888)  评论(1编辑  收藏  举报