考虑容器本身是无状态的,每次启动都是新的状态,而在实际项目中往往又会出现需要往固定目录进行写入或读取文件。本章以日志为例进行说明,仅作抛砖引玉,实际项目不应该以这种方式去搜集日志(常用Syslog日志驱动类型,再用日志分析工具,比如ELK,进行获取搜集)。
继续使用之前的样例,不清楚请先阅读上一篇文章《docker化笔记一、java程序打包并发布到docker容器》
一、设置日志有关输出目录
1、应用的输出日志地址设置为“/dockercontainer/applogs”,本文需修改logback-boot.xml内容为:
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/dockercontainer/applogs/dockerdemo-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 最大64MB 超过最大值,会重新建一个文件-->
<maxFileSize>64MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
2、宿主创建日志目录“/applogs”
二、制作镜像
1、将更新后的jar包上传到服务器目录/jars下
2、进入jars目录下,使用docker build命令创建镜像
docker build -t docker-demo:2.0 .
3、查看本机已有镜像,会发现多出了docker-demo镜像,TAG为2.0
docker images 或 docker image ls
4、启动镜像
将宿主的“/applogs”目录挂载到容器的“/dockercontainer/applogs”目录。(禁用SELinux)
docker run -it -p 8088:8080 -v /applogs:/dockercontainer/applogs docker-demo:2.0 /bin/bash
5、使用docker ps查看,镜像是否启动
6、访问服务http://192.168.72.129:8088/docker/hello,端口与镜像启动的端口保持一致
三、查看日志
使用以下三种方式查看的日志结果是一致的。如果容器重新启动,使用docker logs看到的只有最新的日志信息,而宿主或者容器(挂载)目录可以看到包括之前容器产生的日志。
1、利用 docker logs 命令查看 Docker 容器内部应用程序运行时所产生的日志
docker logs -f 8c1d02afd3ba(当前镜像id,使用docker ps查看)
2、进入宿主的“/applogs”目录进行查看
3、容器的“/dockercontainer/applogs”目录进行查看
docker exec -it 8c1d02afd3ba /bin/bash
================ 附:禁用 SELinux ================
此处不禁用可能会导致程序报错或文件写入不成功。
1、检查 SELinux 状态“sestatus”显示为“enabled”
2、永久禁用 SELinux
1)打开/etc/sysconfig/selinux文件
2)将SELINUX=enforcing指令更改为SELINUX=disabled
3、重启 CentOS 以保存更改“sudo shutdown -r now”
4、检查 SELinux 状态“sestatus”为“disabled”