**自:
我們知道,使用 docker 容器啟動服務後,如果使用預設 centos 系統作為基礎映象,就會出現系統時區不一致的問題,因為預設 centos 系統時間為 utc 協調世界時 (universal time coordinated),一般本地所屬時區為 cst(+8 時區,上海時間),時間上剛好相差 8 個小時。這就導致了,我們服務啟動後,獲取系統時間來進行相關操作,例如存入資料庫、時間換算、日誌記錄等,都會出現時間不一致的問題,所以很有必要解決掉容器內時區不統一的問題。問題顯示如下:
# 檢視本地時間
$ date
wed mar 6 16:41:08 cst 2019
# 檢視容器內 centos 系統預設時區
$ docker run -it centos /bin/sh
sh-4.2# date
wed mar 6 08:41:45 utc 2019
本次演示環境,我是在虛擬機上安裝 linux 系統來執行操作,通過虛擬機器完成 kubernetes 集群的搭建,以下是安裝的軟體及版本:
可以直接修改dockerfile
,在構建系統基礎映象或者基於基礎映象再次構建業務映象時,新增時區修改配置即可。
$ cat dockerfile.date
from centos
run rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime \
&& echo "asia/shanghai" > /etc/timezone
# 構建容器映象
$ docker build -t centos7-date:test -f dockerfile.date .
sending build context to docker daemon 4.426gb
step 1/2 : from centos
---> 1e1148e4cc2c
step 2/2 : run rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo "asia/shanghai" > /etc/timezone
---> running in fe2e931c3cf2
'/etc/localtime' -> '/usr/share/zoneinfo/asia/shanghai'
removing intermediate container fe2e931c3cf2
---> 2120143141c8
successfully built 2120143141c8
successfully tagged centos7-date:test
$ docker run -it centos7-date:test /bin/sh
sh-4.2# date
wed mar 6 16:40:01 cst 2019
可以看到,系統時間正常了,個人比較推薦這種方式,一勞永逸,只需要一次配置即可,後續在基於此基礎映象製作的映象就可以直接使用了,不需要擔心時區問題。
除了在 dockerfile 中修改配置方式外,我們還可以在容器啟動時通過掛載主機時區配置到容器內,前提是主機時區配置檔案正常。
# 掛載本地 /etc/localtime 到容器內覆蓋配置
$ docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh
sh-4.2# date
wed mar 6 16:42:38 cst 2019
# 或者掛載本地 /usr/share/zoneinfo/asia/shanghai 到容器內覆蓋配置
$ docker run -it -v /usr/share/zoneinfo/asia/shanghai:/etc/localtime centos /bin/sh
sh-4.2# date
wed mar 6 16:42:52 cst 2019
以上兩種方式,其實原理都一樣,在 centos 系統中,/usr/share/zoneinfo/asia/shanghai
和/etc/localtime
二者是一致的,我們一般會將二者軟連線或者直接 cp 覆蓋。
還有一種方式,就是進入到容器內處理,但是此方式有個不好的地方就是,如果容器刪除後重新啟動新的容器,還需要我們進入到容器內配置,非常不方便,所以個人不建議此方式。
# 進入到容器內部配置
$ docker run -it centos /bin/sh
sh-4.2# date
wed mar 6 08:43:29 utc 2019
sh-4.2# rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime
'/etc/localtime' -> '/usr/share/zoneinfo/asia/shanghai'
sh-4.2# date
wed mar 6 16:43:54 cst 2019
在 k8s 集群裡,也會存在因為時區不一致導致的問題,還記得我之前文章中挖出來的坑 配置 ceph object gateway management frontend 中,因為容器時間不一致,導致的報錯。那麼在 k8s 集群裡,如何解決容器時間不統一的問題呢?方式有很多,最一勞永逸的方式還是上邊,在基礎映象或者服務映象裡面直接配置好。其次我們還可以通過掛載主機時間配置的方式解決,針對此方式,我舉個栗子。
$ cat busy-box-test.yaml
apiversion: v1
kind: pod
metadata:
name: busy-box-test
namespace: default
spec:
restartpolicy: onfailure
containers:
- name: busy-box-test
image: busybox
imagepullpolicy: ifnotpresent
volumemounts:
- name: date-config
mountpath: /etc/localtime
command: ["sleep", "60000"]
volumes:
- name: date-config
hostpath:
path: /etc/localtime
注意:如果主機/etc/localtime
已存在且時區正確的話,可以直接掛載,如果本地/etc/localtime
不存在或時區不正確的話,那麼可以直接掛載/usr/share/zoneinfo/asia/shanghai
到容器內/etc/localtime
,都是可行的。 docker k8s修改容器hosts檔案
docker映象本質上是乙個包含了整個作業系統的檔案和目錄的rootfs,使用者製作映象的每一步操作都會生成乙個層,也就是乙個增量的rootfs。docker容器的rootfs由唯讀層,init層和可讀寫層。我們的 etc hosts和 etc resolv.conf等只對當前容器生效的資訊會保留在...
容器內元素float時,容器自動高度的解決方案
先看html 如下 1 div id wrap 2 div id header 3 h1 three colums layout.h1 4div 56 div id content 7 div id main 8 p hello,css html.p 9 p i love this game.p 1...
k8s中解決容器時差問題
解決k8s的pod容器的時差常用的兩種方式 1 通過設定pod 模板中的環境變數 env解決 在pod的模板中新增以下 apiversion v1 kind pod metadata name pod name spec containers name name image image name i...