posts - 52,comments - 30,views - 13万

当我们把服务器部署到docker上,在获取服务器本地时间会发现 获取到的时间比本地时间要早8:00

答:第一反应肯定是检查服务器的当前时区,看当前时区是否正常

       hwclock --show

  #date [-R]                       #查看主机时间
  #timedatectl                           #查看主机时区
  #tzselect                         #选择时区,5 选择亚洲 > 9 选择中国时区 -> 1选择北京时间 -> 1 选择Yes

如果不正常修改方式如下:

修改主机时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime             #上海时间
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime          #上海时间

更新主机时间

date                                      #查看当前系统时间
yum install -y ntpdate                    #安装ntpdate程序
ntpdate cn.pool.ntp.org                   #更新系统时间
date                                      #再次查看当前系统时间    

网络时间服务器

复制代码
复制代码
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
0.cn.pool.ntp.org
1.cn.pool.ntp.org
2.cn.pool.ntp.org
3.cn.pool.ntp.org
复制代码
复制代码

同步BIOS时钟,强制把系统时间写入CMOS

clock --show                         #查看硬件时间
clock -w                             #强制把系统时间写入CMOS
clock --show                         #查看硬件时间
reboot                               #重起机器

设置系统自动同步时间

vi /etc/crontab                            #设置定时任务

00 0 1 * * ntpdate -s cn.pool.ntp.org      --每月一号同步
* */1 * * * ntpdate -s cn.pool.ntp.org     --每一个小时同步

 

当设置完、检查完后发现时间正常时,会不会奇怪倒是哪里出了问题

首先docker 本身就是一个简练的linux docker也是有自己的时区的

大部分 Docker 镜像都是基于 Alpine,Ubuntu,Debian,CentOS 等基础镜像制作而成。

基本上都采用 UTC 时间,默认时区为零时区

基本上都采用 UTC 时间,默认时区为零时区。

docker run --name test --rm -ti alpine /bin/sh
/ # date
Fri Nov 29 08:14:49 UTC 2019

而我们主要用的是 CST 时间,北京时间,位于东八区。时区代号: Asia/Shanghai

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
/ # date
Fri Nov 29 16:13:55 CST 201


对比一下,我们会发现,时间上相差 8 小时。

解决方案:一、制作 Docker 镜像时调整时区

通过编写 Dockerfile,构建自己的 Docker 镜像,可以永久解决时区问题。

1. Alpine

根据《Setting the timezone》提示,我们可以将以下代码添加到 Dockerfile 中:

ENV TZ Asia/Shanghai

RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata

2. Debian

Debian 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中:

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

3. Ubuntu

Ubuntu 基础镜像中没有安装了 tzdata 包,因此我们需要先安装 tzdata 包。

我们可以将以下代码添加到 Dockerfile 中。

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y tzdata \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

4. CentOS

CentOS 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中。

ENV TZ Asia/Shanghai

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

示例如下(放在最下面即可)

 

 

 

二、运行 Docker 容器时调整时区

在 Linux 系统中,控制时区和时间的主要是两个地方:

  • /etc/timezone 主要代表当前时区设置,一般链接指向/usr/share/zoneinfo目录下的具体时区。
  • /etc/localtime 主要代表当前时区设置下的本地时间。

1. 通用 docker 时区修改方案

宿主机为 Linux 系统

当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。

 -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro

使用示例如下:

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
/ # date
Fri Nov 29 16:13:55 CST 2019

2. 通过传递环境变量改变容器时区

  • 适用于基于 Debian 基础镜像, CentOS 基础镜像 制作的 Docker 镜像
  • 不适用于基于 Alpine 基础镜像, Ubuntu 基础镜像 制作的 Docker 镜像

对于基于 Debian 基础镜像,CentOS 基础镜像制作的 Docker 镜像,在运行 Docker 容器时,传递环境变量-e TZ=Asia/Shanghai进去,能修改 docker 容器时区。

-e TZ=Asia/Shanghai

使用示例如下:

docker run --name test -e TZ=Asia/Shanghai --rm -ti debian /bin/bash
/# date
Fri Nov 29 18:46:18 CST 2019

三、进入容器中,修改容器中的配置

Docker时间和宿主同步方法

  1.在run容器时添加参数挂载宿主时间配置:  -v /etc/localtime:/etc/localtime

  2.复制宿主localtime时间配置覆盖:  docker cp /etc/localtime container_id:/etc/localtime

  3.在启动jar包添加时区参数:  -Duser.timezone=GMT+08

Docker容器设置时区

  #docker exec -it container_id /bin/bash            #进入容器命令

  #修改时区,设置为上海时区
  ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  或者
  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Docker设置build参数

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

构建dockerfile镜像.

posted on   白码一号  阅读(390)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示