乐趣区

关于docker:Docker容器时间如何与宿主机同步问题解决方案小结

前言

如果在启动 Docker 容器的过程中没有独自配置 localtime,很可能造成 Docker 容器工夫与主机工夫不统一的状况,比方 UTC 和 CST 相差 8 小时,换句话来说就是容器工夫与北京工夫相差 8 个小时。

更新历史

2020 年 08 月 13 日 – 初稿

浏览原文 – https://wsgzao.github.io/post…


问题形容

问题:容器工夫与北京工夫相差 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

起因:宿主机设置了时区,而 Docker 容器并没有设置,导致两者相差 8 小时

能够发现,他们相隔了 8 小时

CST 应该是指(China Shanghai Time,东八区工夫)
UTC 应该是指(Coordinated Universal Time,规范工夫)
所以,这 2 个工夫实际上应该相差 8 个小时

所以,必须对立两者的时区

解决方案

docker run 增加工夫参数

-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
# 增加时区环境变量,亚洲,上海
ENV TimeZone=Asia/Shanghai
# 应用软连贯,并且将时区配置笼罩 /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

宿主机间接执行命令给某个容器同步工夫

# 办法 1:间接在宿主机操作
docker cp /etc/localtime【容器 ID 或者 NAME】:/etc/localtime
docker cp -L /usr/share/zoneinfo/Asia/Shanghai【容器 ID 或者 NAME】:/etc/localtime

# 办法 2:登录容器同步时区 timezone
ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime

在实现后,再通过 date 命令进行查看以后工夫
然而,在容器中运行的程序的工夫不肯定能更新过去,比方在容器运行的 mysql 服务,在更新工夫后,通过 sql 查看 mysql 的工夫

select now() from dual;

能够发现,工夫并没有更改过去
这时候必须要重启 mysql 服务或者重启 docker 容器,mysql 能力读取到更改过后的工夫

退出移动版