Docker容器时间与宿主机不一致?3个解决方案

当Docker容器时间与宿主机时间不一致时,可以通过挂载`/etc/localtime`或设置环境变量`TZ`来同步时区。本文提供了多种解决方案,包括在`docker run`命令中添加参数、修改`Dockerfile`、使用`docker-compose`以及直接在宿主机上执行命令同步时间。同时,针对挂载`/etc/timezone`报错的问题,给出了错误原因及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

更新历史

问题描述

解决方案

docker run 添加时间参数

Dockerfile解决方案

docker-compose解决方案

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

异常问题

Docker挂载/etc/timezone报错

问题现象


​​​​​​​

前言

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


问题描述

问题:容器时间与北京时间相差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才能读取到更改过后的时间

异常问题

Docker挂载/etc/timezone报错

问题现象

docker run 添加时间参数 -v /etc/timezone:/etc/timezone

或者

在docker-compose中挂载了


volumes:
  - /etc/timezone:/etc/timezone
  - /etc/localtime:/etc/localtime

出现了报错信息 

ERROR: for mysql  Cannot start service mysql: OCI runtime create failed: 

container_linux.go:370: starting container process caused: process_linux.go:459:

 container init caused: rootfs_linux.go:59: mounting "/etc/timezone" to rootfs at "/var/lib/docker/overlay2/5f3d4c825cbbd4b0bb5359c97021e0bfd9ebff887057d6e9da427ebf5c4a3dd1/merged/etc/timezone" 

caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

ERROR: Encountered errors while bringing up the project.

问题解决

原因是centos7.6中/etc/timezone是一个文件夹,而不是一个文件

因此

执行如下命令:
 
echo 'Asia/Shanghai' > /etc/timezone/timezone
 

然后

docker run 添加时间参数 -v /etc/timezone/timezone:/etc/timezone

或者

在docker-compose中挂载了


volumes:
  -/etc/timezone/timezone:/etc/timezone
  - /etc/localtime:/etc/localtime

Docker容器宿主机的销售是指销售用于部署和运行Docker容器的物理或虚拟服务器。随着Docker技术的发展和普及,容器化应用的需求断增加,使得Docker容器宿主机的销售成为一个热门领域。 买家可以通过各种途径购买Docker容器宿主机。他们可以选择购买物理服务器,将其配置成Docker宿主机;或者选择使用云服务商提供的虚拟私有云(VPC)实例作为Docker容器宿主机。根据购买者的需求和预算,他们可以选择同规格和配置的宿主机。一些供应商还提供了成套的容器解决方案,包括硬件设备、软件平台和技术支持等。 对于直接购买物理服务器的买家来说,他们需要选择适合容器化部署的服务器。这些服务器通常具有高性能的CPU和内存,支持虚拟化技术,如Intel VT或AMD-V。此外,服务器上的存储系统也需要具备高速访问和可扩展性,以满足容器化应用对存储的需求。购买者还需要考虑容器化应用的规模和负载特性,以确定适合的服务器数量和规格。 云服务商提供的虚拟私有云实例通常更加灵活和易于管理。购买者可以根据需求选择同规格和配置的虚拟机实例。云服务商还提供了自动化的容器编排和管理工具,如AWS的Elastic Container Service(ECS)或谷歌的Kubernetes,使得容器化应用的部署和管理更加方便。 总之,Docker容器宿主机的销售是一个容器化应用需求紧密相关的市场。购买者可以根据自己的需求选择合适的宿主机,无论是购买物理服务器还是使用云服务商提供的虚拟机实例。这些宿主机可以帮助他们快速部署和运行容器化应用,提高应用的灵活性和可扩展性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值