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