Docker 容器跟服務器時間保持同步

一直以爲docker同步宿主機時間直接docker run 的時候用-p映射是最好的,今天突然發現,原來在dockerfile裏面同步最好,記錄一下

宿主機時間
[root@slave-1 ~]# date
Tue Jul  7 11:45:39 CST 2020
 
容器時間
[root@slave-1 ~]# docker exec -ti 87986863838b /bin/bash
root@87986863838b:/# date                                                                                                                    
Fri Jul  7 03:46:33 UTC 2020
 
發現兩者之間的時間相差了八個小時!
宿主機採用了CST時區,CST應該是指(China Shanghai Time,東八區時間)
容器採用了UTC時區,UTC應該是指(Coordinated Universal Time,標準時間)
 
統一兩者的時區有下面幾種方法
1)共享主機的localtime
創建容器的時候指定啓動參數,掛載localtime文件到容器內,保證兩者所採用的時區是一致的。
# docker run -ti -d --name my-nginx -v /etc/localtime:/etc/localtime:ro  docker.io/nginx  /bin/bash
 
2)複製主機的localtime
[root@slave-1 ~]# docker cp /etc/localtime 87986863838b:/etc/
 
然後再登陸容器,查看時間,發現已經跟宿主機時間同步了
[root@slave-1 ~]# docker exec -ti 87986863838b /bin/bash
root@87986863838b:/# date                                                                                                                    
Tue Jul  7 11:48:39 CST 2020
 
3)創建dockerfile文件的時候,自定義該鏡像的時間格式及時區。在dockerfile文件裏添加下面內容:
......
FROM tomcat
ENV CATALINA_HOME /usr/local/tomcat
.......
#設置時區
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
......
 
保存後,利用docker build命令生成鏡像使用即可,使用dockerfile創建的鏡像的容器改變了容器的時區,
這樣不僅保證了容器時間與宿主機時間一致(假如宿主機也是CST),並且像上面使用tomcat作爲父鏡像的話,
JVM的時區也是CST,這樣tomcat的日誌信息的時間也是和宿主機一致的,
像上面那兩種方式只是保證了宿主機時間與容器時間一致,JVM的時區並沒有改變,
tomcat日誌的打印時間依舊是UTC。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章