前言
如果在啟動Docker容器的過程中沒有單獨配置localtime,很可能造成Docker容器時間與主機時間不一致的情況弦聂,比如UTC和CST相差8小時,換句話來說就是容器時間與北京時間相差8個小時。
更新歷史
2020年08月13日 - 初稿
閱讀原文 - https://wsgzao.github.io/post/docker-localtime/
問題描述
問題:容器時間與北京時間相差8個小時
# 查看主機時間
[root@localhost ~]# date
2020年07月27日 星期三 22:42:44 CST
# 查看容器時間
# docker exec -it <containerid> /bin/sh
root@b43340ecf5ef:/# date
Wed Jul 27 14:43:31 UTC 2020
原因:宿主機設置了時區(qū)鲁冯,而Docker容器并沒有設置猜极,導致兩者相差8小時
可以發(fā)現(xiàn)中姜,他們相隔了8小時
CST應該是指(China Shanghai Time,東八區(qū)時間)
UTC應該是指(Coordinated Universal Time跟伏,標準時間)
所以丢胚,這2個時間實際上應該相差8個小時
所以,必須統(tǒng)一兩者的時區(qū)
解決方案
docker run 添加時間參數(shù)
-v /etc/localtime:/etc/localtime
# 實例1
docker run -p 3306:3306 --name mysql -v /etc/localtime:/etc/localtime
# 實例2
docker run \
--detach \
--restart always \
--name 'scribe' \
--publish 11315:11315 \
--mount type=bind,source=/data/gop/,destination=/data/gop/,consistency=consistent \
-v /etc/localtime:/etc/localtime \
wsgzao/facebook-scribe
Dockerfile
# 方法1
# 添加時區(qū)環(huán)境變量受扳,亞洲携龟,上海
ENV TimeZone=Asia/Shanghai
# 使用軟連接,并且將時區(qū)配置覆蓋/etc/timezone
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
# 方法2
# CentOS
RUN echo "Asia/shanghai" > /etc/timezone
# Ubuntu
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
docker-compose
#第一種方式(推薦):
environment:
TZ: Asia/Shanghai
#第二種方式:
environment:
SET_CONTAINER_TIMEZONE=true
CONTAINER_TIMEZONE=Asia/Shanghai
#第三種方式:
volumes:
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
宿主機直接執(zhí)行命令給某個容器同步時間
# 方法1:直接在宿主機操作
docker cp /etc/localtime 【容器ID或者NAME】:/etc/localtime
docker cp -L /usr/share/zoneinfo/Asia/Shanghai 【容器ID或者NAME】:/etc/localtime
# 方法2:登錄容器同步時區(qū)timezone
ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime
在完成后勘高,再通過date命令進行查看當前時間
但是峡蟋,在容器中運行的程序的時間不一定能更新過來坟桅,比如在容器運行的mysql服務,在更新時間后蕊蝗,通過sql查看mysql的時間
select now() from dual;
可以發(fā)現(xiàn)仅乓,時間并沒有更改過來
這時候必須要重啟mysql服務或者重啟docker容器,mysql才能讀取到更改過后的時間