修改docker容器时间详解
修改docekr容器时间有两种方法:
- 使用挂载/etc/localtime 时间(简单)
- 使用libfaketime进行修改(复杂)
1. 使用映射时间修改
在docker启动的时候,挂载目录,通过修改系统时间从而修改容器时间,需要注意系统时间会影响其他容器
docker run --name mysql -p 3306:3306 -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=2020 -d --restart=always mysql:5.7
注意这一句 -v /etc/localtime:/etc/localtime ,使宿主机时间和docker时间一致
我们只需要通过 date -s “2021-01-21 02:30:16” 修改宿主机时间,通过 docker exec -it mysql date,可以查看两者时间相同
数据库中插入一条数据,也是使用当前时间
注意:修改时间后,经测试,容器不需要重启就会变为当前时间
2. 使用libfaketime
这种修改方式,宿主机时间和容器时间互相不会影响。相当于容器单独模拟出一个时间
如果直接在docker exec -it 进入容器,使用libfaketime运行后进行修改,容器中的服务只有重新运行才会使用该时间。如果重启容器,该时间修改就会失效。通过我们创建容器的时候会运行一个主程序(PID为1),这个程序down调,容器也会挂掉,所以一般通过dockerfile将libfaketime打进新镜像,直接运行镜像。
一般我们容器会有两种基于ubuntu和centos(两个运行命令不一样)
ubuntu:
FROM openjdk:8u212
RUN apt-get update
RUN apt-getinstallgit
RUN git clone https://github.com/wolfcw/libfaketime.git
RUN apt-getinstall -y gcc
RUN apt-getinstall -y make
WORKDIR /libfaketime/src
RUN make&&makeinstall
centos:
FROM mysql:5.7
WORKDIR /
RUN yum update
RUN yum -y installgit
RUN git clone https://github.com/wolfcw/libfaketime.git
RUN yum -y install gcc
WORKDIR /libfaketime/src
RUN make&&makeinstall
然后通过 docker build -t 【镜像名称】:【镜像版本】 ./ ,打包成为新的镜像。
docker run --name test -p -e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 -e FAKETIME="@2000-01-01 10:30:00" -d test:v1
LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
-e FAKETIME=“@2000-01-01 10:30:00”
这两句就是更改时间的,有无@的区别:**"@2000-01-01 10:30:00"时间会递增;“2000-01-01 10:30:00”**时间不会变
还有一个参数:**-e FAKETIME_STOP_AFTER_SECONDS=10** 运行多长时间后停止,停止后时间会恢复为正常时间
也可以用dockr-compose传入参数(environment下面):
注意openjkd:11镜像会导致cpu占用过高,需要更换为其他jdk11版本
版权归原作者 xueluoyouying 所有, 如有侵权,请联系我们删除。