大虾居

谈笑有鸿儒,往来无白丁。

0%

Docker容器设置时区

我们在使用一些公共镜像的时候,往往不操作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

使用这个镜像,我们就可以创建很多个基于相同时区的容器了,可以保存这个镜像已备将来使用。