不同Docker操作系统的时区同步

我们经常会发现docker和宿主机的时间是不同步的,这几乎是个坑,特别是数据库系统,时间错误简直要命。这时间一般是相差8小时,因我们的时间是东八区时间,而docker用的是标准时间:

CST是指(China Shanghai Time,东八区时间) 
UTC是指(Coordinated Universal Time,标准时间)

这2个时间相差8个小时,一般没有设置过的容器,跟宿主机时间相差8h,通过date命令就能看出来。虽然这个问题很简单,但没人提醒的话,一顿找别的原因,也足以让很多人抓狂(我在部署docker版的skywalking时就犯了这个错,怎么修改配置都看不到监控数据,因为当前收集的数据全变成8小时前的历史数据了)。

遇到docker时区不一致,我们只需要对其进行同步处理就可以了,但由于docker运行的基础操作系统不同,或者系统里没装时区工具或是没有zoneinfo信息,那么我们的处理方式就略有不同:

1. Docker常用的运行环境

docker常用的操作系统包括busybox、alpine、debian、ubuntu、centos,它们的大小都不一样,适用的范围也会有区别,一般由docker中部署的项目特性来决定,镜像大小肯定也是优先考虑的因素:

基本上除了busybox,大部分的linux系统都可以通过命令 cat /etc/issue 来获知其系统版本:

# 进入容器命令行
docker exec -it [container_name | container_id] /bin/sh

##########################################
/ # cat /etc/issue
Welcome to Alpine Linux 3.12
Kernel \r on an \m (\l)

##########################################

root@9f1fc6293ff9:/# cat /etc/issue
Debian GNU/Linux 10 \n \l

#########################################

[root@qa ~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

对于CentOS / Redhat 可以通过 cat /etc/redhat-release 来看具体版本:

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

  busybox和alpine系统在bin目录下,可以找到busybox文件:

/ # find /bin |grep busybox
/bin/busybox

对于docker环境,除了进入容器用以上的命令查看方式来判断操作系统版本,有时候可以通过镜像文件dockerfile的images标识或是RUN命令来判断(其实不好判断,一般apk命令是针对alpine,apt-get是针对debian或ubuntu,yum命令是针对centos):

2. busybox下同步时区

busybox是极度轻量版的操作系统,很多时候没法安装时区数据文件,我们可以采用简单粗暴方式,直接从宿主机拷。

# 查看是否有Shanghai时区文件
ls /usr/share/zoneinfo/Asia/Shanghai

# 如果没有就需要获取时区文件,先进入busybox,如container_id=be318f78137f
docker exec -ti be318f78137f /bin/sh
mkdir -p /usr/share
exit
# 拷贝宿主机的时区文件到docker中
docker cp /usr/share/zoneinfo be318f78137f:/usr/share/zoneinfo

# 进入busybox,同步时区
docker exec -ti be318f78137f /bin/sh
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

同步完时间后,通过date命令就可以看到时间已和宿主机同步。

另外也可以在dockerfile中完成这个工作:

# 需将/usr/share/zoneinfo先拷到dockerfile的目录下
COPY zoneinfo /usr/share/zoneinfo/
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

3. alpine下同步时区

alpine默认也是没有时区文件,也需要安装:

# 进入容器命令行
docker exec -it [container_name | container_id] /bin/sh

# 安装 timezone 数据包,为了防止添加失败,加上-U参数,更新仓储缓存。
apk add -U tzdata

# 列出安装的时区文件,验证是否下载成功。
ls /usr/share/zoneinfo

# 拷贝需要的时区文件到localtime,国内需要的是Asia/Shanghai:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# 验证时区,CST 即为中国标准时间。
date
# Tue Jun 30 11:53:46 CST 2020

# 移除时区文件:
apk del tzdata

另外也可以在dockerfile中添加以下内容,完成时区的构建:

# Install root filesystem
ADD ./rootfs /
# Install base packages
RUN apk update && apk add curl bash tree tzdata \
    && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo -ne "timezone Asia/Shanghai. (`uname -rsv`)\n" >> /root/.built

4. debian / ubuntu下同步时区

# 进入容器命令行
docker exec -it [container_name | container_id] /bin/bash

# 列出安装的时区文件,验证是否存在tzdata。
ls /usr/share/zoneinfo
# 一般是已经安装了 timezone 数据包,如未安装则执行
apt-get install tzdata

# 软链接时区文件到localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

另外也可以在dockerfile中添加以下内容,完成时区的构建:

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

5. centos下同步时区

# 进入容器命令行
docker exec -it [container_name | container_id] /bin/bash

# 一般都已经安装了 timezone 数据包,如遇到未安装则执行
yum install -y tzdata

# 软链接时区文件到localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

在dockerfile中可以添加:

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' >/etc/timezone

如果你获取的docker镜像没有root权限,你又着急马上进入容器修改时区,那就简单暴力一点,直接从宿主机拷入时区文件到docker中,来实现时区的修改:

docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime
echo 'Asia/Shanghai' >/etc/timezone && docker cp /etc/timezone 容器ID:/etc/timezone
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
同步Docker容器的时间和宿主机的时间,可以采取以下步骤: 1. 首先,查看宿主机的时间和容器的时间是否一致。可以使用命令`docker exec -ti <container_id> date`来查看容器的时间,使用命令`date`来查看宿主机的时间。如果它们不一致,需要进行时间同步。 2. 一种方法是在运行容器时指定时区,以使容器的时间与宿主机的时间保持一致。例如,可以使用`-v /etc/localtime:/etc/localtime:ro`选项来将宿主机的时区文件(通常是/etc/localtime)挂载到容器中。这样容器就可以共享宿主机的时区设置。 3. 另一种方法是将宿主机的时区文件复制到容器中。可以使用命令`docker cp /etc/localtime <container_id>:/etc/localtime`将宿主机的时区文件复制到容器中。然后,再次执行`docker exec -ti <container_id> date`命令来确认容器的时间是否同步。 需要注意的是,以上方法适用于Linux环境下的Docker容器。对于其他操作系统或虚拟化平台,请参考相应的文档或指南来进行时间同步操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Docker】容器与系统时间同步](https://blog.csdn.net/qq_22227087/article/details/96159034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Docker容器与宿主机设置时间同步](https://blog.csdn.net/IT_ZRS/article/details/112969590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smooth00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值