容器的时间问题:

如果想要直接进入容器,使用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是为了将宿主机的内核时间挂载进来与容器共享,因此容器时间更改了,宿主机时间也会跟着更改。

使用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 install

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

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=
                    容器的时间问题:如果想要直接进入容器,使用date -s修改日期,则会出现一个date: cannot set date: Operation not permitted的错误,而且也不会成功。这是由于docker容器的隔离是基于Linux的Capability机制实现的, Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元。目前Docker容器默认只用到了以下的Capability而要修改系统时间需要有SYS_TIME权限。使用 --cap-add, --cap
				
前几天遇到这样一个业务场景,数据库运行在docker docker 的市区是utc 所以就跟北京时间相差8个小时。但是又不能重新运行一个容器,只能保证数据库运行状态,并把宿主的时区复制给docker 容器。很苦恼, 首先我先把宿主的时区改成啦CST 北京时间。然后把宿主的时区复制给docker 容器。命令如下 docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime 当然也可以进入容器进行修改时区(不过我的容器修改的时候总是报/etc/localtime 文件只读,不让修改。所以就用了上面的方法),命令如下 首先添加所有的时区
前几天在测试应用的功能时,发现存入数据库的数据create_time或者update_time字段总是错误,其他数据都是正常的,只有关于时间的字段是错误的。 进入linux服务器查看,也没有任何的异常,然后就觉得可能是docker容器的问题,进入到容器,查看系统时间,果然与宿主时间不同,在网上查了一会儿资料后知道了答案,时区的设置问题,国的时区为东八区,但是和其他国家的可能会不同,如果在创建容器时没有做修改的话,时区可能就不是东八区了,因此会出现这种类似的问题。 处理方法: ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo
docker容器内的程序经常需要访问、调用宿主目录的数据,每次都要导入导出非常麻烦费力。 接下来,一步步实现将宿主的指定文件夹挂载到docker容器。 1. 打开Oracle VM VitualBox: 2. 点击【设置】->点击左侧的【共享文件夹】 3. 双击默认的【c/Users \\?\c:\Users】,进行编辑,这里设置D盘下的data为挂载共享目录,名称可修改,此处设为”data”。 点击确定 4. 重启virtualbox虚拟间有等待时间: 5. 创建容器,测试是否能访问共享目录 基于centos镜像创建name为centos-1的容器,并使用参数-v将D
date: can't set date: Operation not permitted 这是由于docker容器是基于Linux的Capability制来进行隔离。 而修改系统时间是需要有SYS_TIME权限才可以修改,docker容器默认是没有这个权限的。所以我们可以在启动容器的时候,加一个参数 --cap-add SYS_TIME docker run -it --cap-add SYS_TIME --name docke
在使用了Docker以后,因为宿主设置了时区,而Docker容器并且设置,而遇到的一个问题就是Docker容器时间宿主时间不同步,导致两者相差8小时。 接下来,我们通过在在宿主容器里分别执行date命令来看下实际的情况。 在宿主执行date命令的结果: 进入到容器里,再执行date命令的结果: 综上两者时间刚好相差8小时 创建容器的时候指定启动参数,自动挂载local...
    小编最近安装了Linux的虚拟Centos,并在网上找到了学习Linux的网站《Linux就该这么学》,正在跟着里面的教程学习这块的知识,遇到了问题,下面是具体的解决过程。 date命令执行失败     date命令学习时,执行设置系统时间时,出现了这个提示,意思是不允许这个操作。
docker容器修改时间报 date: cannot set date: Operation not permitted是因为没有权限,解决方案是需要在创建容器时就赋予修改权限。 通过dokerfile创建容器docker-compose.yml参考配置如下,主要生效配置是: privileged: true services: virtual1: #image: test_centos7.6.1810 image: auto_kfbspt_image:v1.0 contain
Docker容器修改时间问题 一、问题:docker exec -it ID date -s "2012-08-12 10:30:22"异常,date: cannot set date: Operation not permitted。 二、原因:docker-compose 默认以root用户启容器 由于docker容器的隔离是基于Linux的Capability制实现的, Linux的Capability制允许你将超级用户相关的高级权限划分成为不同的小单元. 目前Docker容器默认只用到了以下的
当Linux的Docker容器无法访问宿主的SSH时,可能有以下几个原因: 1. 防火墙设置问题:检查宿主的防火墙规则,确保SSH服务端口(默认为22)在防火墙规则是开放的。可以使用`sudo iptables -L`命令查看当前的防火墙规则,并使用`sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT`命令添加如不存在的SSH规则。 2. SSH服务是否在运行:确保SSH服务器在宿主上处于运行状态。使用`sudo systemctl status ssh`命令检查SSH服务的状态,如果服务没有启动,可以使用`sudo systemctl start ssh`命令启动SSH服务。 3. 网络配置问题:Docker容器宿主之间的网络配置可能会导致无法访问宿主的SSH。确保Docker网络配置正确,可以尝试重新启动Docker服务以应用网络配置的更改。 4. SSH配置问题:需要检查宿主的SSH配置文件`/etc/ssh/sshd_config`是否正确设置了允许远程访问。打开文件,找到`PermitRootLogin`和`PasswordAuthentication`两个选项,确保它们的值为`yes`,并且没有被注释掉(没有以`#`开头)。 5. SSH密钥问题:确保宿主Docker容器之间的SSH密钥是匹配的。可以使用`ssh-copy-id`命令将宿主的SSH公钥复制到Docker容器,以建立信任关系。 如果上述步骤仍然无法解决问题,可以考虑搜索相关错误信息或者查看Docker容器的日志进行进一步排查。