docker 容器 与 宿主机容器时间问题

docker 容器 与宿主机容器时间

docker 容器与宿主机时间同步问题

容器的默认时间是UTC时间与宿主机的相差8小时

解决进入容器

 export TZ=Asia/Shanghai  #修改时区
  • 创建容器的时候指定启动参数,自动挂载localtime文件到容器内
docker run --name <name> -v /etc/localtime:/etc/localtime:ro  ....
  • 把时区设置加入到Dockerfile中
# CentOS
RUN echo "Asia/shanghai" > /etc/timezone;
# Ubuntu
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改容器时间

测试同学,因为特殊场景,希望更改一下服务对应的容器时间
启动参数 参加   --cap-add SYS_TIME 
参考官方文档https://docs.docker.com/engine/reference/run/

docker run -it --cap-add SYS_TIME --name centos centos:7 /bin/bash 

可以修改了容器时间了, 但是当你修改容器时间 宿主机时间也会随之改变 
尽管这是在测试环境,宿主机的时间更改可也不是闹着玩的呀

仅修改docker容器中的时间,而不影响宿主机的时间


docker 容器都是轻量级的,它们会共享相同的linux内核,而time& date 是kelnel的函数,所有修改docker容器的时间也会造成宿主机时间被修改

在github上有一个libfaketime项目,我们可以使用LD_PRELOAD这个环境变量使date连接这个项目编译的库来“欺骗”应用,达到修改docker容器时间的目的,具体做法:

1.pull项目:


mkdir libfaketime && cd libfaketime && git init  

git pull https://github.com/wolfcw/libfaketime.git

2 使用make命令编译src下的代码,得到动态库文件:/usr/local/lib/faketime/libfaketime.so.1

3 .运行 docker exec -it <containter_id | containter_name> /bin/bash进入容器

4 使用如下命令修改程序运行时的链接,并设置时间为2天前。

export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-2d"

#取消的话, 环境变量设置空

# 时间设置 libfaketime 
#!/usr/bin/env bash
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 
#export FAKETIME="2020-12-24 20:30:00"  #该时间会一直保持不变
export FAKETIME="@2020-12-24 20:30:00"  #时间会从这里往后递增

容器修改时间, 把对应的libfaketime.so.1文件拷贝进去容器
docker cp /usr/local/lib/faketime/libfaketime.so.1 9a5150123100:/usr/local/lib/faketime/
设置为5天前
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-5d"

#从硬件时间获取
hwclock
#硬件时间设置到系统上来
hwclock -s

猜你喜欢

转载自www.cnblogs.com/chengkanghua/p/11058660.html