Docker容器時(shí)間如何與宿主機(jī)同步問題解決方案小結(jié)

前言

如果在啟動(dòng)Docker容器的過程中沒有單獨(dú)配置localtime,很可能造成Docker容器時(shí)間與主機(jī)時(shí)間不一致的情況,比如UTC和CST相差8小時(shí),換句話來說就是容器時(shí)間與北京時(shí)間相差8個(gè)小時(shí)。

更新歷史

2020年08月13日 - 初稿

閱讀原文 - https://wsgzao.github.io/post/docker-localtime/


問題描述

問題:容器時(shí)間與北京時(shí)間相差8個(gè)小時(shí)

# 查看主機(jī)時(shí)間
[root@localhost ~]# date
2020年07月27日 星期三 22:42:44 CST

# 查看容器時(shí)間
# docker exec -it <containerid> /bin/sh
root@b43340ecf5ef:/# date
Wed Jul 27 14:43:31 UTC 2020

原因:宿主機(jī)設(shè)置了時(shí)區(qū),而Docker容器并沒有設(shè)置,導(dǎo)致兩者相差8小時(shí)

可以發(fā)現(xiàn),他們相隔了8小時(shí)

CST應(yīng)該是指(China Shanghai Time,東八區(qū)時(shí)間)
UTC應(yīng)該是指(Coordinated Universal Time,標(biāo)準(zhǔn)時(shí)間)
所以,這2個(gè)時(shí)間實(shí)際上應(yīng)該相差8個(gè)小時(shí)

所以,必須統(tǒng)一兩者的時(shí)區(qū)

解決方案

docker run 添加時(shí)間參數(shù)

-v /etc/localtime:/etc/localtime

# 實(shí)例1
docker run -p 3306:3306 --name mysql -v /etc/localtime:/etc/localtime

# 實(shí)例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
# 添加時(shí)區(qū)環(huán)境變量,亞洲,上海
ENV TimeZone=Asia/Shanghai
# 使用軟連接,并且將時(shí)區(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

宿主機(jī)直接執(zhí)行命令給某個(gè)容器同步時(shí)間

# 方法1:直接在宿主機(jī)操作
docker cp /etc/localtime 【容器ID或者NAME】:/etc/localtime
docker cp -L /usr/share/zoneinfo/Asia/Shanghai 【容器ID或者NAME】:/etc/localtime

# 方法2:登錄容器同步時(shí)區(qū)timezone
ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime

在完成后,再通過date命令進(jìn)行查看當(dāng)前時(shí)間
但是,在容器中運(yùn)行的程序的時(shí)間不一定能更新過來,比如在容器運(yùn)行的mysql服務(wù),在更新時(shí)間后,通過sql查看mysql的時(shí)間

select now() from dual;

可以發(fā)現(xiàn),時(shí)間并沒有更改過來
這時(shí)候必須要重啟mysql服務(wù)或者重啟docker容器,mysql才能讀取到更改過后的時(shí)間

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容