更改docker容器中的时间而不影响宿主机

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
函数计算FC,每月15万CU 3个月
简介: 更改docker容器中的时间而不影响宿主机

容器的时间问题:

如果想要直接进入容器,使用date -s修改日期,则会出现一个date: cannot set date: Operation not permitted的错误,而且也不会成功。

这是由于docker容器的隔离是基于Linux的Capability机制实现的, Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元。目前Docker容器默认只用到了以下的Capability

而要修改系统时间需要有SYS_TIME权限。使用 --cap-add, --cap-drop 可以添加或禁用特定的权限。--privileged参数也可以达到开放权限的作用, 与--cap-add的区别就是, --privileged是将所有权限给容器

docker使用--privileged, --cap-add, --cap-drop 来对容器本身的能力进行开放或限制。

那么使用如下命令就可以直接改变时间了:

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

接着进入容器实行date命令修改时间,如果没有修改成功,,那么可能就是因为宿主机做了共享主机的localtime(比如laradock就做了):

docker run --name <name> -v /etc/localtime:/etc/localtime:ro  .... 
docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime

如果修改成功一会就又恢复了,那么就可能要查看一下宿主机是否做了定时校准的任务。

但是如此执行之后,那就是容器时间变更为5月28日之后,宿主机的时间也跟着变更了, 因为上边操作的 --cap-add SYS_TIME是为了将宿主机的内核时间挂载进来与容器共享,因此容器时间更改了,宿主机时间也会跟着更改。

1、场景

使用docker部署了一个后端服务,测试需要改系统时间,如果直接改宿主机时间则会影响到其他的docker(不管是在宿主机上改还是通过–cap-add SYS_TIME参数在docker中修改)。有没有什么既能满足测试要求又不影响其他docker的方法呢?答案就是通过faketime来欺骗docker,达到此目的。

2、安装faketime

github地址:https://github.com/wolfcw/libfaketime

# 安装git
yum -y install git

# 下载faketime源码
git clone https://github.com/wolfcw/libfaketime
# 进入libfaketime文件夹下
cd libfaketime
# 编译源码
make
make install

安装完成后,在/usr/local/lib/下有个kaketime的目录

3、使用

3.1 比如想修改时间为2020-05-01 00:01:00,执行如下命令

export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2020-05-01 00:01:00";

注意:

  • 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
  • 2、时间格式需要正确,否则无法生效
  • 3、docker容器重启后,faketime修改无效
  • 4、此方法修改后的时间将持续保持,即容器时间一致都是设置的时间

3.2 比如想修改时间为5天后,执行如下命令

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

注意:

  • 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
  • 2、5天前(-5d) 5天后(+5d)
  • 3、此方法修改后的时间可变化

3.3 若想要恢复,直接把环境变量修改为空即可

export LD_PRELOAD=
相关文章
|
2天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
8天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
16 1
|
5天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
7天前
|
Cloud Native 持续交付 Docker
深入解析Docker容器化技术及其在生产环境中的应用
深入解析Docker容器化技术及其在生产环境中的应用
10 0
|
8天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
23 0
|
8天前
|
Docker 容器
docker容器内需要执行sudo hwclock --systohc吗
docker容器内需要执行sudo hwclock --systohc吗
|
8天前
|
Shell Docker 容器
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
|
8天前
|
Docker 容器
6-16|docker怎么把容器内的文件传出来
6-16|docker怎么把容器内的文件传出来
|
Shell Linux Docker
Docker和宿主机操作系统文件目录互相隔离的实现原理
Docker和宿主机操作系统文件目录互相隔离的实现原理
244 0
下一篇
无影云桌面