更新时间:2025-07-11 GMT+08:00

设置容器的时区

在使用容器的过程中,如果需要获取系统时间来进行日志记录、数据库存储等操作,容器内部时区不一致的问题可能会导致一系列的困扰。本文提供了多种解决容器内时区不一致问题的方案,请根据实际情况选择合适的方案进行操作。

场景一:容器与节点时区同步

  1. 登录CCE控制台。
  2. 在创建工作负载基本信息页面,开启“时区同步”,即容器与节点使用相同时区。完成其余配置后,创建该工作负载。

    图1 开启时区同步

  3. 登录节点查询时区。

    date -R

    命令行终端显示如下信息:

    Sat, 12 Apr 2025 16:58:47 +0800

  4. 查询容器时区是否与节点保持一致。

    使用kubectl命令查询Pod名称:

    kubectl get pod

    使用kubectl命令进入容器,其中<pod_name>为上一步中查询的Pod名称:

    kubectl exec -it <pod_name> -- /bin/bash

    查询容器时区:

    date -R

    命令行终端显示如下信息:

    Sat, 12 Apr 2025 16:59:23 +0800

场景二:制作容器镜像时指定时区

在构建容器镜像时,您可以在Dockerfile中设置时区文件,以解决单一容器内的时区不一致问题。在后续使用该镜像时,也不会再受到时区问题的困扰。

本文以制作CentOS容器镜像为例,介绍如何在制作容器镜像时指定时区。

  1. 登录一台已安装Docker且支持访问公网的虚拟机。
  2. 执行以下命令,新建Dockerfile文件。

    vim Dockerfile

  3. i切换至编辑模式,写入以下内容,配置时区文件。

    FROM centos
    RUN rm -f /etc/localtime \
    && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

    Esc,输入:wq,保存文件并返回。

  4. 执行以下命令,构建容器镜像。

    docker build -t centos:v1 -f Dockerfile .

  5. 查询当前节点时区。

    date -R

    命令行终端显示如下信息:

    Sat, 12 Apr 2025 17:23:44 +0800

  6. 查询容器时区是否与节点保持一致。

    启动容器镜像并查看容器内时区,其中centos:v1为创建的容器镜像:

    docker run -it centos:v1 /bin/sh

    查询容器时区:

    date -R

    命令行终端显示如下信息:

    Sat, 12 Apr 2025 17:25:13 +0800

场景三:Java容器日志与容器、节点时区同步

开启容器和节点时区同步后,在容器中通过date -R命令获取的容器标准时间与节点保持一致。但是在Java应用中,Java使用系统默认时区来处理日期和时间,日志记录的时间仍可能与容器时间存在时区差异。以下步骤将通过Tomcat容器作为示例,详细介绍如何实现Java容器日志时间与节点时区的同步。

  1. 登录CCE控制台。
  2. 在创建工作负载基本信息页面,开启“时区同步”,即容器与节点使用相同时区。

    图2 开启时区同步

  3. “容器配置 > 环境变量”中添加以下环境变量:

    • 环境变量名称:CATALINA_OPTS
    • 环境变量值:-Duser.timezone=GMT+08

  4. 完成其余配置后,创建该工作负载。
  5. 单击工作负载栏中的“日志”按钮,查看日志中的时区是否与节点/容器同一时区。节点和容器的时区查看方式请参见场景一:容器与节点时区同步