不同Docker作業系統的時區同步

2021-10-07 16:09:21 字數 4665 閱讀 9379

cst是指(china shanghai time,東八區時間) 

utc是指(coordinated universal time,標準時間)

這2個時間相差8個小時,一般沒有設定過的容器,跟宿主機時間相差8h,通過date命令就能看出來。雖然這個問題很簡單,但沒人提醒的話,一頓找別的原因,也足以讓很多人抓狂(我在部署docker版的skywalking時就犯了這個錯,怎麼修改配置都看不到監控資料,因為當前收集的資料全變成8小時前的歷史資料了)。

遇到docker時區不一致,我們只需要對其進行同步處理就可以了,但由於docker執行的基礎作業系統不同,或者系統裡沒裝時區工具或是沒有zoneinfo資訊,那麼我們的處理方式就略有不同:

docker常用的作業系統包括busybox、alpine、debian、ubuntu、centos,它們的大小都不一樣,適用的範圍也會有區別,一般由docker中部署的專案特性來決定,映象大小肯定也是優先考慮的因素:

基本上除了busybox,大部分的linux系統都可以通過命令 cat /etc/issue 來獲知其系統版本:

# 進入容器命令列

docker exec -it [container_name | container_id] /bin/sh

##########################################

/ # cat /etc/issue

welcome to alpine linux 3.12

kernel \r on an \m (\l)

##########################################

root@9f1fc6293ff9:/# cat /etc/issue

debian gnu/linux 10 \n \l

#########################################

[root@qa ~]# cat /etc/issue

centos release 6.5 (final)

kernel \r on an \m

對於centos / redhat 可以通過 cat /etc/redhat-release 來看具體版本:

[root@localhost ~]# cat /etc/redhat-release

centos linux release 7.7.1908 (core)

busybox和alpine系統在bin目錄下,可以找到busybox檔案:

/ # find /bin |grep busybox

/bin/busybox

對於docker環境,除了進入容器用以上的命令檢視方式來判斷作業系統版本,有時候可以通過映象檔案dockerfile的images標識或是run命令來判斷(其實不好判斷,一般apk命令是針對alpine,apt-get是針對debian或ubuntu,yum命令是針對centos):

busybox是極度輕量版的作業系統,很多時候沒法安裝時區資料檔案,我們可以採用簡單粗暴方式,直接從宿主機拷。

# 檢視是否有shanghai時區檔案

ls /usr/share/zoneinfo/asia/shanghai

# 如果沒有就需要獲取時區檔案,先進入busybox,如container_id=be318f78137f

docker exec -ti be318f78137f /bin/sh

mkdir -p /usr/share

exit

# 拷貝宿主機的時區檔案到docker中

docker cp /usr/share/zoneinfo be318f78137f:/usr/share/zoneinfo

# 進入busybox,同步時區

docker exec -ti be318f78137f /bin/sh

ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo 'asia/shanghai' >/etc/timezone

同步完時間後,通過date命令就可以看到時間已和宿主機同步。

另外也可以在dockerfile中完成這個工作:

# 需將/usr/share/zoneinfo先拷到dockerfile的目錄下

copy zoneinfo /usr/share/zoneinfo/

run ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo 'asia/shanghai' >/etc/timezone

alpine預設也是沒有時區檔案,也需要安裝:

# 進入容器命令列

docker exec -it [container_name | container_id] /bin/sh

# 安裝 timezone 資料報,為了防止新增失敗,加上-u引數,更新倉儲快取。

apk add -u tzdata

ls /usr/share/zoneinfo

# 拷貝需要的時區檔案到localtime,國內需要的是asia/shanghai:

run ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo 'asia/shanghai' >/etc/timezone

# 驗證時區,cst 即為中國標準時間。

date

# tue jun 30 11:53:46 cst 2020

# 移除時區檔案:

apk del tzdata

另外也可以在dockerfile中新增以下內容,完成時區的構建:

# install root filesystem

add ./rootfs /

# install base packages

run apk update && apk add curl bash tree tzdata \

&& cp -r -f /usr/share/zoneinfo/asia/shanghai /etc/localtime \

&& echo -ne "timezone asia/shanghai. (`uname -rsv`)\n" >> /root/.built

# 進入容器命令列

docker exec -it [container_name | container_id] /bin/bash

# 列出安裝的時區檔案,驗證是否存在tzdata。

ls /usr/share/zoneinfo

# 一般是已經安裝了 timezone 資料報,如未安裝則執行

apt-get install tzdata

# 軟鏈結時區檔案到localtime

ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo 'asia/shanghai' >/etc/timezone

另外也可以在dockerfile中新增以下內容,完成時區的構建:

env tz=asia/shanghai

run ln -snf /usr/share/zoneinfo/$tz /etc/localtime && echo $tz > /etc/timezone

# 進入容器命令列

docker exec -it [container_name | container_id] /bin/bash

# 一般都已經安裝了 timezone 資料報,如遇到未安裝則執行

yum install -y tzdata

# 軟鏈結時區檔案到localtime

ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo 'asia/shanghai' >/etc/timezone

在dockerfile中可以新增:

run ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime \

&& echo 'asia/shanghai' >/etc/timezone

如果你獲取的docker映象沒有root許可權,你又著急馬上進入容器修改時區,那就簡單暴力一點,直接從宿主機拷入時區檔案到docker中,來實現時區的修改:

docker cp /usr/share/zoneinfo/asia/shanghai 容器id:/etc/localtime

echo 'asia/shanghai' >/etc/timezone && docker cp /etc/timezone 容器id:/etc/timezone

不同作業系統上遮蔽oracle的作業系統認證方式

windows系統上 如果不想使用者通過作業系統驗證方式登入,可以修改 sqlnet.ora檔案,把 sqlnet.authentication services nts 前面加 注釋掉就可以了。linux系統上 如果不想使用者通過作業系統驗證方式登入,可以建立乙個 sqlnet.ora 檔案,加上...

作業系統中不同的鎖

鎖是執行緒同步時的乙個重要的工具,然而作業系統中包含了多種不同的鎖,各種鎖之間有什麼不同呢?1 訊號量 semaphore 訊號量分為二元訊號量和多元訊號量,所謂二元訊號量就是指該訊號量只有兩個狀態,要麼被占用,要麼空閒 而多元訊號量則允許同時被n個執行緒占有,超出n個外的占用請求將被阻塞。訊號量是...

不同型別的作業系統

據我了解,作業系統分為 windows windows98,windowsnt,windows2003,windows xp,win7,win8等 unix ibm ax,hp hp ux,sun solaris.bsd.linux 由unix擴充套件而來的。ubuntu,centos,redhat...