用docker部署容器服务时,很自然地涉及到容器内外时间同步问题,通常最简单的解决方式就是将宿主机的时间信息文件挂载到容器内相应位置。但是,当你部署tomcat容器时,用同样的操作不能彻底解决此类问题,这是为什么呢?让我们来一探究竟。
#开始之前我们先下载最新的tomcat镜像
docker pull tomcat:latest
#下载好镜像之后,用docker命令创建一个容器
docker run -p 8087:8080 -d tomcat:latest
-p参数将容器中tomcat的8080端口链接到外部的8087端口
#进入tomcat容器(其中e11a615959ef为对应的容器id)
docker exec -ti e11a615959ef /bin/bash
在容器中查看tomcat的时间信息如下:
未进行时间同步之前,容器内的时间默认为UTC标准时间,滞后我大中华时间8个小时。
#关闭刚刚创建的容器,将宿主机时间信息挂载到容器内
docker stop e11a615959ef
docker run -p 8087:8080 -v /etc/localtime:/etc/localtime:ro -d tomcat:latest
再次进入容器,查看时间信息如下:
这一次,时间信息完美与宿主机同步,打开浏览器也能正常出现如下tomcat页面,可正常提供服务。
但是当我们在容器中查看tomcat的日志信息时,发现时间信息还是有点问题。
时间信息依旧滞后8小时,这是为什么呢?
查阅资料后发现,tomcat和openjdk提供日志或web服务时用的不是/etc/localtime.ro中的时间信息,用的是/etc/timezone中的信息。查看容器中的/etc/timezone信息果然还是UTC。
找到了问题的症结,我们对症下药,在宿主机创建一个timezone文件来覆盖容器内的对应文件,宿主机创建timezone文件,内容为'Asia/Shanghai'。
方法一:
#挂载timezone文件,重新启动docker容器
docker run -p 8087:8080 -v /mnt/web/war/timezone:/etc/timezone -v /etc/localtime:/etc/localtime:ro -d tomcat:latest
#再次进入容器,查看log日志的时间信息,log日志的时间信息也与宿主机同
当然日志时间不同步问题还有其他解决办法。
方法二:
在Dockfile构建tomcat容器时,在tomcat/bin/catalina.sh文件中修改tomcat JAVA_OPTS,添加如下内容
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=GMT+08"
本篇内容在本人个人公众号上也已发布,欢迎关注本人微信公众号“勤菜鸟”。
Ref:
https://blog.lqdev.cn/2018/07/15/docker/docker-time-diff/