前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不同Docker操作系统的时区同步

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

原创
作者头像
smooth00
修改于 2020-07-13 02:18:47
修改于 2020-07-13 02:18:47
2.7K00
代码可运行
举报
文章被收录于专栏:smooth性能之光smooth性能之光
运行总次数:0
代码可运行

我们经常会发现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 来获知其系统版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入容器命令行
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 来看具体版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # find /bin |grep busybox
/bin/busybox

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

2. busybox下同步时区

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看是否有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中完成这个工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 需将/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默认也是没有时区文件,也需要安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入容器命令行
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中添加以下内容,完成时区的构建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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下同步时区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入容器命令行
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中添加以下内容,完成时区的构建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

5. centos下同步时区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入容器命令行
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中可以添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' >/etc/timezone

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime
echo 'Asia/Shanghai' >/etc/timezone && docker cp /etc/timezone 容器ID:/etc/timezone

欢迎光临smooth的博客:https://smooth.blog.csdn.net/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
docker 相关问题和快速使用命令
外部虽然修改了时区和时间,但是docker容器中的时间并没有修复,所以需要将外部的文件引入到内部里。
solate
2019/07/22
1.1K0
Docker容器时间不同步,修改Docker时区
今天发现日志服务器采集到的某一个系统的日志时间不对,和实际的时间相差了8个小时,我们估计问题是出在容器的时区的设置上。
齐天小胜
2023/02/13
3.8K0
Docker 时区调整方案
大部分 Docker 镜像都是基于 Alpine,Ubuntu,Debian,CentOS 等基础镜像制作而成。
雪梦科技
2020/05/11
53.2K3
Docker 容器时区问题
kubectl exec -it podName -n namespace /bin/sh
晓晨
2023/01/06
1.1K0
Kubernetes Pod与宿主机时区不同步
在安装Kubernetes集群的过程中并没有注意到pod的时间问题,直到在Tomcat上部署应用后发现pod中的时间与Node上的时间不同步。针对时区不同文章有以下解决方案
废柴阿尤
2023/12/18
7520
Docker/K8s 解决容器内时区不一致方案
本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,通过虚拟机完成 Kubernetes 集群的搭建,以下是安装的软件及版本:
哎_小羊
2019/05/25
4.1K0
linux: 同步容器和宿主机的时区设置, 一种实用的 Docker 配置方法
在容器化的应用部署中,保证容器内的时区与宿主机时区一致是一项常见且重要的需求,特别是在处理日志、定时任务等与时间相关的操作时。本文将探讨如何在使用 Docker 和 Docker Compose 时实现时区的同步,并介绍相关命令和配置方法。
运维开发王义杰
2024/04/26
3.9K0
linux: 同步容器和宿主机的时区设置, 一种实用的 Docker 配置方法
Docker NodeJs 服务模板
由于我的是 NestJs ,每次运行前需要 build, 像 EggJs 可以在脚本里判断 node_modules 存在与否来决定是否需要执行依赖安装等操作。
上山打老虎了
2022/09/07
3860
【云原生 | Docker篇】深入Dockerfile(四)
用 VOLUME 声明了卷,那么以后对于卷内容的修改会被丢弃,所以, 一定在volume声明之前修改内容 ;
Lansonli
2022/05/02
1.6K0
【云原生 | Docker篇】深入Dockerfile(四)
Kubernetes 最佳实践之解决容器内时区不一致问题
业务程序在使用时间的时候(比如打印日志),没有指定时区,使用的系统默认时区,而基础镜像一般默认使用 UTC 时间,程序输出时间戳的时候,就与国内的时间相差 8 小时,如何使用国内的时间呢?本文教你如何解决。
imroc
2024/05/09
1.3K0
Kubernetes 最佳实践之解决容器内时区不一致问题
构建Python Dockerfile的奇淫巧技
最简单的情况下,如果我们使用官方python镜像,构建我们的容器会无敌庞大。因为他帮我们预置了许许多多类库。同时我们直接使用RUN pip install /xxx/requirements.txt安装环境时,每次构建镜像都会从pip仓库里面拉包,也会非常慢。
Ewdager
2020/07/14
9420
Docker教程(九)部署Spring Boot项目
开启Docker远程连接后,在开发和学习时都能带来便利,但请不要将此方式用在外部网络环境,以免带来安全问题,下图是官方警告:
小东啊
2020/07/23
3.4K0
Docker教程(九)部署Spring Boot项目
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2020/10/23
1.9K0
3.Docker学习之Dockerfile
Docker容器学习梳理-容器时间跟宿主机时间同步
在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致。如下: 宿主机时间 [root@slave-1 ~]# date Fri May 12 11:20:30 CST 2017 容器时间 [root@slave-1 ~]# docker exec -ti 87986863838b /bin/bash root@87986863838b:/# date
洗尽了浮华
2018/01/22
2.7K2
alpine 镜像时区调为 Asia/Shanghai 后因 TZ 与 apk del tzdata 导致不生效
设置 TZ 环境变量,并且最后删除 tzdata,创建出来的镜像运行时执行 date 后显示日期还是 UTC 时间。
饶文津
2022/05/11
1.5K0
docker的多阶段构建
如何执行go程序 写一个go的程序: package main import "fmt" func main() {    fmt.Println("hello world") } 在本地的话,我
仙士可
2022/09/13
9340
docker的多阶段构建
Docker启动容器出现No Such File Or Directory排查
dockerfile如下FROM alpineADD test-backend /test-backendRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezoneEXPOSE 7099CMD ["./test-backend", "pro"]使用docker run创建容器后 启动失败分享一下排查思路由于容器秒退 所以docker exec 比较难操作
code-x
2023/03/22
4.2K0
Docker镜像制作实战:设置时区和系统编码
在制作Docker镜像时常用centos的官方镜像作为基础镜像,这些基础镜像的时区和系统编码都不满足我们的需求,我们需要时区CST,系统编码UTF-8,今天我们就来实战制作一个Docker镜像,将时区和系统编码设为我们想要的,今后其他镜像就能以此作为基础镜像,不用再关注时区和系统编码问题了 ;
程序员欣宸
2022/05/09
1.2K0
Docker镜像制作实战:设置时区和系统编码
先来看一下centos官方镜像的情况: 在装好了docker的机器上执行docker run —-name centos001 -idt centos:7,即可启动一个centos官方镜像的容器; 执行命令docker exec -it centos7001 /bin/bash,进入容器内; 执行命令date,可见当前容器时区为UTC,如下:
PHP开发工程师
2022/06/22
1.7K0
【Java】程序制作Docker镜像 推荐方案
随着我们分布式的观念在各个领域使用,docker容器也逐渐的背大家所认可和使用,那么我们想制作容器就得有镜像如何制作镜像呢?请往下看,Dockerfile就是制作镜像的原始武器: Dockerfile由一行行命令语句组成,并且支持用“#”开头作为注释,一般的,Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令。
瑞新
2021/12/06
2K0
【Java】程序制作Docker镜像 推荐方案
推荐阅读
相关推荐
docker 相关问题和快速使用命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验