1、共享主机localtime配置时区
[root@localhost ~]# docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....
创建容器的时候指定启动参数,挂载localtime文件到容器内 ,保证两者所采用的时区是一致的。
2、创建自定义dockerfile配置时区
创建dockerfile文件,其实没有什么内容,就是自定义了该镜像的时间格式及时区。
FROM centos
#设置时区
ENV TZ Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
保存后,利用docker build命令生成镜像使用即可。
3、使用-e TZ="Asia/Shanghai"参数创建容器
[root@localhost ~]# docker run -e TZ="Asia/Shanghai" -d -p 80:80 --name nginx nginx
注:只有在构建镜像配置了时区参考数,使用此参数才能实现时区的设置。
4、修改容器当前时间
在进行操作的时候,我们先确定下时间错误是什么引起的,是时间错误,还是时区问题。如果只是单纯的时间异常,可以直接使用docker exec -it -u root 24795ac94ae7 /bin/sh 进入自己的容器进行修改就行了。要加-u root不然权限会不足,会提示Permission denied。
然后就是直接使用date 命令修改时间就ok。
4.1使用宿主机时区文件替换容器时区文件
4.1.1确认容器时区和时间
[root@localhost ~]# docker exec -it -u root d45e370417ed bash #以root身份进入容器
root@d45e370417ed:/# date -R
root@d45e370417ed:/# ls /usr/share/zoneinfo/Asia #确认时区目录是否存在,不存在创建
root@d45e370417ed:/# mkdir -p /usr/share/zoneinfo/Asia
4.1.2从宿主机传送时文件至容器
回到宿主机,复制宿主机里的文件到容器中
[root@localhost ~]# docker cp /usr/share/zoneinfo/Asia/Shanghai d45e370417ed:/usr/share/zoneinfo/Asia/
4.1.3进入容器替换/etc/localtime文件
[root@localhost ~]# docker exec -it -u root d45e370417ed bash
root@d45e370417ed:~# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@d45e370417ed:~# date -R #查看时区显示时间是否正确
4.1.4重启容器
[root@localhost ~]# docker restart d45e370417
在容器中运行的程序的时间不一定能更新过来,比如在容器运行的MySQL服务,所以需要重启容器。
PS:直接使用宿主机时区文件进行复至容器进行复盖也可以,命令如下:
[root@localhost ~]# docker cp /etc/localtime d45e370417:/etc/localtime
[root@localhost ~]# docker restart d45e370417
4.2通过 -e TZ="Asia/Shanghai"参数重建容器
4.2.1停止容器
[root@localhost ~]# docker stop nginx
4.2.2删除容器
[root@localhost ~]# docker rm nginx
4.2.3通过设置时区参数创建并运行容器
[root@localhost ~]# docker run -e TZ="Asia/Shanghai" -d -p 80:80 --name nginx nginx
4.2.4进入容器shell
[root@localhost ~]# docker exec -it nginx /bin/bash
root@a45e370354ed:~# date -R查看时区
Thu, 17 Nov 2022 14:26:46 +0800