docker 时区8个小时的解决办法
方法一:
在使用docker部署网站的时候,无意间发现容器里面的时间竟然是美国时间,被雷到了,不过解决办法也很简单,有两种办法
1、重新启动一个容器,加上如下参数,即可使用宿主机时间
$ -v /etc/localtime:/etc/localtime:ro # docker run -d -v /etc/localtime:/etc/localtime:ro [image] 1 2、假如,你不想重新启动,或者不能重新启动,也没关系,可以直接把文件复制到容器内,如下
$ docker cp /etc/localtime [containerId]:/etc/localtime 1 3、然后通过date命令查看系统时间
查看本机的
$ date ####### 查看容器的
$ docker exec [containerId] date #######
方法二:
以普通方式运行docker容器
docker run -it --rm --name centos centos /bin/bash
参数说明:
-it: 表示启用一个伪终端,并以交互方式运行 --rm: 表示退出之后立马删除该容器 --name: 表示给容器起一个名字 centos: 表示镜像名称 /bin/bash: 表示运行于bash程序
此时进入容器之后执行修改容器时间的指令date +%T -s "15:03:00"会给出date: cannot set date: Operation not permitted的错误
那么如何才能修改容器的时间呢? 主要是因为有时候需要测试一些定时任务的场景
退出之前的容器, 以如下方式重新进入容器:
docker run -it --cap-add SYS_TIME --rm --name centos centos /bin/bash
进入容器再使用指令`date +%T -s "15:03:00", 修改时间, 此时就可以修改成功了.
这个和之前的方式有什么区别呢?多了--cap-add SYS_TIME参数
由于docker容器的隔离是基于Linux的Capability机制实现的, Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元. 目前Docker容器默认只用到了以下的Capability.
CHOWN, DAC_OVERRIDE, FSETID, FOWNER, MKNOD, NET_RAW, SETGID, SETUID, SETFCAP, SETPCAP, NET_BIND_SERVICE, SYS_CHROOT, KILL, AUDIT_WRITE
而要修改系统时间需要有SYS_TIME权限. 使用 --cap-add, --cap-drop 可以添加或禁用特定的权限.
--privileged参数也可以达到开放权限的作用, 与--cap-add的区别就是, --privileged是将所有权限给容器.
docker使用--privileged, --cap-add, --cap-drop 来对容器本身的能力进行开放或限制.