您当前的位置: 首页 >  慌途L Java

Docker(三)| Java项目打包成镜像并动态加载配置文件和日志、文件持久化

慌途L 发布时间:2019-08-16 18:52:15 ,浏览量:3

Docker(三)| Java项目打包成镜像并动态加载配置文件和日志、文件持久化

背景:

  • 基于springboot的java项目
  • 使用yml文件配置日志 或 logback配置日志文件(日志不用说,肯定需要持久化的,我们不希望项目报错然后容器停止了,什么问题都不知道)
  • 连接mysql数据库(连接上一篇文章.介绍的mysql容器)
  • 项目会输出txt文件(这些文件需要持久化)

重点:因为数据库地址或者我们请求外部动态变化的容器地址,肯定是需要配置文件去配置的,这样可以方便修改,不能和项目打包到一起,不然地址一变就需要重新打包,特麻烦

前言: 配置持久化日志和持久保存txt文件肯定是需要主机和容器共享同一个目录才行的,上一篇文章.有介绍到用-v参数指定容器的持久化的挂载/共享目录,可以保证数据不会因为容器停止而丢失,而且可以共享宿主机上的文件。废话不多说,直接开撸

  1. 在java项目中指定日志在主机上的绝对路径,两种方式:
  • yml 在这里插入图片描述
  • logback 在这里插入图片描述
  1. 这里在java项目中指定输出的txt文件持久化,直接配置宿主机路径: 在这里插入图片描述

  2. 配置数据库地址或外部请求地址,这里我直接写的本地,到后面修改(后期容器已经运行后需要修改配置文件,下面会说这个问题) 在这里插入图片描述

  3. 配置完成将项目打包成可执行jar包 配置好pom文件 在这里插入图片描述 使用IDEAmaven工具打包

  4. 配置Dockerfile文件

FROM java:8
EXPOSE 8900

#VOLUME /tmp
ADD smart.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.config.location=/data/java/config/application-dev.yml"]
  • FROM java:8:使用jdk8作为基础镜像
  • EXPOSE 8900:暴露容器的8900端口
  • VOLUME /tmp:创建一个容器的挂载目录。这里我注释了,没有指定,会在后面的运行命令中指定容器的挂载点
  • ADD smart.jar app.jar:将复制指定的smart.jar为容器中的app.jar,相当于拷贝到容器中取了个别名
  • RUN bash -c ‘touch /app.jar’: 创建一个新的容器并在新的容器中运行命令
  • ENTRYPOINT[]:相当于在容器中用cmd命令执行jar

大家不懂Ddockerfile的命令可以参考这个,下载书籍:https://blog.csdn.net/qq_25112523/article/details/99192334.

  1. application-dev.yml文件拷贝到上面第5步对应的目录(/data/java/config)下,下面的第9步会挂载此目录,方便我们修改这个文件,然后重启容器即可重新加载该文件

  2. Dockerfile文件和可执行jar包拷贝到linux主机上的同一目录下

在同一个目录下使用命令:(注意最后一个".",表示当前目录)

docker build -t java/smart:2019 .
  • -t java/smart:2019:表示构建成java/smart的镜像名称,tags2019

如果提示错误:“docker build” requires exactly 1 argument. 是因为少了最后面的那个点 “.”

  1. 查看镜像java/smart是否已经创建好,命令:
docker images

可以看到镜像已经存在 在这里插入图片描述

  1. 启动容器,命令:(启动后会出现一串字符串)
docker run -dit \
--name smart \
-p 8900:8900 \
-v /data/java/server:/data/java/server \
-v /data/java/config:/data/java/config \
-v /data/java/logs:/data/java/logs \
-v /data/java/txt:/data/java/txt \
java/smart:2019
  • -dit:同时使用-d,-i,-t命令
  • –name java/smart:容器别名,我们还是将容器的别名和镜像名取一样的
  • -p 8900:8900:映射主机和容器之间的端口
  • -v /data/java/logs:/data/java/logs:挂载/共享主机上的/data/java/logs,方便持久化日志,后面就算java/smart容器出错停止,我们还是可以通过日志查看问题所在
  • java/smart:2019:指定镜像名称和版本号

PS:容器可以挂载多个目录,每个目录功能不一样

  1. 动态查看java/smart容器日志
docker logs -f java/smart

不用-f只能查看最后十行的日志,-f即代表动态查看日志

重点:动态修改配置文件问题

由于项目需要请求外部的地址,如mysql等,所以项目就算打成jar不能修改了,还是要让它扫描外部配置文件,这样方便我们修改,省去了重复打jar包的时间。

上面的第6步已经提到将我们的配置文件放到对应的挂载目录(/data/java/config)下,对应的容器中运行jar包的命令,加载的也是这个目录下的文件,所以我们修改宿主机上的文件,再重启容器即可让它生效

1.修改/data/java/configapplication-dev.yml文件

2.重启容器:docker restart smart

这里的重点是保证宿主机和容器进行目录挂载,然后jar包的运行命令中加载的是容器中挂载目录下的文件。

简单说我们的-v参数后面接的冒号前面的是宿主机的目录,是我们方便修改的地方,冒号后面的是容器的挂载目录,程序启动命令是加载容器中的目录,而不是宿主机的目录

关注
打赏
1688896170
查看更多评论

慌途L

暂无认证

  • 3浏览

    0关注

    118博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0711s