Docker容器時(shí)間與宿主機(jī)不一致/宿主機(jī)時(shí)間不同步校驗(yàn)問(wèn)題
一、Docker容器時(shí)間與宿主機(jī)不一致
如果在啟動(dòng)Docker容器的過(guò)程中沒(méi)有單獨(dú)配置localtime,很可能造成Docker容器時(shí)間與主機(jī)時(shí)間不一致的情況,比如UTC和CST相差8小時(shí),換句話來(lái)說(shuō)就是容器時(shí)間與北京時(shí)間相差8個(gè)小時(shí)。
問(wèn)題描述
問(wèn)題:容器時(shí)間與北京時(shí)間相差8個(gè)小時(shí)
# 查看主機(jī)時(shí)間 [root@localhost ~]# date 2020年07月27日 星期三 22:42:44 CST # 查看容器時(shí)間 # docker exec -it <containerid> /bin/sh root@b43340ecf5ef:/# date Wed Jul 27 14:43:31 UTC 2020
原因:宿主機(jī)設(shè)置了時(shí)區(qū),而Docker容器并沒(méi)有設(shè)置,導(dǎo)致兩者相差8小時(shí)
- CST應(yīng)該是指(China Shanghai Time,東八區(qū)時(shí)間)
- UTC應(yīng)該是指(Coordinated Universal Time,標(biāo)準(zhǔn)時(shí)間)
所以,這2個(gè)時(shí)間實(shí)際上應(yīng)該相差8個(gè)小時(shí)
所以,必須統(tǒng)一兩者的時(shí)區(qū)
解決方案
方法一:初始化容器時(shí),容器時(shí)間與宿主機(jī)同步,docker run 添加時(shí)間參數(shù)
docker run -itd --privileged=true -v /etc/localtime:/etc/localtime:ro #實(shí)例 docker run -itd \ -e MYSQL_ROOT_PASSWORD=123456 \ -v /home/mysql/data:/var/lib/mysql \ -v /home/mysql/log:/var/log/mysql \ -v /home/mysql/etc/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \ -v /etc/localtime:/etc/localtime:ro \ --name mysql-server \ --network host \ --restart=always \ --privileged=true \ mysql:5.7.37
方法二:Dockerfile解決方案
# 方法1 # 添加時(shí)區(qū)環(huán)境變量,亞洲,上海 ENV TimeZone=Asia/Shanghai # 使用軟連接,并且將時(shí)區(qū)配置覆蓋/etc/timezone RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone # 方法2 # CentOS RUN echo "Asia/shanghai" > /etc/timezone # Ubuntu RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
方法三:docker-compose解決方案
#第一種方式(推薦): environment: TZ: Asia/Shanghai #第二種方式: environment: SET_CONTAINER_TIMEZONE=true CONTAINER_TIMEZONE=Asia/Shanghai #第三種方式: volumes: - /etc/timezone:/etc/timezone - /etc/localtime:/etc/localtime
方法四:正在運(yùn)行的容器,可以宿主機(jī)直接執(zhí)行命令給某個(gè)容器同步時(shí)間
#方法1 直接在宿主機(jī)操作 docker cp /etc/localtime 【容器ID或者NAME】:/etc/localtime docker cp -L /usr/share/zoneinfo/Asia/Shanghai 【容器ID或者NAME】:/etc/localtime #方法2 登錄容器同步時(shí)區(qū)timezone,一般是因?yàn)闀r(shí)區(qū)不同導(dǎo)致時(shí)間差 ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime
在完成后,再通過(guò)date命令進(jìn)行查看當(dāng)前時(shí)間
但是,在容器中運(yùn)行的程序的時(shí)間不一定能更新過(guò)來(lái),比如在容器運(yùn)行的mysql服務(wù),在更新時(shí)間后,通過(guò)sql查看mysql的時(shí)間
select now() from dual;
可以發(fā)現(xiàn),時(shí)間并沒(méi)有更改過(guò)來(lái)
這時(shí)候必須要重啟mysql服務(wù)或者重啟docker容器,mysql才能讀取到更改過(guò)后的時(shí)間
二、宿主機(jī)時(shí)間不同步
ntp時(shí)間服務(wù)器——時(shí)間同步
具體兩種模式:
1、服務(wù)器數(shù)量比較少,可以直接與時(shí)間服務(wù)器同步
2、本地服務(wù)器較多,在本地自建時(shí)間同步服務(wù)器
時(shí)間同步的兩個(gè)命令:
ntpd
:校準(zhǔn)時(shí)間,一點(diǎn)點(diǎn)的校準(zhǔn)過(guò)來(lái)時(shí)間的,最終把時(shí)間慢慢的校正對(duì)。ntpd服務(wù)可以在修正時(shí)間的同時(shí),修正cpu tick。ntpd有一個(gè)自我保護(hù)設(shè)置: 如果本機(jī)與上源時(shí)間相差太大, ntpd不運(yùn)行ntpdate
:不會(huì)考慮其他程序是否會(huì)陣痛,直接調(diào)整時(shí)間,有可能會(huì)對(duì)程序造成影響
ntpdate [-nv] [ IP/hostname] # ntpdate -u 192.168.0.2 # ntpdate -u time.ntp.org # ntpdate -u ntp.sjtu.edu.cn >>/var/log/ntp.log 2>&1;hwclock -w
注釋:-u:指定使用無(wú)特權(quán)的端口發(fā)送數(shù)據(jù)包,可以越過(guò)防火墻與主機(jī)同步,這個(gè)參數(shù)可用可不用,看你自己
理想的做法是:
使用ntpd來(lái)校準(zhǔn)時(shí)鐘,而不是調(diào)整計(jì)算機(jī)時(shí)鐘上的時(shí)間。
在計(jì)算機(jī)剛剛啟動(dòng),但還沒(méi)有啟動(dòng)很多服務(wù)的那個(gè)時(shí)候可以使用ntpdate同步時(shí)間
直接用命令與時(shí)間服務(wù)器進(jìn)行同步
實(shí)例:使用ntpdate 進(jìn)行同步:
ntpdate -u x.x.x.x #這里的x.x.x.x可以是公網(wǎng)時(shí)間服務(wù)器IP地址,也可以是下面兩種我們自建的ntp服務(wù)器地址
#公網(wǎng)時(shí)間服務(wù)器IP地址 #阿里云時(shí)間服務(wù)器 http://time1.aliyun.com http://time2.aliyun.com http://time3.aliyun.com http://time4.aliyun.com http://time5.aliyun.com http://time6.aliyun.com http://time7.aliyun.com time.pool.aliyun.com #centos也有幾個(gè)時(shí)間服務(wù)器(最好還是用國(guó)內(nèi)的吧) 0.centos.pool.ntp.org 1.centos.pool.ntp.org 2.centos.pool.ntp.org
可以加一個(gè)定時(shí)計(jì)劃,定時(shí)同步
注釋:在有時(shí)間同步服務(wù)器的情況下,直接使用該命令就可以讓宿主機(jī)實(shí)現(xiàn)時(shí)間同步
crontab -e */1 * * * * /usr/sbin/ntpdate -u x.x.x.x > /dev/null 2&1
自建ntpd 時(shí)間同步服務(wù)器
NTP通信協(xié)議原理: 首先主機(jī)啟動(dòng)NTP。 客戶端會(huì)向NTP服務(wù)器發(fā)送調(diào)整時(shí)間的message。 然后NTP server會(huì)送出當(dāng)前的標(biāo)準(zhǔn)時(shí)間給client client接受來(lái)自server的時(shí)間后,會(huì)根據(jù)這個(gè)信息來(lái)調(diào)整自己的時(shí)間。這樣就實(shí)現(xiàn)了網(wǎng)絡(luò)對(duì)時(shí)。 #NTP這個(gè)deamon采用了UDP 123端口 遠(yuǎn)程服務(wù)器的層級(jí)(stratum): 由于NTP是層型結(jié)構(gòu),有頂端的服務(wù)器,多層的Relay Server再到客戶端. 所以服務(wù)器從高到低級(jí)別可以設(shè)定為1-16. 為了減緩負(fù)荷和網(wǎng)絡(luò)堵塞,原則上應(yīng)該避免直接連接到級(jí)別為1的服務(wù)器的
1、配置ntp服務(wù)器
1)安裝
# yum -y install ntp
2)開(kāi)機(jī)自啟動(dòng)
# systemctl start ntpd # systemctl enable ntpd
3)修改配置文件:(詳解)
[root@localhost ~]# less /etc/ntp.conf # For more information about this file, see the man pages # ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). driftfile /var/lib/ntp/drift #系統(tǒng)時(shí)間與BIOS事件的偏差記錄 配置與本機(jī)同步的機(jī)器權(quán)限↓ # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery
默認(rèn)拒絕任何操作,任何ip4地址、ip6地址 不能修改、不能trap遠(yuǎn)程登錄、不能嘗試對(duì)等、不能校對(duì)時(shí)間,
restrict 控制相關(guān)權(quán)限。
語(yǔ)法為: restrict [ 客戶端IP ] mask [ IP掩碼 ] [參數(shù)]
其中IP地址也可以是default ,default 就是指所有的IP
參數(shù)有以下幾個(gè):
nomodify
:客戶端不能更改服務(wù)端的時(shí)間參數(shù),但是客戶端可以通過(guò)服務(wù)端進(jìn)行網(wǎng)絡(luò)校時(shí)。notrust
:拒絕沒(méi)有認(rèn)證用戶端noquery
:客戶端不能使用ntpq,ntpc來(lái)查詢ntp服務(wù)器,等于不提供校對(duì)時(shí)間服務(wù)notrap
:不提供trap遠(yuǎn)程登錄功能,trap服務(wù)是一種遠(yuǎn)程時(shí)間日志服務(wù) 拒絕為匹配的主機(jī)提供模式 6 控制消息陷阱服務(wù)。陷阱服務(wù)是 ntpdq 控制消息協(xié)議的子系統(tǒng),用于遠(yuǎn)程事件日志記錄程序。nopeer
:用于阻止主機(jī)嘗試與服務(wù)器對(duì)等kod
: 訪問(wèn)違規(guī)時(shí)發(fā)送 KoD 包,向不安全的訪問(wèn)者發(fā)送Kiss-Of-Death報(bào)文。 restrict -6 表示IPV6地址的權(quán)限設(shè)置。
如何控制客戶的范圍 # Permit all access over the loopback interface. This could #下面的配置 允許運(yùn)行任何權(quán)限的訪問(wèn)在本地接口, # be tightened as well, but to do so would effect some of #這里最好收緊權(quán)限,但是會(huì)影響一些管理功能 # the administrative functions. restrict 127.0.0.1 restrict ::1 # Hosts on local network are less restricted. #配置 給本地局域網(wǎng)絡(luò)配置小一些的權(quán)限 #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 本機(jī)與公共時(shí)間服務(wù)器同步選項(xiàng) 設(shè)定NTP主機(jī)來(lái)源(其中prefer表示優(yōu)先主機(jī)) # Use public servers from the pool.ntp.org project. 使用公共服務(wù)器從 時(shí)間池工程中 # Please consider joining the pool (http://www.pool.ntp.org/join.html). 請(qǐng)考慮加入這個(gè) 時(shí)間池 項(xiàng)目 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst
server host [ key n ] [ version n ] [ prefer ] [ mode n ] [ minpoll n ] [ maxpoll n ] [ iburst ] 其中host是上層NTP服務(wù)器的IP地址或域名,隨后所跟的參數(shù)解釋如下所示: ◆ key: 表示所有發(fā)往服務(wù)器的報(bào)文包含有秘鑰加密的認(rèn)證信息,n是32位的整數(shù),表示秘鑰號(hào)。 ◆ version: 表示發(fā)往上層服務(wù)器的報(bào)文使用的版本號(hào),n默認(rèn)是3,可以是1或者2。 ◆ prefer: 優(yōu)先使用。 ◆ mode: 指定數(shù)據(jù)報(bào)文mode字段的值。 ◆ minpoll: 指定與查詢?cè)摲?wù)器的最小時(shí)間間隔為2的n次方秒,n默認(rèn)為6,范圍為4-14。 ◆ maxpoll: 指定與查詢?cè)摲?wù)器的最大時(shí)間間隔為2的n次方秒,n默認(rèn)為10,范圍為4-14。 ◆ iburst: 當(dāng)初始同步請(qǐng)求時(shí),采用突發(fā)方式接連發(fā)送8個(gè)報(bào)文,時(shí)間間隔為2秒。
#broadcast 192.168.1.255 autokey # broadcast server #broadcastclient # broadcast client #broadcast 224.0.1.1 autokey # multicast server #multicastclient 224.0.1.1 # multicast client #manycastserver 239.255.254.254 # manycast server #manycastclient 239.255.254.254 autokey # manycast client 當(dāng)外部時(shí)間不可用時(shí),以本地(本機(jī))時(shí)間作為服務(wù)時(shí)間,本地時(shí)間以 127.127.1.0 表示 級(jí)別為10 # Undisciplined Local Clock. This is a fake driver intended for backup # and when no outside source of synchronized time is available. #server 127.127.1.0 # local clock #fudge 127.127.1.0 stratum 10 下面是一些加密認(rèn)證的配置 # Enable public key cryptography. #crypto includefile /etc/ntp/crypto/pw # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys # Specify the key identifiers which are trusted. #trustedkey 4 8 42 # Specify the key identifier to use with the ntpdc utility. #requestkey 8 # Specify the key identifier to use with the ntpq utility. #controlkey 8 # Enable writing of statistics records. #statistics clockstats cryptostats loopstats peerstats
一個(gè)簡(jiǎn)單實(shí)例如下:
restrict default kod nomodify notrap nopeer noquery #拒絕所有ip4 的請(qǐng)求 # restrict -6 default kod nomodify notrap nopeer noquery #針對(duì)ipv6設(shè)置 # 允許本地所有操作 restrict 127.0.0.1 #restrict -6 ::1 # 允許的局域網(wǎng)絡(luò)段或單獨(dú)ip 某些權(quán)限 restrict 10.0.0.0 mask 255.0.0.0 nomodify motrap restrict 192.168.0.0 mask 255.255.255.0 nomodify motrap restrict 192.168.1.123 mask 255.255.255.255 nomodify motrap # 使用上層的internet ntp服務(wù)器 restrict cn.pool.ntp.org restrict 1.cn.poo.ntp.org restrict 0.asia.pool.ntp.org restrict 3.asia.pool.ntp.org server cn.pool.ntp.org prefer server 1.cn.poo.ntp.org server 0.asia.pool.ntp.org server 3.asia.pool.ntp.org # 如果無(wú)法與上層ntp server通信以本地時(shí)間為標(biāo)準(zhǔn)時(shí)間 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 driftfile /var/lib/ntp/drift # 計(jì)算本ntp server 與上層ntpserver的頻率誤差 # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys logfile /var/log/ntp.log #日志文件
配置/etc/sysconfig/ntpd文件
ntp服務(wù),默認(rèn)只會(huì)同步系統(tǒng)時(shí)間。如果想要讓ntp同時(shí)同步硬件時(shí)間,可以設(shè)置/etc/sysconfig/ntpd文件,在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 這樣,就可以讓硬件時(shí)間與系統(tǒng)時(shí)間一起同步。
# 允許BIOS與系統(tǒng)時(shí)間同步,也可以通過(guò)hwclock -w 命令
# vim /etc/sysconfig/ntpd # 添加 SYNC_HWCLOCK=yes
4)啟動(dòng)ntpd 服務(wù)
# systemctl start ntpd
查看ntp的端口,可以看到123端口
# netstat -unlnp
查看ntp服務(wù)器有無(wú)和上層連通
# ntpstat synchronised to NTP server (84.16.73.33) at stratum 2 time correct to within 184 ms polling server every 128 s
剛啟動(dòng)的時(shí)候,一般是:
# ntpstat unsynchronised time server re-starting polling server every 64 s
ntptrace -n 127.0.0.1 127.0.0.1: stratum 3, offset -0.001095, synch distance 0.532610 116.193.83.174: timed out, nothing received
查看ntp服務(wù)器與上層ntp服務(wù)器的狀態(tài):ntpq
# ntpq -p # 其中: # remote - 本機(jī)和上層ntp的ip或主機(jī)名,“+”有連線可做候選,“*”正在使用的 # refid - 更上一層的ntp地址 # st - stratum的 級(jí)別 # when - 多少秒前曾經(jīng)同步過(guò)時(shí)間 # poll - 下次更新在多少秒后 # reach - 已經(jīng)向上層ntp服務(wù)器要求更新的次數(shù) # delay - 網(wǎng)絡(luò)延遲 # offset - 時(shí)間補(bǔ)償 # jitter - 系統(tǒng)時(shí)間與bios時(shí)間差 # ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *time4.aliyun.co 10.137.38.86 2 u 111 128 377 27.480 -5.995 1.852
2、配置NTP客戶端
在所有客戶端上vim /etc/ntp.conf,添加:
server x.x.x.x #x.x.x.x 為上面配置的ntp服務(wù)器地址
注意:當(dāng)server與client之間的時(shí)間誤差過(guò)大時(shí)(可能是1000秒),處于對(duì)修改時(shí)間可能對(duì)系統(tǒng)和應(yīng)用帶來(lái)不可預(yù)知的問(wèn)題,NTP將停止時(shí)間同步!
所以如果發(fā)現(xiàn)NTP啟動(dòng)之后時(shí)間并不進(jìn)行同步時(shí),應(yīng)該考慮到可能是時(shí)間差過(guò)大引起的,此時(shí)需要先手動(dòng)進(jìn)行時(shí)間同步 ntpdate !
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker初始化安裝時(shí)的WSL兩個(gè)問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于docker初始化安裝時(shí)的WSL兩個(gè)問(wèn)題,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),對(duì)初學(xué)者學(xué)習(xí)Docker,非常有幫助,需要的朋友可以參考下2023-12-12如何使用Docker部署briefing視頻聊天系統(tǒng)
briefing是一個(gè)開(kāi)源的、安全的直接視頻群聊平臺(tái),這篇文章主要介紹了使用Docker部署briefing視頻聊天系統(tǒng)的詳細(xì)過(guò)程,需要的朋友可以參考下2024-01-01docker swarm 集群創(chuàng)建過(guò)程
通過(guò)docker swarm 工具將一臺(tái)或者多臺(tái)安裝了docker的服務(wù)器組成一個(gè)完整的集群,該集群中的node節(jié)點(diǎn)可以通過(guò)Leader節(jié)點(diǎn)管理,這篇文章主要介紹了docker swarm 集群創(chuàng)建,需要的朋友可以參考下2024-03-03解決Docker啟動(dòng)Elasticsearch7.x報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決Docker啟動(dòng)Elasticsearch7.x報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Docker本地鏡像發(fā)布到阿里云的實(shí)現(xiàn)
本文主要介紹了Docker本地鏡像發(fā)布到阿里云的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07詳解docker中使用systemctl啟動(dòng)服務(wù)報(bào)錯(cuò)的解決辦法
這篇文章主要介紹了詳解docker中使用systemctl啟動(dòng)服務(wù)報(bào)錯(cuò)的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08IDEA中進(jìn)行Docker項(xiàng)目部署的實(shí)現(xiàn)步驟
這篇文章主要介紹了IDEA中進(jìn)行Docker項(xiàng)目部署的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Docker安裝Redis并使用Another?Redis?Desktop?Manager連接的方法
Redis?是一個(gè)使用C語(yǔ)言編寫的、開(kāi)源的(遵守?BSD?協(xié)議)、高性能的、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value的NoSQL數(shù)據(jù)庫(kù),這篇文章主要介紹了Docker安裝Redis并使用Another?Redis?Desktop?Manager連接,需要的朋友可以參考下2022-09-09一文帶大家了解和使用Docker鏡像倉(cāng)庫(kù)
本文主要介紹一下容器鏡像倉(cāng)庫(kù)的使用,包括公有倉(cāng)庫(kù)和自己搭建的私有倉(cāng)庫(kù),文中有詳細(xì)的代碼示例,以及圖解,對(duì)我們了解和使用 Docker 鏡像倉(cāng)庫(kù)有一定的幫助,需要的朋友可以參考下2023-06-06Docker實(shí)踐之python應(yīng)用容器化
這篇文章主要介紹了Docker實(shí)踐之python應(yīng)用容器化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06