我们在使用一些公共镜像的时候,往往不操作build过程,跟自行维护的服务器设置时区还是有所区别的。
那么我们如何既能使用到公共镜像的便利,又能根据自己的需要设置容器的时区呢,下面就介绍相关的方法。
1 使用Date命令
最简单的修改容器时间的方法是在创建容器后使用date命令
docker exec -it container-name /bin/bash
date +%T -s "10:00:00"
时区的变化一般会立即反映出来,但有些时候必须要重启才能生效。
2 使用环境变量
通过设置环境变量也可以设置容器的时区信息
docker run -e TZ=Asia/Shanghai ubuntu date
相应的在docker-compose下
environment:
- TZ=Asia/Shanghai
需要安装时区数据包tzdata
才能使用环境变量设置。通过设置NTP服务器,我们可以确保容器里的时区已经同步。
3 使用 Dockerfile
在主机环境中,或者需要非常多相同容器要运行的时候,最简单的方法是使用Dockerfile。
Dockerfile包含了每个容器最基本的配置信息,要修改Docker容器的时区,我们可以修改相应的Dockerfile.
这些配置信息在容器被重新创建(recreate)时会被反映出来,而且这些在Dockerfile中运行的命令会在root用户下运行。
比如:
RUN echo "Asia/Shanghai" > /etc/timezone
RUN apk add tzdata
安装tzdata包的方式在大部分linux系统下都相同。
我们也可以在entrypoint入口点脚本中包含设置时区的指令,这可以确保无论何时容器重新启动时时区设置都生效。
4 使用volumes卷
使用Docker容器的最大的问题就是在重新启动时,保存的容器中的数据不会被持久化。为了解决这种问题,我们使用
Docker data volumes卷。
数据卷Data volumes可以在docker服务器共享,并且包含容器里面的特定数据。在卷中的数据可以被持久化而不会在
容器重新创建时丢失。
Docker中的文件夹 /usr/share/zoneinfo
包含可以使用的时区信息,把想要的时区信息从这个文件夹拷贝到/etc/localtime
文件就可以设置时区。
我们可以在服务器上设置好时区,然后把这个时区文件通过volume共享到容器里面
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
这样通过在docker-compose中设置的时区信息就会跟服务器达成一致了。
5 使用镜像
有时候在容器数量太大的时候,手动修改时区并不可行,要创建更多相同时区设置的实例的时候,我们可以使用镜像Images。
在给一个容器设置好时区后,退出这个容器,然后用docker commit
从这个容器创建一个新镜像。NTP服务器配置
也可以在镜像里配置好。
docker commit container-name image-name
使用这个镜像,我们就可以创建很多个基于相同时区的容器了,可以保存这个镜像已备将来使用。